2

我正在SqlDataAdapter使用 C# 处理 Windows 窗体。我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 条)。

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

是否有这样做的最佳实践?开始是一个天生的坏主意吗?

4

2 回答 2

2

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

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

YourTableAdapter.Update(yourDataRow);

此命令将更新整个 DataTable。

YourTableAdapter.Update(yourDataTable);

DataTable 将知道哪一行已更新,哪一行已保存。

于 2013-10-22T06:30:19.170 回答
0

看完就吐个屁在这里。但:

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

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

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

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

于 2013-10-21T18:53:49.703 回答