从SqlException中提取结构化信息

时间:2014-05-08 12:10:19

标签: c# sql sql-server exception sqlexception

假设我从C#应用程序执行了一个SQL语句,该语句导致SqlException并抛出以下错误消息:

  

违反UNIQUE KEY约束' MyUniqueConstraint'。无法在对象' MyTable'中插入重复键。重复的键值是   (myvalue的)。

我知道整个字符串来自数据库。我想从邮件中提取相关部分 - 与this question类似,但我想实际提取MyUniqueConstraintMyTableMyValue等数据,而不仅仅是SQL错误号。

实际上解析消息不是一个选项,因为它容易出错:您必须为每个可能的错误执行此操作,并且如果错误文本从一个版本的SQL Server更改为另一个版本there would be serious problems。< / p>

当发生数据库级错误时(理想情况下是异常),是否有可能从应用程序中合理地获取此类结构化信息?

2 个答案:

答案 0 :(得分:2)

Not long ago I faced a similar problem,我发现即使根据数字过滤SqlExceptions也是有问题的。

除此之外,我还没有遇到过可以从SqlException获取数据详细信息的解决方案。也就是说,除了解析消息之外。这里的一个问题是服务器消息的文本对于不同的语言和服务器版本是不同的

实际上我记得mssql master数据库中有一个系统表/视图,其中包含不同语言的所有错误消息。您可以尝试基于此解析消息,但有些SqlExceptions甚至不是来自服务器端的事情......

我想在这里说至少一个有用的东西,所以:

在命名空间 System.Data 中, DBConcurrencyException 似乎在某种程度上是有用的(意思是:在一个与这个问题不完全相关的案例中)。它具有 Row 属性(导致抛出异常的行,您可以使用它来获取表名和数据)。

答案 1 :(得分:0)

希望思考。

  

我知道整个字符串来自数据库

是的,确实如此。这是一个字符串。

  

实际上解析消息不是一个选项,因为它容易出错

解析是唯一的选项,因为数据库只提供了2个项目:sql错误号和字符串。所以,要么你想出一个通用的水晶球,要么你用你所拥有的东西 - 这意味着解析。

我所知道的数据库没有提供神秘隐藏在异常中的更多信息 - 如果它会这样做,那么无论如何它都不是跨数据库的标准方法。