3

C#では、SQL例外でより細かい粒度を取得する方法はありますか?

非常に多くの問題が発生する可能性があることは承知していますが、特定のケースを別の方法で処理したいと考えており、エラー メッセージの解析はあまりエレガントではないようです。

また、フレームワークによって作成されたエラーメッセージですか、それともデータベース固有ですか?

たとえば、INSERT で主キー違反がある場合、エラー メッセージは常に次のようになります。

PRIMARY KEY 制約 'PK_tblProduct' に違反しています。オブジェクト 'dbo.tblProduct' に重複するキーを挿入できません。

またはそのSQLServer固有のものです。

アップデート

エラー番号を調べているようですが、さまざまなエラー番号を取得できる場所はありますか?

18456: ログオンに失敗しました 18488: パスワードの有効期限が切れました

4

5 に答える 5

1

ここでエラーコードを見つけることができます

于 2008-11-04T12:07:58.210 に答える
1

をキャッチしている場合はSqlException、にアクセスできる必要があります.Number。これにより、SQL エラー番号が得られます。InfoMessageこれはおそらくあなたの最善のアプローチです...(致命的ではないエラーについてもイベントから同じことができます)。

もちろん、これはテーブルを区別しません。このレベルの粒度が必要な場合は、最初に (シリアル化可能な分離レベルで、理想的には UPDLOCK を使用して) チェックし、競合するデータがある場合は独自のエラーを発生させる必要があると主張できます。

于 2008-11-04T11:43:01.567 に答える
1

SQLException の .Number メンバーは、私が求めているもののようです。これまでに調べた数字は次のとおりです。

  • 17: SQL Server が存在しないか、アクセスが拒否されました。
  • 4060: 無効なデータベースです
  • 18456: ログインに失敗しました
  • 547:ForeignKey違反
  • 1205: デッドロック被害者
  • 2627、2601: ユニーク インデックス/制約違反
于 2008-11-04T12:21:57.853 に答える
0

SQL Server では、sys.messages から発生したエラーに関するさまざまな情報を返すさまざまなエラー関数を使用できます。

BOLから詳細情報を取得できます。

于 2008-11-04T11:43:37.340 に答える
0

質問の最後の部分に答えるには、エラー メッセージの詳細はデータベースによって異なります。標準的な SQL エラー コードがいくつかありますが、実際のテキストは DBMS ごとに変わります。SQL 標準エラー コードが返されるかどうかも、DBMS によって異なります。

于 2008-11-04T11:55:05.037 に答える