好吧这可能有点长,但请耐心等待。我搜索得很高,我似乎无法找到关于我的特定问题的明确答案。
正如上述主题所述,我使用DataSet
来检索,编辑,插入和更新数据库中的记录。但是除了插入之外,所有其他功能都按预期工作。会发生的事情是,当我将新记录插入数据集时,所有看起来都很好,因为使用监视功能我可以看到数据集中的新记录。但是在我结束编辑后,接受更改并进行更新,只有一条记录被发送到数据库。请参阅下面的代码。我也使用了一些绑定。
代码分为不同的功能,如下所示:SetAdapaterCommands
,FillDataSets
,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");
}
}
绑定到UI
textBoxValue1.DataBindings.Add("Text", Table1BindingSource, "value1");
textBoxValue2.DataBindings.Add("Text", Table1BindingSource, "value2");
textBoxValue3.DataBindings.Add("Text", Table1BindingSource, "value3");
答案 0 :(得分:4)
这是一个常见的错误。 DataSet。AcceptChanges将DataSet的每个DataTable中的每个DataRow的RowState更改为值DataRowState.Unchanged。
因此,如果您致电AcceptChanges
,以下对Update
的调用并未找到要更新,删除或插入的行。
您只需删除对AcceptChanges
的调用。
一点背景知识。当您修改一行时,其RowState
更改为DataRowState.Modified
(对于我们有DataRowState.Added
的插页,对于已删除的行,我们有DataRowState.Deleted
)
DataAdapter的Update调用搜索这些状态中的行以准备并将相对UPDATE / INSERT / DELETE发送到数据存储区。
我认为AcceptChanges有一个令人困惑的名字,许多人认为在发送更新之前需要进行此调用,但事实恰恰相反。