2010-11-25 12 views
1

SqlBulkCopyで変換を実行しています。私は現在、基本的に私はSqlBulkCopyで使用するためにDataTableへの変換を行うことができるクラスのIListのコレクションを持っています。同じIDを持つ3つのレコードがSqlBulkCopyを使用して異なる列を変更します

問題は、私は同じIDを持つ3つのレコードを持つことができます。

私に説明してみましょう...ここでは、3つのレコードの

ID  Name   Address 
1  Scott  London 
1  Mark   London 
1     Manchester 

は、それは私が必要な存在すれば、それは、その後、次のレコードを存在しない場合ので、私はレコード1を挿入...基本的に私が順番に挿入する必要がありますIDに第三の記録上の最後に1

をレコードを更新するのではなく、新たな1を挿入(idがまだ1で気づく)ので番目のレコードの場合には、私は両方の列の名前とアドレスを交換するために、あなたはその名に気付きます存在していないがID 1とマンチェスターのアドレスを持っているので、私はレコードを更新する必要がありますが、名前を変更するのではなく、マンチェスターを更新する必要があります。 ld id1 =

ID  Name  Address 
1  Mark  Manchester 

どのように私はこれを行うことができますか?私は迷っている。

ありがとうございました。

EDIT

[OK]を少し更新。 SQLbulkCopyを使用する前に、レコードを管理してマージします。何が成功し、何が失敗したのかを知ることは可能でしょうか...それともそれとも何もないのでしょうか?私は、SQLbulkCopyに代わるものはないと思っていますが、更新を行うには?

すべてを挿入でき、失敗したものは一時テーブルに挿入されるのが理想的です...したがって、私は失敗したテーブルのものを修正することを心配する必要があります。

+0

(回答の再編集を行います) –

答えて

0

あなたは(あなたがカスタムIDataReaderを書いているのでない限り)とにかくDataTableを、そのデータを処理する必要があるので、あなたはSqlBulkCopyにそれらを与える前にレコードをマージすべきです。例えば(擬似コードで):あなたが所望のデータを取得したら

/* create empty data-table */ 
foreach(row in list) { 
    var row = /* try to get exsiting row from data-table based on id */ 
    if(row == null) { row = /* create and append row to data-table */ } 
    else { merge non-trivial properties into existing row */ 
} 

次いでSqlBulkCopyDataTableを渡します。


編集を再編集します。そのシナリオでは、ステージングテーブル(通常はアップロードされたデータのようなスキーマを持つ通常のテーブルですが、通常は外部キーなどはありません)にアップロードし、通常のTSQLを使用してデータをトランザクションテーブルに移動します。完全なTSQLサポートに加えて、これにより、より良い操作のロギングも可能になります。特に、INSERTOUTPUT節を見れば、複雑な一括操作を助けることができます。

+0

ありがとう、私は質問をuddated – Martin

0

一括コピー(一括挿入)で更新することはできません。挿入するだけです。したがって、名前。

データを挿入する前に修正する必要があります。既存の行が更新されている場合は、キー競合を生成する行を挿入することはできません。

一時テーブルに一括挿入し、適切な挿入または更新ステートメントを実行するか、新しい行を挿入して残りの更新ステートメントのみを発行するか、またはそれらをフェッチしてデータを修正した後に既存の行を削除します再挿入する前に

しかし、一括コピーを説得して既存の行を更新する方法はありません。

+0

ありがとう、私の質問を更新しました – Martin

関連する問題