6

假设您的 MSSQL 2008 数据库中存在唯一索引约束违规,如下所示:

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

目前我正在通过胖客户端中的全局异常处理程序处理此异常(使用 ADO 用 Delphi 6 编写,但没关系,我计划将来使用 C#.NET)并且异常消息附加到日志框.

但我想亲自处理这个特定的重复键异常,并使用厚客户端自己的文本在客户端中显示适当的错误消息。我可以解析匹配的错误消息,但出于两个原因不会这样做:

  • 这不是做这件事的正确方法——最好依靠一些错误代码;
  • 胖客户端旨在使用不同语言的各种 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

幸运的是,您不必解析文本。ASqlException有一个Number属性。观察,返回什么号码并匹配它。数字定义明确。您甚至可以在其中一个系统目录表中查看所有这些表(没有方便的名称)。

您最好只捕获一个非常具体的错误,而不是只捕获所有SqlExceptions(例如)。

于 2012-12-31T13:37:32.670 回答
3

在 ADO 中,您将Errors在发生错误后访问连接属性,并检查该NativeError属性以获取 SQL Server 特定的错误号。

当您切换到 .NET 时,相同的数字会作为or的Number属性公开SqlExceptionSqlError

但是,查找特定的错误号可能有点麻烦 - 对于重复键,它的错误号为 2627。

于 2012-12-31T13:38:15.647 回答