2010-02-18 2 views
0

У меня есть 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-вызов должен был работать, но это не так.

Может кто-нибудь сказать мне, что это происходит и как это исправить?

спасибо. О, и извините за такой длинный пост.

ответ

0

Ну, после некоторого Googling, я нашел ответ. Виновником была эта линия:

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

код должен выглядеть следующим образом:

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

Это все, что потребовалось, чтобы получить вещи работать правильно. Позор мне не для того, чтобы не поймать ошибку раньше.

Смежные вопросы