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");
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. –