.net – 数据源中删除的行的DataAdapter.Fill()行为

我正在使用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的所有行(依赖于我上面未经测试的斜体假设).这些行已在数据源中删除.
>在Fill()之前清除DataTable中的所有相关行;在数据源中删除了未再次显示的任何行.这会丢失使用第一种方法保留的DataRowState.Added和DataRowState.Modified之间的区别.

所以,我的问题:

>我上面的DataAdapter模型是否正确,取决于我在顶部注明的属性值?
>我应该选择哪个选项来查找已删除的行?我更喜欢第一个,但这依赖于我的假设,即所有返回的行都将被设置为DataRowState.Modified,即使行是相同的;这是一个安全的假设吗?
>我是不是错了?

最佳答案 事实证明我的假设是错误的 – 如果SelectCommand返回的行与DataTable中已有的行完全相同,那么该行仍然标记为DataRowState.Unchanged.因此,正确的过程是在调用Fill()之前从DataTable中删除行,并通过将新的DataRowState.Added行集与先前的行列表进行比较来确定行的命运.

点赞