当我知道列名和行ID而没有循环时,如何获取数据表的字段?

时间:2013-11-21 16:34:40

标签: vb.net datatable dataset datatables

如果我知道列名和行ID,如何在不循环的情况下获取数据表的字段?

例如;当Region = City和Product = Legos时,我想要“Total Sold”值。这是我长期以来一直在努力的事情,可能是因为我认为在SQL中如此循环遍历所有时间并不总是看起来像是正确的方法。但是,如果我只是需要学习像VB开发人员那样思考并且总是循环以从列表或表格中获取某些东西,请告诉我。

我有一系列断言比较两个数据表,一个有一行,每个单元有一个命名列(来自SSRS生成的XML),另一个数据表对一个区域中的每个唯一值都有一行(由一个SQL查询)。

SQL(模型数据集)中的表:

Region  Prod  Total Sold
City    Legos   68
State   Legos   90
Nat.    Legos   200
City    ToyB    20
State   ToyB    30
Nat.    ToyB    40
City    ToyC    450
State   ToyC    600
Nat.    ToyC    900

XML表格(从SSRS返回的数据集):

City_Legos  State_Legos  Nat_Legos  City_ToyB  State_ToyB Nat_ToyB City_ToyC State_ToyC 
68          90           200          20           30     40       450        600

从基于XML的数据表获取数据的assert语句部分很简单,因为只有一行(索引0),我只能命名我想要的列:

Dim xmlRow As DataRow = xmlDatatable.Rows(0)
Assert.AreEqual(“my SQL cell goes here”, xmlRow.Field(Of Integer)(“City_Legos”))

我可以为每个指定的列做一个断言。许多列将不会被测试,并且它们具有特定的名称,因此我不能简单地遍历列。那么我应该把“我的SQL单元格”放到这里以返回城市和乐高的总销售额?显然在SQL中很容易:SELECT TOP 1 Total_Sold WHERE Region = City and Prod = Legos。 我正在循环遍历SQL数据表并测试每个单元格以满足我的标准,但是这个逻辑变得很大,因为我必须将每个单元包装成If ...然后,像这样:

For Each m As DataRow In mySqlTable.Rows

If m.Field(Of String)("Prod") = "Legos" Then
    If m.Field(Of String)("Region") = "City" Then
        Assert.AreEqual(m.Field(Of Integer)("TotalSold"), xmlRow.Field(Of Integer)(“City_Legos”))
    End If
    If m.Field(Of String)("Region") = "State" Then
        Assert.AreEqual(m.Field(Of Integer)("TotalSold"), xmlRow.Field(Of Integer)(“State_Legos”))
    End If
    If m.Field(Of String)("Region") = "Nat" Then
        Assert.AreEqual(m.Field(Of Integer)("TotalSold"), xmlRow.Field(Of Integer)(“Nat_Legos”))
    End If
End If
Next

我希望我能做像select或LINQ或Function这样的事情? 这样的事情会很好:

Dim result as Integer =  mySqlTable.Select.First(“Region = City and Prod = Legos“)

或者:

Assert.AreEqual(mySqlTable.Select.First(“Region = City and Prod = Legos“), xmlRow.Field(Of Integer)(“City_Legos”))

这是一个单元测试,因此我将始终知道SSRS返回的列和字段名称。

按列名和行标识符获取单元格一直是我一直在努力的事情,所以希望我终于可以解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用Datatable Compute方法。替换(“我的SQL单元格在这里”与 CInt(mySqlTable.Compute(“SUM([Total Sold])”,“[Region] ='City'和[Prod] ='Legos'”)) 这假设行是唯一的,没有空值。