2010-02-18 5 views
0

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.

Répondre

0

Eh bien, après quelques recherches sur Google, j'ai trouvé la réponse. Le coupable était cette ligne:

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

Le code devrait ressembler à ceci:

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

C'est tout ce qu'il fallait pour faire fonctionner les choses. Honte à moi de ne pas avoir rattrapé l'erreur plus tôt.