C# 向数据集中添加了多条记录,但数据库中只存储了一条记录(C)

C# 向数据集中添加了多条记录,但数据库中只存储了一条记录(C),c#,sql-server,dataset,insert-update,updatecommand,C#,Sql Server,Dataset,Insert Update,Updatecommand,好的,这可能有点长,但请容忍我。我到处寻找,似乎找不到关于我的特定问题的明确答案 如上所述,我使用数据集检索、编辑、插入和更新数据库中的记录。但是,除insert外,所有其他函数都按预期工作。发生的情况是,当我将新记录插入数据集中时,所有记录看起来都很好,因为使用“监视”功能,我可以在数据集中看到新记录。但是在我结束编辑、接受更改并进行更新之后,只有一条记录被发送到数据库。请参阅下面的一些代码。我也使用了一些绑定 代码分为以下不同的函数:setAdapaterCommand、FillDataSe

好的,这可能有点长,但请容忍我。我到处寻找,似乎找不到关于我的特定问题的明确答案

如上所述,我使用数据集检索、编辑、插入和更新数据库中的记录。但是,除insert外,所有其他函数都按预期工作。发生的情况是,当我将新记录插入数据集中时,所有记录看起来都很好,因为使用“监视”功能,我可以在数据集中看到新记录。但是在我结束编辑、接受更改并进行更新之后,只有一条记录被发送到数据库。请参阅下面的一些代码。我也使用了一些绑定

代码分为以下不同的函数:setAdapaterCommand、FillDataSet、SendToDatabase和BindToUI。有人看到什么不对劲吗

或者,关于数据集插入和更新命令的工作原理,我是否遗漏了什么

我还应该说,我正在更新另一个父表,而不是这个表。不确定这是否与此有关

启动设置适配器命令

选择命令

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

taskCommand = new SqlCommand(queryString, connection);
#endregion Select Task Command
更新命令

#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
插入命令

#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
端集适配器命令

填充数据集

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
}
将更改发送到数据库

private void updateDatabase()
{
    try
    {
        Table1BindingSource.EndEdit();
        Table1DataSet.AcceptChanges();
        taskAdapter.Update(Table1DataSet);
    }
    catch(System.Exception ex)
    {
        MessageBox.Show("Update Failed");
    }
}
绑定到用户界面

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

这是一个常见的错误。数据集。将数据集的每个DataTable中每个DataRow的值更改为值

因此,如果您调用AcceptChanges,那么下面对Update的调用将找不到任何要更新、删除或插入的行

您只需删除对AcceptChanges的调用

一点背景知识。编辑行时,其行状态更改为DataRowState.Modified for inserts我们有DataRowState.Added,而对于已删除的行,我们有DataRowState.deleted

DataAdapter的更新调用搜索处于这些状态的行,以准备并将相对更新/插入/删除发送到数据存储


我认为AcceptChanges有一个令人困惑的名称,许多人认为在发送更新之前需要这个调用,但事实恰恰相反

谢谢史蒂夫!这解决了我的问题。在开发代码时,我使用AcceptChanges,因为我使用来自两个不同来源的代码示例来解决不同的问题。