如何检查数据表是否未更改?

时间:2017-06-24 09:17:55

标签: .net vb.net datatable

我有一个数据表,我正在实现一个功能,告诉我应用程序中的数据表是否从数据库加载后没有更改。

例如,没有添加任何行,没有编辑行,也没有删除任何行,因为它是从数据库加载的(我不关心数据库中的数据更改而不反映在我的数据表中的情况)

我实现了这样的事情:

    '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

这段代码完成了这项工作,但是在数据表包含大量行的情况下,我对性能并不十分舒服。

如果有某个标志指示数据表是否已更改,有人知道吗?

感谢。

2 个答案:

答案 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