【问题标题】:Finer granularity of SQL Exceptions?更细粒度的 SQL 异常?
【发布时间】:2008-11-04 11:35:04
【问题描述】:

在 C# 中,有没有办法获得更精细的 SQL 异常粒度?

我知道很多事情可能会出错,但我想以不同的方式处理某些情况,并且解析错误消息似乎不是很优雅。

还有错误消息是由框架创建的还是特定于数据库的?

例如,如果我在 INSERT 上违反了主键,则错误消息将始终为:

违反主键约束“PK_tblProduct”。无法在对象“dbo.tblProduct”中插入重复键。

或者是特定于 SQLServer 的。

更新

我好像在寻找错误号,知道在哪里可以获得各种错误号吗?

我能用快速谷歌做的最好的事情是: 18456:登录失败 18488: 密码过期

【问题讨论】:

    标签: c# sql sqlexception


    【解决方案1】:

    如果您正在捕获SqlException,您应该可以访问.Number,它会为您提供SQL 错误号;这可能是您最好的方法...(对于非致命错误,您也可以从 InfoMessage 事件中获得相同的结果)。

    当然,这不会区分表 - 您可能会争辩说,如果您需要这种粒度级别,您应该首先检查(在可序列化的隔离级别,最好使用 UPDLOCK),如果存在冲突,则会引发您自己的错误数据。

    【讨论】:

    • 知道在哪里可以参考不同数字的含义吗?
    【解决方案2】:

    您可以找到错误代码here

    【讨论】:

    • 那些似乎与我得到的错误代码不同。不过,它们可能涵盖不同的错误
    • 显然这些错误代码是 C# 使用的错误代码,只是它们是正数而不是负数。
    【解决方案3】:

    SQLException 的 .Number 成员似乎是我所追求的,这是我迄今为止设法找到的数字:

    • 17:SQL Server 不存在或访问被拒绝。
    • 4060:数据库无效
    • 18456:登录失败
    • 547:外键违规
    • 1205:死锁受害者
    • 2627、2601:唯一索引/常量违规

    【讨论】:

      【解决方案4】:

      在 SQL Server 中,您可以使用各种错误函数,这些函数返回有关从 sys.messages 遇到的错误的各种信息

      您可以从BOL获取更多信息。

      【讨论】:

        【解决方案5】:

        回答您问题的最后一部分:错误消息的细节将取决于数据库。有一些标准的 SQL 错误代码,但实际文本将从 DBMS 更改为 DBMS。甚至是否返回 SQL 标准错误代码也取决于 DBMS。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-23
          • 1970-01-01
          • 2012-02-20
          • 2014-11-29
          • 1970-01-01
          • 2023-04-11
          相关资源
          最近更新 更多