Странное DataTable PrimaryKey Поведение - PullRequest
0 голосов
/ 18 февраля 2010

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

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

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

1 Ответ

0 голосов
/ 19 февраля 2010

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

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

Код должен выглядеть так:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...