2009-03-23 11 views
2

2つの関連するDataTable(マスターと詳細)を含む1つのデータセットがあります。フィルタに一致するデータ(マスターデータ列A = "XXX"など)を別のデータセットにコピーしたいとします。1つのデータセットから別のデータセットにデータをループしてコピーする最速の方法

今、このプロセスに非常に長い時間がかかることがわかりました。 (1kレコードで約1時間)

この処理時間を改善する方法を知りたいですか?

おかげで、あなたがしようとする場合があります エック

+0

これは意味をなさない。 DataSetを持っている場合、それはメモリー内にあり、1Kレコードであることを意味します。繰り返して繰り返して各行を10回比較しても、1時間かかることはありません。コードを表示します。 – Ruslan

答えて

2

1000個のレコードをコピーするのに数ミリ秒かかります。 奇妙なことをやって何の発射イベントやデータバインディングを存在しないことを確認してください。.. はたぶん、あなたは関係なしで試してみてください、私は信じていenforcecontraints =も外部キーチェックを無効に偽..

次のコードをコピーし

完全なデータセットはかなり速いです。

fDstDataSet.EnforceConstraints = false; 
foreach (DataTable fSrcTable in fSrcDataSet.Tables) 
{ 
    DataTable fDstTable = fOpenOrders.Tables[fSrcTable.TableName]; 
    foreach (DataRow fSrcRow in fSrcTable.Rows) 
    { 
     fDstTable.ImportRow(fSrcRow); 
    } 
} 
fDstDataSet.EnforceConstraints = true; 
+0

そのようなDataSetのEnforceConstraintsは、メモリ内のデータセットの制約に過ぎず、実際のデータベースの制約には戻りません。 DataAdapterから単純なテーブルを作成した場合、通常は制約はありません。 –

1

。あなたは、より詳細にあなたの問題を概説し、いくつかの利益を得る可能性があるDataRow[]

0

を返し

myDataSet.Tables[0].Select("A = 'xxx'"); 

は - そして、あなたのデータを複製し、より良いオプションがあるかもしれません。

あなたは本当にあなたがたDataViewクラスを見てみたいことがあり、この道を行きたい場合:

http://msdn.microsoft.com/en-us/library/system.data.dataview.aspx

これは、あなたがデータテーブルからフィルタに基づいてデータを抽出することができます。これは、データビューで選択された行に基づいて、データテーブルを返します

http://msdn.microsoft.com/en-us/library/system.data.dataview.totable.aspx

:DataViewのもToTable方法があります。

これはあなたのバージョンよりも優れているはずですが、他のオプションがより速い実装を提供するかどうかはわかりません。上記のDataTable.SelectがDataViewよりも優れたパフォーマンスを発揮すると信じています。