我正在使用DataSet / DataTable / DataAdapter体系结构在数据库和模型对象之间进行中介,它们具有自己的支持(它们没有DataRow的支持)。我有一个DataAdapterAcceptChangesDuringFill = FalseAcceptChangesDuringUpdate = FalseFillLoadOption = 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.AddedDataRowState.Modified之间的区别。


所以,我的问题是:


我上面的DataAdapter模型是否正确,并遵守我在顶部指出的属性值?
我应该选择哪个选项来查找已删除的行?我希望使用第一个,但这是基于我的假设,即即使该行相同,所有返回的行都将设置为DataRowState.Modified;这是一个安全的假设吗?
我要把这都弄错了吗?

最佳答案

原来,我的假设是错误的-如果SelectCommand返回的行与DataTable中已经存在的行完全相同,则该行仍标记为DataRowState.Unchanged。因此,正确的过程是在调用DataTable之前从Fill()中删除​​行,并通过将新的DataRowState.Added行集与以前的行列表进行比较来确定行的命运。

08-18 02:24