奇怪的DataTable PrimaryKey行为

时间:2010-02-18 08:10:17

标签: .net-3.5 ado.net

我有一个包含多个DataColumns的DataTable,其中两个作为主键(想想Northwind数据库中的OrderDetails)。这是它的样子:

Dim tblPM As New DataTable("ProductMerchant")
Dim dc As DataColumn
With tblProducts
 dc = .Columns.Add("merchantID", GetType(Byte))
 dc = .Columns.Add("productID", GetType(Integer))
 dc = .Columns.Add("listPrice", GetType(Decimal))
 dc = .Columns.Add("ourPrice", GetType(Decimal))
 .PrimaryKey = New DataColumn() {.Columns(0), .Columns(1)}
End With

确定。此表填充了匿名类型的数据。我所做的是检查DataTable是否已包含主键。如果是,那么我不添加数据。我是这样做的:

'now add data to tblPM
'note that data has already been retrieved and placed in the items variable
For Each rd In items
 Dim keys() As Object = {rd.MerchantID, rd.ProductID}
 If tblPM.Rows.Contains(keys) Then
  'do not add
 Else
  tblPM.Rows.Add(New Object() {rd.MerchantID, rd.ProductID, rd.ListPrice, rd.OurPrice})
 End If
Next

确定。还在我这儿?好。

因此,我将数据添加到DataTable,将其保存到数据库,并检查是否一切正常。好吧,我发现有些数据没有添加到表中,看起来DataTable的主键是罪魁祸首。似乎主键使用指定的DataColumns作为两个单独的键而不是一个键。这就是我的意思。

如果我使用上面的For Each ... Next语句将其添加到我的DataTable中

tblPM.Rows.Add(New Object() {"15", "223344", 30.50, 25})
一切都很好。但是,如果我尝试添加

tblPM.Rows.Add(New Object() {"56", "223344", 30.50, 25})

在上一次添加之后,它不会添加到DataTable中。与第一个示例相同的数据,只有商家ID不同。它是一个不同的密钥,但它没有添加到表中。嗯...

发生了什么事?我认为DataTable的主键中的两个DataColumns都充当了一个键。第二个.Add调用应该有效,但事实并非如此。

有人可以告诉我这是怎么回事以及如何解决这个问题吗?

谢谢。哦,抱歉这么长的帖子。

1 个答案:

答案 0 :(得分:0)

好吧,经过一些谷歌搜索,我找到了答案。罪魁祸首是这一行:

Dim keys() As Object = {rd.MerchantID, rd.ProductID}

代码应如下所示:

Dim keys() as Object = New Object() {rd.MerchantID, rd.ProductID}

这就是让事情正常运转所需的一切。因为没有早点发现错误而感到羞耻。