我有一个包含多个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调用应该有效,但事实并非如此。
有人可以告诉我这是怎么回事以及如何解决这个问题吗?
谢谢。哦,抱歉这么长的帖子。
答案 0 :(得分:0)
好吧,经过一些谷歌搜索,我找到了答案。罪魁祸首是这一行:
Dim keys() As Object = {rd.MerchantID, rd.ProductID}
代码应如下所示:
Dim keys() as Object = New Object() {rd.MerchantID, rd.ProductID}
这就是让事情正常运转所需的一切。因为没有早点发现错误而感到羞耻。