【问题标题】:Added multiple records to DataSet but only one record is stored in database (C#)向 DataSet 添加了多条记录,但只有一条记录存储在数据库中(C#)
【发布时间】:2016-11-04 02:52:34
【问题描述】:

好的,这可能有点长,但请多多包涵。我搜索了高低,我似乎无法找到关于我的特定问题的明确答案。

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

代码分为不同的功能如下:SetAdapaterCommandsFillDataSetsSendToDatabaseBindToUI。有人能看出有什么不对吗?

或者我缺少关于数据集插入和更新命令如何工作的一些东西?

我也许还应该说我正在更新另一个父表之前的另一个父表。不知道有没有关系。

开始设置适配器命令

选择命令

#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");

【问题讨论】:

    标签: c# sql-server dataset insert-update updatecommand


    【解决方案1】:

    这是一个常见的错误。 DataSet.AcceptChanges 将 DataSet 的每个 DataTable 中每个 DataRow 的 RowState 更改为值 DataRowState.Unchanged

    因此,如果您调用 AcceptChanges,则对 Update 的以下调用不会找到任何要更新、删除或插入的行。

    您应该简单地删除对AcceptChanges 的调用。

    一点背景。当您编辑一行时,其RowState 更改为DataRowState.Modified(对于插入,我们有DataRowState.Added,对于删除的行,我们有DataRowState.Deleted

    DataAdapter 的 Update 调用搜索处于这些状态的行以准备并将相关的 UPDATE/INSERT/DELETE 发送到数据存储。

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

    【讨论】:

    • 谢谢史蒂夫!这解决了我的问题。我正在使用 AcceptChanges,因为我在开发代码时使用了来自两个不同来源的代码示例来解决不同的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多