.net 如何检查datatable是否未更改?

.net 如何检查datatable是否未更改?,.net,vb.net,datatable,.net,Vb.net,Datatable,我有一个datatable,我正在实现一个功能,告诉我的应用程序中的datatable自从从数据库加载以来是否没有被更改 例如,没有添加行,没有编辑行,没有删除行,因为它是从数据库加载的。我不关心数据在数据库中更改而没有反映在我的数据表中的情况 我实现了如下内容: 'DataTable clean means it has not been changed Public ReadOnly Property DataTableClean As Boolean Get

我有一个datatable,我正在实现一个功能,告诉我的应用程序中的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
这段代码完成了这项工作,但如果datatable包含大量行,我对性能不是很满意

请问是否有人知道某个地方是否有一个标志指示datatable是否已更改


谢谢。

我认为您可以使用以下功能 DataTable.GetChanges

如果发现更改,则表示它包含更改,因此返回False,否则返回True


更多关于MSDN的详细信息:

在我看来,您可以使用以下功能 DataTable.GetChanges

如果发现更改,则表示它包含更改,因此返回False,否则返回True


有关MSDN的更多详细信息:

我知道,要避免昂贵的循环并跟踪对数据表的更改(即使是在调用AcceptChanges的情况下),唯一的方法是为行和已删除事件设置事件处理程序。 当您收到这些事件时,您可以设置一个类级别的布尔变量来保持干净状态

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

这仍然存在问题,因为这里我们一次跟踪一个表,如果您想要一个通用解决方案一次跟踪多个表,那么您需要在这个类私有列表中添加某种集合管理,add/remove。更新数据库时,不要忘记重置Clean变量。

我知道的避免昂贵循环和跟踪数据表更改的唯一方法是为行和已删除事件设置事件处理程序,即使在调用AcceptChanges的情况下也是如此。 当您收到这些事件时,您可以设置一个类级别的布尔变量来保持干净状态

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

这仍然存在问题,因为这里我们一次跟踪一个表,如果您想要一个通用解决方案一次跟踪多个表,那么您需要在这个类私有列表中添加某种集合管理,add/remove。更新数据库时,不要忘记重置Clean变量。

这是一个好的开始。但是当调用AcceptChanges时,GetChanges将不返回任何内容,尽管这些更改没有反映在数据库no DataAdapter.Update调用中,这不是我要寻找的。谢谢。这很简单,但是GetChanges的主要功能是检索所有更改的行,这需要一个循环,直到DataRow集合结束。这可能比在第一行停止的操作代码性能差changed@ThomasCarlton如果您的代码在某处调用AcceptChanges,那么您的代码也将找不到任何更改。这是一个好的开始。但是当调用AcceptChanges时,GetChanges将不返回任何内容,尽管这些更改没有反映在数据库no DataAdapter.Update调用中,这不是我要寻找的。谢谢。这很简单,但是GetChanges的主要功能是检索所有更改的行,这需要一个循环,直到DataRow集合结束。这可能比在第一行停止的操作代码性能差changed@ThomasCarlton如果您的代码调用AcceptChanges,此外,您的代码将不会发现任何更改我有一个RowChanged的示例,只是将一个具体的类与扩展方法结合在一起,以便于使用最初为C代码示例所做的GetChanges。在GetChanges项目的代码模块ExtensionMethods.vb中,有一个简单的例子可以让您熟悉这些扩展。如果你在网上简单回顾一下C版本,这可能也会有所帮助,我这里有一个RowChanged的例子,只是将一个具体的类与扩展方法结合在一起,以便于使用GetChanges,而GetChanges最初是为C代码示例完成的。在GetChanges项目的代码模块ExtensionMethods.vb中,有一个简单的例子可以让您熟悉这些扩展。如果你简单的在线查看C版本,也可以在这里找到帮助