使用ADO.NET SqlDataAdapter更新单个记录

时间:2013-10-21 12:16:50

标签: c# sql ado.net bindingsource sqldataadapter

我正在使用C#在Windows窗体上使用SqlDataAdapter。我有BindingSource将其链接到我的字段,并进行功能记录遍历并将更改保存回数据库。

我想让用户选择更新当前记录的数据库,而不是将其写入其他记录,而是将其保存在缓存修改集中(即Save vs. Save All)。

我把以下内容放在一起(有点):

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条)。

我想我理解为什么会发生错误(我已经对数据库进行了更改,而这些更改现在没有反映在缓存副本中),而不是如何继续。

这样做有最好的做法吗?一开始是不是一个坏主意?

2 个答案:

答案 0 :(得分:2)

为了存档您想要的内容,您需要做的就是:

此命令将使用此特定行(yourDataRow)的内容更新数据库。

YourTableAdapter.Update(yourDataRow);

此命令将更新整个DataTable。

YourTableAdapter.Update(yourDataTable);

DataTable将知道哪些行已更新以及哪些已保存。

答案 1 :(得分:0)

看一看之后,只是在这里吐痰。但是:

问题#1 我会这样做:如果你正在保存更新,那么“全部保存”的想法几乎被抛出窗口(无用),因为当所有内容都已更新时,保存所有内容显然效率低下。 ...因此,一次更新一个或需要全部保存。

问题#2(实际抱怨问题) DBConcurrencyException不是错误,它是抛出异常(差异),抛出它的唯一原因是因为没有对数据库进行更新。 (因为你已经连续保存了)所以为什么你会有更新?你不会。所以也许一个空的尝试/捕获将是最好的路线,因为你似乎几乎自动保存。

我会这样做(老实说): 除非您正在使用大量数据(比如说> 10,000行),否则我将创建一个“全部保存”功能,该功能会更新所有已更改的行(可能使用焦点侦听器并将其添加到列表或其他内容中找出变化)。如果您想在每次进行编辑时保存,那么请使用“全部保存”功能,在这种情况下只需要1行。如果其他人改变了,请救救所有人。以各种方式工作。

添加额外奖励:使用缓存副本实际上是一个愚蠢的想法。 (除非你的电脑是野兽)就像我说的小数据一样,完全没问题。但是让我们想象一下1,000,000行的数据库。现在尝试缓存1,000,000行...没有你正确比较会更快,但将所有不需要的数据加载到内存中是一个可怕的想法。缩放时你的程序会崩溃。