ユーザーが変更する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]
IMO、迅速で汚い方法は、DataTableを使用することserializeですdeserialize。xmlシリアル化を使用する場合は、必ず最初にDataSet内にDataTableをネストしてください。
DataTable.GetChangesメソッド(DataRowState)の使用を検討してください。このメソッドは、変更された行を含む新しいデータテーブルを返します。
例:
DataTable changeTable = table.GetChanges(DataRowState.Modified);
このテーブルがあれば、行を1つずつ別のDataTableと比較できます。