2012-04-12 17 views
3

私はユーザーによって変更されるDataTableを持っています。私は、何がデータベースでそのレコードを保持しているのかを確認したい。DataTableをコピー/クローンする方法

これを行うには、変更が行われる前にそのDataTableをコピーして、ユーザーがフォームを保存したときに何が変更されたかを確認するのが最も良い方法です。

問題は、myDataTable.Clone()またはmyDataTable.Copy()を使用すると、データが常に同じになるということです。だから私は彼らがテーブル間の参照を作成すると思います。

これはどのように処理しますか?

+0

違いを把握したい場合は、DataRowStateを考慮する必要があります。http://msdn.microsoft.com/en-us/library/system.data.datarowstate.aspx – dsolimano

答えて

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.   
} 

それとも、すべてのデータセットの変更を取得したい、とだけ特定のテーブルから変更をたくない場合:

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] 
+0

ありがとうございました。私はちょうどテストし、はい、それは修正された行を返します。それは私に元の価値を与えません! – Mathieu

+0

@マチュー、私の更新答えを見てください。 – Matt

+0

それは魅力のように機能します! – Mathieu

0

IMO、速く汚れた方法はserializeになり、その後deserialize DataTableになります。 xmlシリアル化を使用する場合は、まずDataSet内にDataTableをネストするようにしてください。

0

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

例:

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

あなたは一つ一つ別のDataTableを持つ行を比較することができ、このテーブルを持ちます。

+0

ありがとうございます。変更された行を返します。それは私に元の価値を与えません! – Mathieu

関連する問題