У меня есть DataTable, который содержит несколько DataColumns, два из которых выступают в качестве первичного ключа (думаю, OrderDetails из базы данных Northwind). Вот как это выглядит:Strange DataTable PrimaryKey Behavior
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
Ok. Эта таблица заполняется данными анонимного типа. Что я делаю, так это проверить, содержит ли в 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
Ok. Все еще со мной? Хорошо.
Итак, я добавляю данные в DataTable, сохраняю их в базе данных и проверяю, все ли хорошо. Хорошо, я обнаружил, что некоторые данные не добавлены в таблицу, и кажется, что основным ключом DataTable является преступник. Кажется, что первичный ключ использует указанные DataColumns как два отдельных ключа вместо одного ключа. Вот что я имею в виду.
Если я добавил это в моей DataTable с помощью выше For Each ... Next
tblPM.Rows.Add(New Object() {"15", "223344", 30.50, 25})
все хорошо. Но если я попытаюсь добавить
tblPM.Rows.Add(New Object() {"56", "223344", 30.50, 25})
после предыдущего добавления он не добавляется в DataTable. Те же данные, что и в первом примере, отличаются только от идентификатора продавца. Это другой ключ, но он не добавляется в таблицу. Hmm ....
Что происходит? Я думал, что оба DataColumns в первичном ключе DataTable действуют как один ключ. Второй .Add-вызов должен был работать, но это не так.
Может кто-нибудь сказать мне, что это происходит и как это исправить?
спасибо. О, и извините за такой длинный пост.