我有一个将由用户修改的DataTable。我想确定在数据库中保存记录的内容。
我看到这样做的最好方法是在进行任何更改之前复制DataTable,并验证用户保存表单时已更改的内容。
问题是我使用myDataTable.Clone()或myDataTable.Copy(),数据总是相同的。所以我猜他们只是在表之间创建引用。
你会如何处理?
答案 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进行比较。