-1

.CSV私は、これらの大きなファイルを区切り、SQLServerデータベースにアップロードするこのプログラムを数か月前に作成しました。.CSVファイルは基本的に毎回新しいデータが追加されているので、ユーザーがデータをアップロードするたびにテーブルからすべてを削除し、新しく追加されたデータを次のようにアップロードするように設定しました。

myConnection.Open();
string sql = @"DELETE FROM TestTable;";
SqlCommand cmd = new SqlCommand(sql, myConnection);
cmd.ExecuteNonQuery();
myConnection.Close();

ここで、テーブルへの以前のエントリを削除せずにデータをアップロードするように設定する必要がありますが、重複するデータを作成することはできません。幸い、.CSVファイルには主キーとして使用する各行の一意の識別子が付属していますが、これを行うためのアルゴリズムを思い付くのに問題があります。DELETESQL Serverで一意のデータのみを更新するために使用できる上記の構文に似たものはありますか?SQL Serverに関しては、私は最大の専門家ではないので、皆さんにお願いします。

私にはいくつかの異なるクラスとバックグラウンドワーカーがあるので、コードがたくさんあるのですべてを貼り付けたくありませんでしたが、詳細が必要な場合はお知らせください。

編集

ここに例があります:http: //msdn.microsoft.com/en-us/library/y06xa2h1 (v = vs.80).aspx?cs-save-lang = 1&cs-lang = csharp#code-snippet-1

私がしなければならないことはかなり確信していますが、私が混乱しているのは、dataSet1とは何か、そしてそれはどこから来ているのかということだけです。接続文字列を使用してSQLServerデータベースへの接続を開き、SqlDataAdapter挿入などの機能を実行するために使用しています。

誰かがこれについて何か説明があれば、それは大きな助けになるでしょう。

ありがとう

4

1 に答える 1

1

これを達成する安価な方法は、SQL Server の一意の識別列に一意のインデックスを作成し、重複を単に無視するように指示することです。

CREATE UNIQUE INDEX UIX_YourIndexNameHere
ON dbo.YourTableNameHere(YourUniqueColumnNameHere)
WITH (IGNORE_DUP_KEY = ON);

これの意味は:

  • SQL Server は、この列で一意の値のみを許可します - 重複はありません
  • 重複が挿入されている場合、それらはエラーを発生させずに破棄されます (いわば「黙って無視」)。

これは次のことも意味します。

  • 重複の可能性は無視されます - その一意の ID の既存の行はそのまま残ります(更新なし)
  • 新しい行が挿入されています

既存の行を ID で更新する必要がある場合は、次のようにすることをお勧めします。

  • .CSV を一時ステージング テーブルに一括ロードする
  • コマンドを使用して(SQL Server 2008MERGE以降を使用していることを願っています)、ステージング テーブルから実際のテーブルを更新します。これにより、新しい行を簡単に挿入し、既存の行を (無視するのではなく)更新できます。
于 2013-02-18T17:06:27.223 に答える