向 DataSet 添加了多条记录,但只有一条记录存储在数据库中 (C#)
Added multiple records to DataSet but only one record is stored in database (C#)
好的,这可能有点长,但请耐心等待。我到处搜索,似乎找不到关于我的特定问题的明确答案。
正如上面的主题所述,我正在使用 DataSet
s 来检索、编辑、插入和更新数据库中的记录。然而,除了插入之外,所有其他功能都按预期工作。发生的事情是,当我将新记录插入数据集中时,一切看起来都很好,因为使用监视功能我可以看到数据集中的新记录。但是在我结束编辑、接受更改并进行更新后,只有一条记录被发送到数据库。请参阅下面的一些代码。我也使用了一些绑定。
代码分为不同的函数,如下所示:SetAdapaterCommands
、FillDataSets
、SendToDatabase
和 BindToUI
。谁能看出有什么不对?
或者我遗漏了有关数据集插入和更新命令工作原理的信息?
我或许还应该说,我正在更新另一位家长 table 在此之前。不确定这是否与它有关。
开始设置适配器命令
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");
这是一个常见的错误。数据集。AcceptChanges changes the RowState of every DataRow in every DataTable of your DataSet to the value DataRowState.Unchanged。
因此,如果您调用 AcceptChanges
,以下对 Update
的调用找不到任何要更新、删除或插入的行。
您应该简单地删除对 AcceptChanges
的调用。
一些背景知识。当您编辑一行时,它的 RowState
更改为 DataRowState.Modified
(对于插入,我们有 DataRowState.Added
,对于删除的行,我们有 DataRowState.Deleted
)
DataAdapter 的更新调用搜索处于这些状态的行,以准备并将相关 UPDATE/INSERT/DELETE 发送到数据存储区。
我认为 AcceptChanges 的名称令人困惑,许多人认为在发送更新之前需要进行此调用,但事实恰恰相反。
好的,这可能有点长,但请耐心等待。我到处搜索,似乎找不到关于我的特定问题的明确答案。
正如上面的主题所述,我正在使用 DataSet
s 来检索、编辑、插入和更新数据库中的记录。然而,除了插入之外,所有其他功能都按预期工作。发生的事情是,当我将新记录插入数据集中时,一切看起来都很好,因为使用监视功能我可以看到数据集中的新记录。但是在我结束编辑、接受更改并进行更新后,只有一条记录被发送到数据库。请参阅下面的一些代码。我也使用了一些绑定。
代码分为不同的函数,如下所示:SetAdapaterCommands
、FillDataSets
、SendToDatabase
和 BindToUI
。谁能看出有什么不对?
或者我遗漏了有关数据集插入和更新命令工作原理的信息?
我或许还应该说,我正在更新另一位家长 table 在此之前。不确定这是否与它有关。
开始设置适配器命令
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");
这是一个常见的错误。数据集。AcceptChanges changes the RowState of every DataRow in every DataTable of your DataSet to the value DataRowState.Unchanged。
因此,如果您调用 AcceptChanges
,以下对 Update
的调用找不到任何要更新、删除或插入的行。
您应该简单地删除对 AcceptChanges
的调用。
一些背景知识。当您编辑一行时,它的 RowState
更改为 DataRowState.Modified
(对于插入,我们有 DataRowState.Added
,对于删除的行,我们有 DataRowState.Deleted
)
DataAdapter 的更新调用搜索处于这些状态的行,以准备并将相关 UPDATE/INSERT/DELETE 发送到数据存储区。
我认为 AcceptChanges 的名称令人困惑,许多人认为在发送更新之前需要进行此调用,但事实恰恰相反。