【问题标题】:How to check if datatable has not been changed?如何检查数据表是否未更改?
【发布时间】:2017-06-24 09:17:54
【问题描述】:

我有一个数据表,并且我正在实现一个功能,该功能可以判断我的应用程序中的数据表自数据库加载以来是否未更改。

例如没有添加行,没有编辑行,没有删除行,因为它是从数据库加载的(我不关心数据库中的数据发生变化并且没有反映在我的数据表中的情况)

我实现了这样的东西:

    '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

这段代码可以完成这项工作,但如果数据表包含大量行,我对性能不太满意。

请问有谁知道某处是否有标志表明数据表是否已更改?

谢谢。

【问题讨论】:

标签: .net vb.net datatable


【解决方案1】:

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

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 变量。

【讨论】:

    【解决方案2】:

    在我看来,您可以使用以下功能 数据表.GetChanges

    如果您发现更改,则意味着它包含更改,因此您返回 False,否则返回 True。

    MSDN 上的更多详细信息:https://msdn.microsoft.com/en-us/library/k2552649(v=vs.110).aspx

    【讨论】:

    • 这是一个好的开始。但是,当调用 AcceptChanges 时,GetChanges 将不会返回任何内容,尽管更改尚未反映在数据库中(没有进行 DataAdapter.Update 调用),这不是我想要的。不过还是谢谢。
    • 这很简单,但 GetChanges 的主要功能是检索所有更改的行,这需要一个循环,直到 DataRow 集结束。这可能比在第一行停止的 OP 代码的性能要差
    • @ThomasCarlton 如果您的代码在某处调用 AcceptChanges,那么您的代码也将找不到任何更改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多