【发布时间】:2013-10-21 12:16:49
【问题描述】:
我正在使用 C# 在 Windows 窗体上使用 SqlDataAdapter。我有一个 BindingSource 将其链接到我的字段,并通过功能记录遍历并将更改保存回数据库。
我想让用户选择使用对当前记录的更改来更新数据库,而不是将所做的更改写入其他记录,而是将它们保存在缓存的修改集中(即保存与全部保存)。
我整理了以下可行的(有点):
SqlCommand updateCurrent = new SqlCommand("UPDATE Table SET Attribute = @attribute WHERE ID = @currentRecord", sqlConnection)
updateCurrent.Parameters.AddWithValue("@currentRecord", bindingSource.GetItemProperties(null)["ID"].GetValue(bindingSource.Current));
updateCurrent.Parameters.AddWithValue("@attribute", bindingSource.GetItemProperties(null)["Attribute"].GetValue(bindingSource.Current));
updateCurrent.ExecuteNonQuery();
它的工作原理是更新当前显示的记录(并且仅更新该记录),但是当稍后调用常规更新函数时,它会导致System.Data.DBConcurrencyException(UpdateCommand 影响了预期的 1 条记录中的 0 条)。
我想我明白为什么会发生错误(我对数据库进行了更改,但现在没有反映在缓存副本中),但不知道如何继续。
是否有执行此操作的最佳做法?从一开始就不是一个天生的坏主意吗?
【问题讨论】:
-
听起来你要使用DataTable
-
我实际上首先尝试过(使用
DataViewRowState.ModifiedOriginal从视图创建一个新的DataTable,按ID 删除当前记录的行,使用DataViewRowState.ModifiedCurrent添加当前值,提交@ 987654328@ 到数据库,然后将BindingSource链接表设置回原来的状态。我认为它似乎不必要地复杂(甚至比这更草率)。我想它会避免并发异常 - 我应该给它另一种方法是我刚才描述的方法?
标签: c# sql ado.net bindingsource sqldataadapter