2011-02-16 9 views
2

C#とSQL Server 2000をデータベースとして使用して複数のレコード(〜1000)を挿入したいのですが、挿入する前にレコードを挿入するかどうかを確認する方法があります。挿入される。レコードは、構造化Excelファイルから来ているし、私は一般的なコレクションでそれらをロードし、各項目を反復処理し、このコードはレコードを挿入するストアドプロシージャを使用しています。この挿入前に既存のレコードを確認する

// Insert records into database 
private void insertRecords() { 

    try { 
    // iterate through all records 
    // and perform insert on each iteration 
    for (int i = 0; i < names.Count; i++) { 
     sCommand.Parameters.AddWithValue("@name", Names[i]); 
     sCommand.Parameters.AddWithValue("@person", ContactPeople[i]); 
     sCommand.Parameters.AddWithValue("@number", Phones[i]); 
     sCommand.Parameters.AddWithValue("@address", Addresses[i]); 

     // Open the connection 
     sConnection.Open(); 
     sCommand.ExecuteNonQuery(); 
     sConnection.Close(); 

    } 
    } catch (SqlException ex) { 
    throw ex; 
    } 
} 

のように挿入を実行するが、私はレコードを確認することができます挿入する前に?

答えて

-1

テーブルにプライマリキーがありますか?その場合は、挿入するキー値がテーブルにないことを確認する必要があります。

+1

私のテーブルにはプライマリキーがあります(私はIDENTITYを使用します)が、同じ名前が挿入されないようにしたいのですが、ピーター・ジョーンズが存在し、 – Henry

0

ストアドプロシージャ内で、データベースにローを追加するには、まずそのローがテーブルに存在するかどうかを確認します。存在する場合はUPDATE、それ以外の場合はINSERTです。 SQL 2008にはMERGEコマンドもあります。このコマンドは基本的に更新と挿入を同時に行います。

パフォーマンス面では、RBAR(row-by-agonizing-row)はかなり非効率的です。速度が問題であれば、BULK INSERT、bcpユーティリティ、SSISパッケージなど、様々な「一度にたくさんの行を挿入する」プログラムを調べることをお勧めします。あなたはまだどちらか/または問題がありますが、少なくともそれはより良い実行します。


編集:

バルク空のテーブルにデータを挿入することが容易です。一括挿入新しいデータが空でないテーブルに簡単にあります。おそらく主キーで定義されているデータの一部が既に存在するテーブルにデータを一括して挿入するのは難しいです。残念ながら、具体的な手順は、などなど、すぐに詳細を取得し、あなたのシステム上に非常に依存している、コード、データ構造

従うべき一般的な手順は以下のとおりです。 - 一時テーブルを作成します - 一時的にデータをロードテーブル - UPDATE 、彼らは(古いデータ)と一致 - - ターゲット表 のものと一時テーブルの内容を比較し、彼らは(新しいデータ)と一致していない、

をINSERT、私はクイック検索をしました私は決して考えなかったことに遭遇しました。試してくださいthis;それだけでなく、エレガントに動作します。

+0

私はあなたに同意するが、私は行の存在をチェックする方法についての例を私に与えることができる場合は、SQLですべての良いそれは可能ですか?また、perfomanceは間違いなく問題ですので、BULK INSERT – Henry

+0

をEDITの下に追加します。 –

4

ストアドプロシージャの内部では、あなたがこのようなチェック何か(あなたが指定していないので、テーブル名とカラム名を推測する)ことができます:

IF EXISTS(SELECT * FROM dbo.YourTable WHERE Name = @Name) 
    RETURN 

-- here, after the check, do the INSERT 

をあなたはまた、あなたにUNIQUE INDEXを作成することができますName列には同じ値とは2つの行が存在しないことを確認します

CREATE UNIQUE NONCLUSTERED INDEX UIX_Name 
    ON dbo.YourTable(Name) 
+0

よろしくお願いします。 – Henry

+0

バッチとして多くのレコードを挿入してみましたが、SQLDataAdapterを使用して、毎回接続を開いたり閉じたりせずに複数の挿入をexcecuteしていました。このコードでは正常に機能したとは報告されていませんが、新しいレコードはデータベースではなく、私はそれを引き起こしていません。これは私のコードです - – Henry

+0

'code string sql =" SELECT * FROM DEBTOR "; //データアダプタを作成する SqlDataAdapter da =新しいSqlDataAdapter(sql、ConnectionString); //データセットを作成して塗りつぶし DataSet ds = new DataSet(); da.Fill(ds、 "debtor"); //データテーブルの参照を取得する DataTable dt = ds.Tables ["debtor"]; sCommand.UpdatedRowSource = UpdateRowSource.None; のSqlDataAdapter ADPT =新しいSqlDataAdapterオブジェクトは、(); - [i]は.ToString { sCommand.Parameters.AddWithValue( "@のdebtor_name"、名前 '(私は++; iがnames.Countを Henry

0

最も簡単な方法は、おそらくあなたのループ内の内側tryブロックを持っているだろう。 でない場合は、すべてのDBエラーをキャッチして再スローします。重複レコードエラーです。それが重複レコードエラーの場合、何もしないでください(例外を食べる)。

関連する問題