2011-06-27 5 views
0

特定のSQL Serverエラーがスローされた場合、そのコードを無視して実行することができるキャッチを作成しました。同僚は、私が抱えているエラーメッセージはSQLから投げ捨てられており、2008年にアップグレードすると変更される可能性があると述べました。彼は私のソリューションは今日は機能すると言いましたが、それは弱い解決策です。だから、私の質問は... SQL Serverのバージョンに依存している可能性がある場合は、SQL Serverからスローされたエラーをどのように捕捉して処理するべきですか?すなわち(2005年、2008年またはそれ以降)?どのようにキャッチをより良くするためのアイデアですか?SQL Serverのアップグレードで変更される可能性のあるSQLエラーをキャッチする方法

私のコード

コメントで述べたように
string sqlError = "The INSERT statement conflicted with the FOREIGN KEY constraint Table1. The conflict occurred in database Work1, table Table2."; 

catch (Exception oExp) 
{ 
//This check will allow the specific error to continue without getting caught. 
if (oExp.Message.Contains(Constants.sqlError) == false) 
{ 
    throw oExp; 
} 
} 
+0

なぜ最初にエラーがスローされますか。私はそれを解決しようとします。 –

+0

合意 - これは避けることができるエラーです - その可能性を避けるために措置をとってください。 –

+0

と 'throw oExp;'単に 'throw;'を実行しないと、私は思ったスタックトレースを失うでしょう。 –

答えて

1

、このは避けあるので、あなたべき正しいことを行うと、それは最初の場所で発生することができないことを確認してください。

あなたが推測しているように、静的テキストを使用することは悪いことです。これは、アップグレードレベルにかかわらず、SQL Serverがインストールされている言語、またはユーザーが(SQLメ​​ッセージがロケールに依存するため)ログオンしている言語に応じてこれらのメッセージが変更されると考えると、さらに真実です。

また、データが矛盾した状態になるようにこのエラーがスローされても、なぜあなたが続行したいのか分かりません。最初の場所で正しいこと。しかし、私はあなたのアプリケーションを知らない...

こういった警告では...これを避けることはできません。何らかの理由で(怠惰を除いて:-))、ジェネリックExceptionの場合は、StateNumberのプロパティをそのまま使用できるSqlExceptionをキャッチする必要があります。

+0

テーブルから行を削除したプロジェクトがありました予期せぬものでした。彼らはテーブルから削除された行を持っていないので、復元することはできません。なぜ、私は知らない。私は、Chris Jによって提案された状態と数値を扱うSqlExceptionについて詳しく説明します。ありがとうございます。 –

関連する問題