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

本文关键字:ADO NET 记录 单个 SqlDataAdapter 更新 使用 | 更新日期: 2023-09-27 18:36:09

我正在使用 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 条)。

我想我明白为什么会发生错误(我已经对数据库进行了现在未反映在缓存副本中的更改),但不知道如何继续。

是否有执行此操作的最佳实践?一开始就是一个坏主意吗?

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

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

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

YourTableAdapter.Update(yourDataRow);

此命令将更新整个数据表。

YourTableAdapter.Update(yourDataTable);

数据表将知道哪些行已更新,哪些行已保存。

完就在这里吐球了。但:

问题#1我会这样做:如果您在更新发生时保存更新,那么"全部保存"的想法几乎被抛在窗外(无用),因为当一切都已经是最新的时,保存所有内容显然效率低下。...因此,一次更新一个或要求全部保存。

问题

#2(实际抱怨问题)DBConcurrencyException 不是错误,而是抛出的异常(差异),抛出它的唯一原因是没有对数据库进行更新。(因为您已经在按行保存)那么,你为什么要更新呢?你不会。因此,也许空的尝试/捕获将是最好的途径,因为您似乎几乎可以自动保存。

我会这样做的方式(老实说):除非您使用大量数据(假设> 10,000 行),否则我会创建一个"全部保存"函数来更新所有已更改的行(也许使用焦点侦听器并将其添加到列表中或其他东西来找出更改)。如果您想在每次进行编辑时都像您一样保存,请使用 "全部保存"功能 ,在这种情况下只是那 1 行。如果其他人被改变,请全部保存救援。每种方式都有效。

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