我有一个数据表,我正在实现一个功能,告诉我应用程序中的数据表是否从数据库加载后没有更改。
例如,没有添加任何行,没有编辑行,也没有删除任何行,因为它是从数据库加载的(我不关心数据库中的数据更改而不反映在我的数据表中的情况)
我实现了这样的事情:
'DataTable clean means it has not been changed
Public ReadOnly Property DataTableClean As Boolean
Get
Dim Clean As Boolean = True
For i = 0 To DataTable.Rows.Count - 1
If DataTable.Rows(i).RowState <> DataRowState.Unchanged Then
Clean = False
Exit For
End If
Next
Return Clean
End Get
End Property
这段代码完成了这项工作,但是在数据表包含大量行的情况下,我对性能并不十分舒服。
如果有某个标志指示数据表是否已更改,有人知道吗?
感谢。
答案 0 :(得分:4)
我知道避免昂贵的循环并跟踪数据表更改的唯一方法,即使是在调用AcceptChanges的情况下,也是为RowChanged和RowDeleted事件设置事件处理程序。
当您收到这些事件时,您可以设置一个类级别的布尔变量来保持Clean状态。
Private Boolean Clean = True
Public Sub AddChangedTrackStatus(dt as DataTable)
AddHandler dt.RowChanged, AddressOf ChangeEvent
AddHandler dt.RowDeleted, AddressOf ChangeEvent
Clean = True
End Sub
Private Sub ChangeEvent(sender as Object, args as DataRowChangeEventArgs)
Clean = False
End Sub
Public ReadOnly Property DataTableClean As Boolean
Get
Return Clean
End Get
End Property
这仍有问题,因为我们在这里跟踪一个表,如果你想要一个通用的解决方案来跟踪多个表,那么你需要在这个类中添加某种集合管理(私有列表,添加/删除) )。并且不要忘记在更新数据库时重置Clean变量。
答案 1 :(得分:0)
在我看来,您可以使用以下功能 DataTable.GetChanges
如果您发现更改,则表示它包含更改,因此您返回False,否则为True。
有关MSDN的更多详细信息:https://msdn.microsoft.com/en-us/library/k2552649(v=vs.110).aspx