2016-07-01 4 views
2

OK, cela peut être un peu long, mais s'il vous plaît gardez avec moi. J'ai cherché haut et bas et je n'arrive pas à trouver une réponse claire à propos de mon problème particulier.Ajout de plusieurs enregistrements à DataSet mais un seul enregistrement est stocké dans la base de données (C#)

Comme l'indique le sujet ci-dessus, j'utilise DataSet s pour récupérer, modifier, insérer et mettre à jour des enregistrements dans une base de données. Cependant, toutes les autres fonctions fonctionnent comme prévu sauf l'insertion. Ce qui se passe, c'est que lorsque j'insère de nouveaux enregistrements dans le jeu de données, tout se passe bien car, en utilisant la fonction de surveillance, je peux voir les nouveaux enregistrements dans le jeu de données. Mais après avoir terminé la modification, acceptez les modifications et effectuez la mise à jour, un seul enregistrement est envoyé à la base de données. Voir du code ci-dessous. J'ai aussi utilisé des fixations.

Le code est divisé en différentes fonctions comme suit: SetAdapaterCommands, FillDataSets, SendToDatabase et BindToUI. Quelqu'un peut-il voir quelque chose de mal?

Ou y a-t-il quelque chose sur la façon dont les commandes d'insertion et de mise à jour de l'ensemble de données fonctionnent?

Je devrais peut-être aussi dire que je suis en train de mettre à jour une autre table parent avant celle-ci. Je ne sais pas si cela a quelque chose à voir avec ça.

Commencez la carte commandes

Sélectionnez la commande

#region Select Task Command 
queryString = "SELECT value1, value2, value3 FROM Table1;"; 

taskCommand = new SqlCommand(queryString, connection); 
#endregion Select Task Command 

commande de mise à jour

#region Update Task Command 
queryString = "UPDATE Table1 SET value1 = @value1, value2 = @value2, value3 = @value3" + 
       "WHERE value1 = @value1;"; 

taskUpdateCommand = new SqlCommand(queryString, connection); 

taskUpdateCommand.Parameters.Add("@value1", SqlDbType.Char, 10, "value1"); 
taskUpdateCommand.Parameters.Add("@value2", SqlDbType.Char, 10, "value2"); 
taskUpdateCommand.Parameters.Add("@value3", SqlDbType.VarChar, 50, "value3"); 

taskAdapter.UpdateCommand = taskUpdateCommand; 

SqlParameter taskParameter = taskUpdateCommand.Parameters.Add("@oldValue1", SqlDbType.Char, 10, "value1"); 
taskParameter.SourceVersion = DataRowVersion.Original; 
#endregion Update Task Command 

commande Insérer

#region Insert Task Command 
queryString = "INSERT INTO Table1 (value1, value2, value3) " + 
       "VALUES (@value1, @value2, @value3);"; 

taskInsertCommand = new SqlCommand(queryString, connection); 

taskInsertCommand.Parameters.Add("@value1", SqlDbType.Char, 10, "value1"); 
taskInsertCommand.Parameters.Add("@value2", SqlDbType.Char, 10, "value2"); 
taskInsertCommand.Parameters.Add("@value3", SqlDbType.VarChar, 50, "value3");    

taskAdapter.InsertCommand = taskInsertCommand; 
#endregion Insert Task Command 

adaptateur jeu de fin commandes

données de remplissage mis

private void loadFromDatabase() 
{ 
    #region Load Data and From Database 
    SetAdapterCommands(); 

    #region Load Tasks 
    try 
    { 
     connection.Open(); 
     taskAdapter.SelectCommand = taskCommand; 
     taskAdapter.Fill(Table1DataSet); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
    #endregion Load Tasks 
} 

Envoyer des modifications à la base de données

private void updateDatabase() 
{ 
    try 
    { 
     Table1BindingSource.EndEdit(); 
     Table1DataSet.AcceptChanges(); 
     taskAdapter.Update(Table1DataSet); 
    } 
    catch(System.Exception ex) 
    { 
     MessageBox.Show("Update Failed"); 
    } 
} 

Bind à l'interface utilisateur

textBoxValue1.DataBindings.Add("Text", Table1BindingSource, "value1"); 
textBoxValue2.DataBindings.Add("Text", Table1BindingSource, "value2"); 
textBoxValue3.DataBindings.Add("Text", Table1BindingSource, "value3"); 

Répondre

4

Ceci est une erreur commune. DataSet. AcceptChanges modifie le RowState de chaque DataRow dans chaque DataTable de votre DataSet à la valeur DataRowState.Unchanged.

Donc, si vous appelez AcceptChanges l'appel suivant à Update ne trouve aucune ligne à mettre à jour, supprimer ou insérer.

Vous devez simplement supprimer l'appel à AcceptChanges.

Un peu d'arrière-plan. Lorsque vous modifiez une ligne son RowState est changé en DataRowState.Modified (pour les inserts que nous avons DataRowState.Added et lignes supprimées que nous avons DataRowState.Deleted)

L'appel de mise à jour du DataAdapter recherche les lignes dans ces états pour préparer et envoyer UPDATE/INSERT relatif/DELETE au magasin de données.

Je pense que AcceptChanges a un nom confus et beaucoup de gens pensent que cet appel est nécessaire avant d'envoyer la mise à jour mais c'est tout à fait le contraire.

+1

Merci Steve! Cela a résolu mon problème. J'utilisais les AcceptChanges comme j'utilisais l'exemple de code de deux sources différentes pour résoudre différents problèmes au fur et à mesure que je développais le code. –