0

データベースに関する小さな問題で立ち往生しています。

月に一度、顧客情報 (名前、住所、市区町村など) を含む XML ファイルを受け取ります。私の主キーは、XML ファイルで提供される顧客番号です。

データベースに情報を挿入するのに問題はありません。

var cmd = new SqlCommand("insert into [customer_info] 
   (customer_nr, firstname, lastname, address_1, address_2, address_3.......)");
//some code
cmd.ExecuteNonQuery();

ここで、テーブルを更新するか、新しい情報を入力したいと思います。どうすればこれを達成できますか?

使ってみましたがうまくいきTableAdapterません。

customer_nrまた、追加できる XML は 1 つだけです。これは、主キーとして 1つしか持てないためです。

では、基本的に、テーブルを更新したり、新しい情報を入力したりするにはどうすればよいでしょうか?

ありがとう。

4

3 に答える 3

3

1 つの方法は、データベース内の新しいステージング テーブルにデータを一括挿入することです (最適な挿入速度のために、これにはSqlBulkCopyを使用できます)。そこに入ったら、customer_nr フィールドにインデックスを付けて、2 つのステートメントを実行できます。

-- UPDATE existing customers
UPDATE ci
SET ci.firstname = s.firstname,
    ci.lastname = s.lastname, 
    ... etc
FROM StagingTable s
    INNER JOIN Customer_Info ci ON s.customer_nr = ci.customer_nr

-- INSERT new customers
INSERT Customer_Info (customer_nr, firstname, lastname, ....)
SELECT s.customer_nr, s.firstname, s.lastname, ....
FROM StagingTable s
    LEFT JOIN Customer_Info ci ON s.customer_nr = ci.customer_nr
WHERE ci.customer_nr IS NULL

最後に、ステージング テーブルを削除します。

または、2 つのステートメントの代わりに、 SQL Server 2008 以降を使用している場合はMERGEステートメントを使用することもできます。これにより、1 つのステートメントで INSERT と UPDATE を実行できます。

于 2011-04-12T08:40:49.733 に答える
2

私があなたの質問を正しく理解した場合 - 顧客が既に存在する場合は情報を更新し、存在しない場合は新しい行を挿入します。

私はあなたのコードにハードコーディングされた SQL コマンドに多くの問題を抱えているので、まずあなたが行ったことをリファクタリングしたくなるでしょう。SELECTただし、目的を達成するには、主キーでa を実行する必要があります。結果が返された場合は、実行する必要があります。UPDATEそれ以外の場合は、実行する必要がありますINSERT

これは、次のような方法で行うのが最善ですStored Procedure- 情報をストアド プロシージャに渡すことができます。その後、ストアド プロシージャは、そうするかどうかを決定できます。UPDATEこれINSERTにより、コードをデータベースに対して複数回呼び出すオーバーヘッドも削減されます (ストアド プロシージャの方がはるかに高速です)。

于 2011-04-12T08:43:11.687 に答える
0

AdaTheDev は確かに良い提案をしてくれました。

ただし、場合によっては、.NET コードから挿入/更新する必要があります。

  1. 挿入/更新を処理するストアド プロシージャを作成します。つまり、直接挿入クエリをコマンド テキストとして使用する代わりに、ストアド プロシージャを呼び出します。SP は、行が存在するかどうかを確認してから、更新 (または挿入) します。
  2. ユーザー TableAdapter - しかし、これは面倒です。最初に、挿入コマンドと更新コマンドの両方をセットアップする必要があります。次に、データベースにクエリを実行して既存の顧客番号を取得し、データテーブル内の対応する行を更新して、Rowstate を Updated にする必要があります。このまま行かないほうがいい。
于 2011-04-12T08:45:56.480 に答える