3

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

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

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

你会怎么处理这个?

4

3 回答 3

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]
于 2012-04-12T18:24:18.177 回答
0

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

于 2012-04-12T18:24:37.700 回答
0

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

例子:

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

有了这个表,您可以将行与另一个 DataTable 进行逐一比较。

于 2012-04-12T18:32:04.690 回答