0

わかりましたので、ここに行きます。私が直面している要件は、データベースに「MyDbTable」というテーブルがあり、そこに多くのデータが含まれていることです。

次のような 3 つの列があるとします。

ColA ColB ColC

1 a ab
2 b bc
3 c cd


ColAがアイデンティティ

今、私は Web サービスを呼び出し、予想される結果は約 1500 行で構成されています。

スキーマは返された結果と同じです。

ColA ColB ColC

1 a xy
3 c yz
4 c yz

ここで本当にやりたいことは、サービスの結果にある既存のレコードを確認し、MyDbTable でそれらを更新することです。この場合、ColA の 1 と 3 のレコードになります。それらを更新する必要があります。Web サービス結果の ColA 値が 4 のレコードは新しいため、挿入する必要があります。

ここでの問題は、MyDbTable に数千の行があり、サービスも多数の行を返すことです。

これを行う最も簡単な方法は、アプリケーションまたはストアド プロシージャのいずれかを使用して、各レコードを反復処理し、チェックしてから処理する力ずくです。

私が本当に知りたいのは、これを最も最適化された方法で行う方法です。

4

2 に答える 2

1

これは私が最も効率的な方法であると私が想定しているものです(しかし、それを測定していません):

  1. によって提供されるような一括コピー操作を使用して、Webサービスから返されたテーブル全体をデータベースの一時テーブルにコピーしますSqlBulkCopy Class

  2. 単一のSQLServerMERGEステートメントを使用して、一時テーブルから実際のテーブルへの「更新または挿入」操作を実行します。

2008より前のバージョンのSQLServerを使用している場合は、の代わりにOUTPUT句を指定してUPDATEステートメントをMERGE使用できます。

于 2012-11-30T06:05:36.713 に答える
0

さて、あなたは一つのことをすることができます...

Web サービスから最初の行を取得し、その ID を取得します 「1」と言って GetRecordFromDB メソッドに渡します...

そのメソッドが何らかのオブジェクトを返す場合は、Webservice から見つけた値から値を設定し、メソッドを呼び出してデータベース内のレコードを更新します。

したがって、コードロジックは

object updateorinsert = library.getobjectbyid(IDFROMFirstRecordOfWebservice)
if (updateorinsert  != null)
   {
           updateorinsert.ColAValue = WebserviceData.ColAValue
   }

  updateorinsert.ColBValue = WebserviceData.ColBValue
  updateorinsert.ColCValue = WebserviceData.ColCValue

library.UpdateRecordOrInsertInDB(updateorinsert);

SqlBulkCopy も使用でき、ステージング テーブルを使用して、必要に応じて挿入/更新を実行できます。

ステージング テーブルと実際のテーブルにあるすべての ID を BulkInsert の後に削除し、すべてのレコードをステージングから実際のテーブルにコピーすることができます。

SQLBulkCopy を使用してデータベースを挿入/更新する

上記のリンクがお役に立てば幸いです。

于 2012-11-29T15:18:59.910 に答える