如何复制/克隆DataTable

时间:2012-04-12 18:21:38

标签: c# datatable copy clone

我有一个将由用户修改的DataTable。我想确定在数据库中保存记录的内容。

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

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

你会如何处理?

3 个答案:

答案 0 :(得分:3)

尝试 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]

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

示例:

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

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