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