我正在使用DataSet
/ DataTable
/ DataAdapter
体系结构在数据库和模型对象之间进行中介,它们具有自己的支持(它们没有DataRow的支持)。我有一个DataAdapter
和AcceptChangesDuringFill = False
,AcceptChangesDuringUpdate = False
和FillLoadOption = OverwriteChanges
。这是我在以下情况下对DataAdapter
模型的理解:
DataAdapter.Update()DataRowState.Added
将导致InsertCommand
触发DataRowState.Modified
将导致UpdateCommand
触发DataRowState.Deleted
将导致DeleteCommand
触发
DataAdapter.Fill()
返回结果集中主键与DataTable
中现有行相对应的任何行将用于更新该行,即使返回的行与当前行相同,该行的状态也始终变为DataRowState.Modified
返回结果集中主键与任何现有行都不匹配的任何行将用于创建新行,并且该行的状态将变为DataRowState.Added
DataTable
中与返回结果集中的任何行都不对应的任何行将保留在DataRowState.Unchanged
鉴于我对这种思维模型是正确的,假设我想使用Fill()
注意到数据源中已删除的行。另外,假设SelectCommand
的参数没有返回整个表。我猜我有两个选择:
查找所有应该由Fill()
更新但仍为DataRowState.Unchanged
的行(取决于我上面未经测试的斜体假设)。这些行已在数据源中删除。
在DataTable
之前清除Fill()
中的所有相关行;数据源中已删除的所有不再显示的行。这失去了第一个方法保留的DataRowState.Added
和DataRowState.Modified
之间的区别。
所以,我的问题是:
我上面的DataAdapter
模型是否正确,并遵守我在顶部指出的属性值?
我应该选择哪个选项来查找已删除的行?我希望使用第一个,但这是基于我的假设,即即使该行相同,所有返回的行都将设置为DataRowState.Modified
;这是一个安全的假设吗?
我要把这都弄错了吗?
最佳答案
原来,我的假设是错误的-如果SelectCommand
返回的行与DataTable
中已经存在的行完全相同,则该行仍标记为DataRowState.Unchanged
。因此,正确的过程是在调用DataTable
之前从Fill()
中删除行,并通过将新的DataRowState.Added
行集与以前的行列表进行比较来确定行的命运。