sql server -添加多个记录到数据集,但只有一个记录存储在数据库中(c#)

本文关键字:记录 存储 有一个 数据库 添加 server sql 数据集 | 更新日期: 2023-09-27 17:53:45

好吧,这可能有点长,但请原谅我。我到处找,但似乎找不到一个明确的答案。

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

代码分为不同的函数:SetAdapaterCommands, FillDataSets, SendToDatabaseBindToUI。有人看出有什么不对吗?

或者有一些关于数据集插入和更新命令的工作方式,我错过了?

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

开始设置适配器命令

Select命令

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

绑定UI

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

sql server -添加多个记录到数据集,但只有一个记录存储在数据库中(c#)

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

所以如果你调用AcceptChanges,下面调用Update不会找到任何行来更新,删除或插入。

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

一点背景。当你编辑一行时,它的RowState会变成DataRowState.Modified(对于插入,我们有DataRowState.Added,对于删除,我们有DataRowState.Deleted)

DataAdapter的Update调用搜索处于这些状态的行,准备并向数据存储发送相关的Update/INSERT/DELETE操作。

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