我正在使用DataSet
/ DataTable
/ DataAdapter
架构在数据库和我的模型对象之间进行调解,这些对象有自己的支持(它们不受DataRow支持) )。我有一个DataAdapter
AcceptChangesDuringFill = False
,AcceptChangesDuringUpdate = False
和FillLoadOption = OverwriteChanges
。以下是我在这些条件下对DataAdapter
模型的理解:
DataRowState.Added
将导致InsertCommand
解雇DataRowState.Modified
将导致UpdateCommand
解雇DataRowState.Deleted
将导致DeleteCommand
解雇DataTable
中现有行的任何行都将用于更新该行,该行的状态将始终为DataRowState.Modified
,甚至如果返回的行与当前行相同 DataRowState.Added
DataTable
中与返回结果集中的行不对应的任何行都将保留在DataRowState.Unchanged
鉴于我对这个心智模型是正确的,假设我想使用Fill()
来注意数据源中已删除的行。另外,假设SelectCommand
的参数不返回整个表。我猜我有两个选择:
Fill()
更新但仍为DataRowState.Unchanged
的所有行(依赖于我上面未经测试的斜体假设)。这些行已在数据源中删除。DataTable
之前Fill()
的所有相关行;在数据源中删除了未再次显示的任何行。这会丢失使用第一种方法保留的DataRowState.Added
和DataRowState.Modified
之间的区别。所以,我的问题:
DataAdapter
模型是否正确,是否符合我在顶部注明的属性值?DataRowState.Modified
;这是一个安全的假设吗?答案 0 :(得分:1)
事实证明我的假设是错误的 - 如果SelectCommand
返回的行与DataTable
中已有的行完全相同,则该行仍标记为DataRowState.Unchanged
。因此,正确的过程是在调用DataTable
之前从Fill()
中删除行,并通过将新的DataRowState.Added
行集与前一行列表进行比较来确定行的命运。
答案 1 :(得分:1)
我看到了类似的问题,但我无法使用.Clear
,因为DataTable
绑定到用户界面列表,.Clear
后跟.Fill
会导致列表丢失用户当前的选择。因此,我实施了一个(丑陋的)解决方法,基本上由
.Fill
换句话说:
For Each drow As DataRow In dset.Tables(0).Rows
drow.Item("myField") = -1
Next
myDataAdapter.Fill(dset)
Dim drowsRemove = (From drow In dset.Tables(0).AsEnumerable() _
Where drow.Field(Of Integer)("myField") = -1).ToList()
For Each drow In drowsRemove
dset.Tables(0).Rows.Remove(drow)
Next
对于更优雅的解决方案的任何建议表示赞赏。