J'ai un DataTable qui contient plusieurs DataColumns, dont deux agissent comme clé primaire (pensez à OrderDetails de la base de données Northwind). Voici à quoi il ressemble: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. Cette table est remplie avec des données d'un type anonyme. Ce que je fais est de vérifier si le DataTable contient déjà la clé primaire. Si c'est le cas, je n'ajoute pas les données. Voici comment je le fais:
'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. Encore avec moi? Bien. Donc, j'ajoute des données au DataTable, je l'enregistre dans la base de données et je vérifie si tout va bien. Eh bien, j'ai découvert que certaines des données ne sont pas ajoutées à la table et il semble que la clé primaire de DataTable est le coupable. Il semble que la clé primaire utilise les DataColumns spécifiés en tant que deux clés distinctes au lieu d'une clé. Voici ce que je veux dire.
Si je l'a ajouté à mon DataTable en utilisant la ci-dessus pour Each ... Next
tblPM.Rows.Add(New Object() {"15", "223344", 30.50, 25})
tout va bien. Mais si j'essaie d'ajouter
tblPM.Rows.Add(New Object() {"56", "223344", 30.50, 25})
après l'ajout précédent, il n'est pas ajouté au DataTable. Même données que le premier exemple, seul le merchantID est différent. C'est une clé différente, mais elle n'est pas ajoutée à la table. Hmm ....
Que se passe-t-il? Je pensais que les deux DataColumns dans la clé primaire de DataTable agissaient comme une seule clé. Le deuxième appel .Add aurait dû fonctionner mais ce n'est pas le cas. Quelqu'un peut-il me dire ce qui se passe et comment y remédier?
Merci. Oh, et désolé pour un si long post.