2012-02-14 61 views
0

次のように私はdatatabaseテーブルを持っている:のOracle一括コピー重複行

id min max 
--------------------- 
1  0  20 
2  21 30 
3  31 40 

ユーザーは、新しい行を挿入し、既存の更新し、任意の行を削除することができますどこ私は、グリッドビュー(asp.net)でこの表を示しています。これは私がデータテーブルに格納しているすべての操作です。 レコードを更新、挿入、削除した後、保存したいときに保存ボタンを押すと、この変更されたデータテーブルがデータベースに保存されます。データベースを更新するには、OracleBulkCopyクラスを使用しています。 問題は、すでに存在する行を繰り返すデータベースにdatatableを更新しているときです。たとえば、上記のテーブルをグリッドビューで変更してデータベースに更新した場合:

id min max 
------------------ 
1  0  20 
2  21  30 
3  31  40 
1  0  20 
2  21  35 (updated) 
3  31  40 
4  41  60 (newly inserted) 

私はこの繰り返しは望ましくありません。ここidは、主キー であると私はOracleBulkCopy次のコードを試してみました:

Oracle.DataAccess.Client.OracleBulkCopy oracleBulkCopy = new Oracle.DataAccess.Client.OracleBulkCopy(DM.ConnectionString, Oracle.DataAccess.Client.OracleBulkCopyOptions.UseInternalTransaction); 
oracleBulkCopy.DestinationTableName = "RANGE"; 
oracleBulkCopy.WriteToServer(dataTable); 

答えて

0

OracleBulkCopyはビットSQL*Loaderのように動作します。重複は気にせず、すべてを挿入するだけです。実際には、開始する前にインデックスを無効にしてから、後でインデックスを再度有効にします。例えば、thisの質問を参照してください。これを回避するには、コピー先のテーブルと同じ列の一時テーブルに一括コピーしてから、テーブルからINSERTを実行して、重複を無視できるようにします。

編集:APCごとに、これはあまりスケールが上がらないでしょう。ただし、WriteToServerをさらに調べてください。データテーブル全体をコピーする必要はなく、DataRowStateに基づいてコピーすることができます。 hereを参照してください。したがって、新しい行であるものだけを一括コピーし、おそらく変更された行の回避策を実行することができます。あなたのデータテーブルから削除を許可している場合は、それらも個別に処理する必要があります。

+0

この「回避策」は宿題では十分かもしれませんが、実際のアプリケーションではパフォーマンスに問題があります。 – APC

+0

@APCあなたは何をお勧めしますか? – alwaysVBNET

関連する問題