【问题标题】:How to copy/clone a DataTable如何复制/克隆数据表
【发布时间】:2012-04-25 03:31:19
【问题描述】:

我有一个将由用户修改的数据表。我想确定发生了什么变化并在数据库中保留记录。

我认为这样做的最佳方法是在进行任何更改之前复制该 DataTable,并在用户保存表单时验证更改的内容。

问题是无论我使用 myDataTable.Clone() 还是 myDataTable.Copy(),数据总是相同的。所以我猜他们只是在表之间创建引用。

你会怎么处理?

【问题讨论】:

标签: c# datatable copy clone


【解决方案1】:

试试 DataSet.HasChanges 方法。这将告诉您数据集是否有任何更改,例如删除或添加的行、修改的行等。

您也可以致电 DataSet.GetChanges 了解发生了什么变化。此方法将返回更改的副本。

例如,你可以说:

private void VerifyChanges(DataSet dataSet)
{
    if(!dataSet.HasChanges(DataRowState.Modified)) return;
    var changedDataSet = dataSet.GetChanges(DataRowState.Modified);

    //... do the tracking or whatever else you want here.        
}

或者,如果您不想获取所有 DataSet 更改,而只想获取特定表中的更改

private void VerifyChanges(DataSet dataSet, string tableName)
{
    if(!dataSet.HasChanges(DataRowState.Modified)) return;
    var changedTable = dataSet
        .Tables[tableName]
        .GetChanges(DataRowState.Modified);

    //... do the tracking or whatever else you want here.        
}

最后,要从修改后的 DataSet 中提取原始值,您可以编写代码:

row[columnIndex, DataRowVersion.Original]

【讨论】:

  • 谢谢。我刚刚测试过,是的,它返回修改后的行。虽然它没有给我原来的价值!
【解决方案2】:

IMO,快速而肮脏的方法是 serialize 然后 deserialize DataTable。如果您决定使用 xml 序列化,请务必先将 DataTable 嵌套在 DataSet 中。

【讨论】:

    【解决方案3】:

    考虑使用DataTable.GetChanges Method (DataRowState)。 此方法返回一个新数据表,其中包含已更改的行。

    例子:

    DataTable changeTable = table.GetChanges(DataRowState.Modified);
    

    拥有此表,您可以将行与另一个 DataTable 逐一比较。

    【讨论】:

    • 谢谢。它返回修改后的行。虽然它没有给我原来的价值!
    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 2016-06-09
    • 2011-03-29
    • 1970-01-01
    相关资源
    最近更新 更多