6

次のように、MSSQL2008データベースに一意のインデックス制約違反があると想像してみてください。

Violation of PRIMARY KEY constraint 'PK_ManufacturerCode'. Cannot insert duplicate key in object 'dbo.ManufacturerCode'. The duplicate key value is (8410179)

現在、シッククライアントのグローバル例外ハンドラーによってこの例外を処理しています(Delphi 6でADOを使用して記述されていますが、将来的にはC#.NETを使用する予定です)。例外メッセージはログボックスに追加されます。 。

ただし、この特定の重複キー例外を個人的に処理し、シッククライアント独自のテキストを使用してクライアントに適切なエラーメッセージを表示したいと思います。エラーメッセージを解析して一致させることはできますが、次の2つの理由からこれを実行しません。

  • これは正しい方法ではありません。いくつかのエラーコードに依存することをお勧めします。
  • シッククライアントは、エラーテキストが異なる可能性のあるさまざまな言語でさまざまなバージョンのMSSQLサーバーを使用することを目的としています。

カスタム終了コードを使用したRETURNを使用したり、特別なストアドプロシージャを呼び出して重複をチェックしたりすることは、私を元気づけません。

4

3 に答える 3

3

AFAIK、重複キーの例外を区別する唯一の方法は、エラーメッセージを解析することです。

より良い解決策は、そもそも重複キーの例外を防ぐことです。重複するキーを挿入しないように挿入を記述し@@rowcount、行が追加されたかどうかを確認します。

insert  YourTable
        (id, col1, col2)
select  1, 'a', 'b'
where   not exists
        (
        select  *
        from    YourTable yt2
        where   yt2.id = 1
        )

if @@rowcount = 0
    -- Duplicate key!
于 2012-12-31T13:27:05.170 に答える
3

ErrorsADO では、エラーが発生した後に接続プロパティにアクセスし、NativeErrorプロパティを調べて SQL Server 固有のエラー番号を取得します。

.NET に切り替えると、同じ番号がまたはのNumberプロパティとして公開されます。SqlExceptionSqlError

ただし、特定のエラー番号を見つけるのは少し面倒な場合があります。重複キーの場合は、エラー番号 2627 です。

于 2012-12-31T13:38:15.647 に答える
3

幸いなことに、テキストを解析する必要はありません。ASqlExceptionにはNumberプロパティがあります。返される数字を観察し、一致させます。数値は明確に定義されています。システム カタログ テーブルの 1 つで、それらすべてを確認することもできます (名前はわかりません)。

すべての s をキャッチするのではなく、特定のエラーのみをキャッチすることをお勧めしますSqlException(たとえば)。

于 2012-12-31T13:37:32.670 に答える