2010-12-17 15 views
1

C#のデータテーブルからローを削除しようとすると問題が発生しました。問題は、データテーブルがSQLから構築されているため、任意の数の列を持つことができ、主キーがある場合とない場合があります。したがって、特定の列またはプライマリキーの値に基づいて行を削除することはできません。C#の汎用データテーブルからローを削除

ここで私がやっているの基本的なアウトラインです:

//Set up a new datatable that is an exact copy of the datatable from the SQL table. 
newData = data.Copy(); 
//...(do other things) 
foreach (DataRow dr in data.Rows) 
{ 
    //...(do other things) 
    // Check if the row is already in a data copy log. If so, we don't want it in the new datatable. 
    if (_DataCopyLogMaintenance.ContainedInDataCopyLog(dr)) 
    { 
    newData.Rows.Remove(dr); 
    } 
} 

は、しかし、私はエラーメッセージを与えることを、「与えられたDataRowは、現在のDataRowCollectionではありません」。 newDataがデータの直接コピーである場合、どちらが意味をなさないか。誰か他に提案はありますか? MSDNサイトはそれほど役に立ちませんでした。

ありがとうございます!

+2

はい、あなたは_copy_を持っていますが、正確な行_はありません。 newDataから行を削除するには、別のテーブルの行ではなく、その行に含まれている行の1つを参照する必要があります(重複しているにもかかわらず、異なる行であり、同じ行を削除することはできませんnewDataからの行)。 –

答えて

4

foreachは元のセットではなく、コピー上にある必要があります。 collection1に含まれるオブジェクトは、collection2から削除することはできません。

foreach (DataRow dr in newData.Rows) 

それ以外の場合は、インデックスで削除するカウンタを使用できます。

for(int i = 0; i < data.Rows.Count; i++) 
{ 
    if (_DataCopyLogMaintenance.ContainedInDataCopyLog(data.Rows[i])) 
    { 
    newData.Rows.RemoveAt(i); 
    } 
} 
+0

ありがとう、それは私が必要なものです。私はdatatabe.copy()メソッドに関する警告を見たことはありませんでしたが、それは単なるコピーであり、元の行を参照していないことは意味があります。 – Greg

関連する問題