2011-09-18 2 views
-5

J'utilise un DataAdapter pour remplir un DataSet à partir d'une table avec une clé primaire.Violations de clé primaire ADO.NET DataSet

Si je remplace une valeur dans la colonne de clé primaire par une valeur qui existe déjà dans une autre ligne, je n'obtiens pas d'erreur de violation de clé primaire.

Si j'appelle DataSet.AcceptChanges() après avoir modifié une ligne de façon à ce qu'il y ait maintenant des valeurs de clé primaire en double, il n'y a toujours pas d'erreur de violation de clé primaire.

Pourquoi est-ce?

string sqlcommand = "select * from itemmaster";//itemaster contains id field which is primary key// 

SqlConnection cn = new SqlConnection(connstring); 
cn.Open(); 
SqlCommand cmd = new SqlCommand(sqlcommand, cn); 

SqlDataAdapter da = new SqlDataAdapter(cmd); 

DataSet ds = new DataSet(); 
da.Fill(ds); 

ds.Tables[0].Rows[4]["ID"] = "2"; // value 2 already exists in another row 
+2

Par curiosité, pourquoi fais-tu avec le développement 'DataSet's au lieu d'un ORM? –

+0

S'il vous plaît voir http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts –

+4

Aussi, vous obtiendrez de meilleures réponses si vous montrez du code. Créez un petit exemple qui montre le problème, puis publiez l'exemple ici. –

Répondre

2

Pour garantir le respect des contraintes telles que les contraintes de clé primaire, vous devez dire au DataSet sur le schéma sous-jacent de la source. Pour ce faire, utilisez la méthode FillSchema() avant de remplir votre DataSet:

da.FillSchema(ds, SchemaType.Source); 
da.Fill(ds); 

A DataSet est juste un ensemble déconnecté de données. Lorsque vous insérez, mettez à jour ou supprimez des lignes de votre ensemble de données, vous ne mettez pas réellement à jour la base de données. Vous venez de valider ces modifications sur l'ensemble de données déconnecté. à savoir quand vous faites ceci:

ds.Tables[0].Rows[4].Delete(); 
ds.AcceptChanges(); 

Tout ce que vous avez fait ici est de supprimer une ligne de Table[0] puis engagé ce changement dans la DataSet, pas la base de données elle-même. Pour valider ce changement dans la base de données elle-même, vous devez faire quelque chose de différent.

Vous devez ajouter une "commande de suppression" au DataAdapter. En utilisant votre code comme exemple:

string sqlcommand = "select * from itemmaster";//itemaster contains id field which is primary key// 

SqlConnection cn = new SqlConnection(connstring); 
cn.Open(); 
SqlCommand cmd = new SqlCommand(sqlcommand, cn); 

SqlDataAdapter da = new SqlDataAdapter(cmd); 
SqlCommand deleteCmd = new SqlCommand("DELETE FROM itemmaster WHERE ID = @ID", cn); 
SqlParameter deleteParam = deleteCmd.Parameters.Add("@ID", SqlDbType.Int, 4, "ID"); 
deleteParam.SourceVersion = DataRowVersion.Original; 
da.DeleteCommand = deleteCmd; 

DataSet ds = new DataSet(); 
da.FillSchema(ds, SchemaType.Source, "itemmaster"); 
da.Fill(ds, "itemmaster"); 

ds.Tables[0].Rows[4].Delete(); 

da.Update(ds, "itemmaster"); 

Pour plus d'informations, voir:

Updating Data Sources with DataAdapters

+0

Merci Kev pour votre information utile – funsukvangdu