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

IMO、迅速で汚い方法は、DataTableを使用することserializeですdeserialize。xmlシリアル化を使用する場合は、必ず最初にDataSet内にDataTableをネストしてください。

于 2012-04-12T18:24:37.700 に答える
0

DataTable.GetChangesメソッド(DataRowState)の使用を検討してください。このメソッドは、変更された行を含む新しいデータテーブルを返します。

例:

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

このテーブルがあれば、行を1つずつ別のDataTableと比較できます。

于 2012-04-12T18:32:04.690 に答える