我正在使用DataSet
/DataTable
/DataAdapter
在数据库和我的模型对象之间进行协调的体系结构,这些对象有自己的支持(它们不受 DataRow 支持)。我有一个DataAdapter
with AcceptChangesDuringFill = False
, AcceptChangesDuringUpdate = False
, and FillLoadOption = OverwriteChanges
。这是我的理解DataAdapter
在这些条件下的模型:
数据适配器.Update()
-
DataRowState.Added
将导致InsertCommand
firing
-
DataRowState.Modified
将导致UpdateCommand
firing
-
DataRowState.Deleted
将导致DeleteCommand
firing
数据适配器.Fill()
- 返回结果集中的任意行,其主键对应于
DataTable
将用于更新该行,并且该行的状态将始终变为DataRowState.Modified
, 即使返回的行与当前行相同
- 返回结果集中主键不对应于任何现有行的任何行将用于创建新行,并且该行的状态将变为
DataRowState.Added
- 中的任意行
DataTable
与返回结果集中的行不对应的将保留在DataRowState.Unchanged
鉴于我的思维模型是正确的,假设我想使用Fill()
以注意数据源中已删除的行。另外,假设参数SelectCommand
不要返回整个表。我想我有两个选择:
- 找到所有应该被更新的行
Fill()
但仍然DataRowState.Unchanged
(依赖于我上面未经测试的斜体假设)。这些行已在数据源中删除。
- 清除所有相关行
DataTable
之前Fill()
;任何不再显示的行都已在数据源中删除。这失去了之间的区别DataRowState.Added
and DataRowState.Modified
使用第一种方法保留。
所以,我的问题是:
- 是我上面的型号吗
DataAdapter
是否正确,取决于我在顶部注明的属性值?
- 我应该使用哪个选项来查找已删除的行?我更喜欢第一个,但这依赖于我的假设,即所有返回的行都将设置为
DataRowState.Modified
即使行相同;这是一个安全的假设吗?
- 我这一切都错了吗?
事实证明我的假设是错误的——如果SelectCommand
与已经存在于中的行完全相同DataTable
,该行仍然标记为DataRowState.Unchanged
。所以正确的过程是从DataTable
打电话之前Fill()
,并通过比较新的一组来确定一行的命运DataRowState.Added
rows 到前一个行列表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)