gpt4 book ai didi

c# - 向 DataSet 添加了多条记录,但只有一条记录存储在数据库中 (C#)

转载 作者:行者123 更新时间:2023-11-30 20:35:20 27 4
gpt4 key购买 nike

好吧,这可能有点长,但请耐心等待。我到处搜索,似乎找不到关于我的特定问题的明确答案。

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

代码分为以下不同的函数: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");
}
}

绑定(bind)到用户界面

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

最佳答案

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

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

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

一些背景知识。当您编辑一行时,它的 RowState 会更改为 DataRowState.Modified(对于插入,我们有 DataRowState.Added,对于删除的行,我们有 DataRowState.Deleted)

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

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

关于c# - 向 DataSet 添加了多条记录,但只有一条记录存储在数据库中 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38149715/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com