我有一个将由用户修改的 DataTable。我想确定发生了什么变化并在数据库中保留记录。
我认为这样做的最佳方法是在进行任何更改之前复制该 DataTable,并在用户保存表单时验证更改的内容。
问题是无论我使用 myDataTable.Clone() 还是 myDataTable.Copy(),数据总是相同的。所以我猜他们只是在表之间创建引用。
你会怎么处理这个?
试试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]
serialize
IMO,快速而肮脏的方法是deserialize
使用DataTable。如果您决定使用 xml 序列化,请务必先将 DataTable 嵌套在 DataSet 中。
考虑使用DataTable.GetChanges Method (DataRowState)。此方法返回一个新数据表,其中包含已更改的行。
例子:
DataTable changeTable = table.GetChanges(DataRowState.Modified);
有了这个表,您可以将行与另一个 DataTable 进行逐一比较。