2012-04-10 6 views
2

私はいくつかの列を持つテーブルを持っており、これらの列の3つに一意キーを設定して重複がないことを確認していますテーブル。今私はtry/catchを使用して例外をスローして重複をスローし、次の行の挿入を更新し続けるのかと疑問に思っていたforeachは良い方法ですか?データの整合性を検証するための有効な方法としてtry/catchの有無にかかわらず一意のキーを使用

  try { 
       sqlWrite.ExecuteNonQuery(); 
      } catch (SqlException sqlException) { 
       if (!sqlException.ToString().Contains("Violation of UNIQUE KEY constraint")) { 
        MessageBox.Show("Error - " + Environment.NewLine + sqlException.ToString(), "Error SQL"); 
       } 
      } catch (Exception exception) { 
       MessageBox.Show("Error - " + Environment.NewLine + exception.ToString(), "Error SQL"); 
      } 

または、挿入クエリを実行して行が存在するかどうかを確認し、挿入をスキップする必要がありますか?私はあなたのデータ検証の一環として例外を使うのは良いことではないが、そのようなものがいくつかあるはずだと読んだことがある(例えば、How to check For File Lock in C#?はtry/catchと一緒に使われるはずです)。

+1

http://www.mssqltips.com/sqlservertip/2632/checking-for-potential-constraint-violations-before-entering-sql-server-try-and-catch-logic/ –

+0

ありがとうございます。それを読むでしょう。 – MadBoy

答えて

1

代替方法がある場合は、例外をスローしてキャッチしないでください。あなたは今それを持っています。これを使って!

IF NOT EXISTS(SELECT ...)をチェックして挿入する1つのSQLスクリプトまたはストアドプロシージャを作成できます。 2つのクエリを作成するのが遅くなります。

+0

彼は実際に例外を投げていない、彼はそれをキャッチしています。私は同意する例外は例外的な状況です:) – mattytommo

+0

彼は明示的に投げているわけではありませんが、間接的にそれを投げている...意味のちょうど影: – JotaBe

+0

heheちょうどニックピッキング:)、彼はそれをキャッチして、直接または間接的に:) – mattytommo

0

私は一般に、プライマリキーの関係は、データ検証のための絶対的な最後と後退の位置でなければならないと言います。あなたのプログラムがこれまでに得意としていて、一意のキーに失敗した行を挿入しようとすると、何かが間違っていました。

最も単純なケースでは、それほど悪くはありません。他の依存関係のない単一の行を挿入するには、レコードを挿入してキャッチされたエラーをスローする引数を使用して、IDをすでに選択しているかどうかを確認してください。

ここでは、10秒間または数百回の行を一度に挿入/更新するトランザクションについて考えてみましょう。行のすべてに一意のキーがあり、そのいずれかがエラーをスローする可能性があります。次に、DBは、エラーが検出されたときにトランザクション全体をロールバックする必要があります。確かにC#にはトランザクションモードがありますが、レコードを挿入するときに更新されたオブジェクトをロールバックしてロールバックする必要があります。それは非常に速く非常に複雑になります。

+0

ありがとうございます。だからこそ、私はtry/catchを残しているが、JotaBeが提案したものは存在しない場合はそれを実行する。 – MadBoy

関連する問題