2

在我的应用程序中,我有一个向用户显示数据库表内容的控件。此控件保存要在System.Data.DataSet对象中显示的数据。用户可以修改控件中显示的数据,然后在用户完成后将这些数据提交回数据库。

当用户在控件中进行编辑时,当数据库表中的数据被某些外部进程修改(例如,某些行已被更新)时,就会出现问题。暂时忽略数据正确性的问题,我想做的是提交用户在控件中所做的更改并覆盖此外部进程所做的更改。

我正在使用 aSqlDataAdapter来更新数据库。在所描述的用例中,当底层数据库表未被外部进程修改时,SqlDataAdapter.Update将按预期工作。但是,在某些外部进程在用户编辑表时摆弄表的情况下,SqlDataAdapter.Update不会引发异常,而是返回 0 表示没有更新任何行。我已经检查了我的数据集中的行是否具有正确的数据和RowState(即DataRowState.Modified)所以我知道我传递给该SqlDataAdapter.Update方法的数据是正确的。

我想我的问题有两个部分。

  1. 为什么SqlDataAdapter.Update不使用指定的数据集更新数据库?
  2. 为什么它会默默地失败?

我已阅读此博客条目,并且我的代码在任何地方都没有调用AcceptChanges,并且正如我上面所说的,我已经检查了DataSet's RowState,所以我知道这些行被正确标记为具有修改的数据。

4

1 回答 1

1

您的表的结构是什么,您使用的版本控制机制(时间戳、日期时间等)是什么?有很多事情会影响SqlDataAdapter最终处理版本控制的方式,但我的猜测是你要么在表上有一个时间戳,要么有一个SqlCommandBuilder正在生成SqlCommand(通过GetUpdateCommand方法)最终检查所有值的将数据库中的行与您更新的行中的先前值进行对比(DataRow存储行的先前版本以进行比较)。

所有这些都发挥了作用,因为 ADO.NET 将尝试为您维护乐观并发;如果其他人在您上次获取记录后修改了该记录,则不会发生更新。

这显然不是您想要的行为;你想要一个最后获胜的方法。

为此,在SqlDataAdapterUpdateCommand属性显式设置为 aSqlCommand时,它将执行更新而不检查时间戳,它只更新主键等于DataRow您指定的值(或列中的值)的记录有一个独特的约束)。

于 2011-08-11T12:45:55.263 回答