从SqlException中提取结构化信息

本文关键字:结构化 信息 提取 SqlException | 更新日期: 2023-09-27 18:02:34

假设我在c#应用程序中执行了一条SQL语句,该语句导致SqlException异常,并抛出了以下错误消息:

违反了UNIQUE KEY约束' myuniqueconstrint '。不能在对象'MyTable'中插入重复键。重复键值为(括号)。

我明白整个字符串来自数据库。我想从消息中提取相关部分-类似于这个问题,但我想实际提取数据,如MyUniqueConstraint, MyTableMyValue,而不仅仅是SQL错误号。

实际上解析消息不是一个选项,因为它很容易出错:你必须对每一个可能的错误都这样做,如果错误文本从一个版本的SQL server到另一个版本,将会有严重的问题。

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

从SqlException中提取结构化信息

不久前我遇到了一个类似的问题,我发现即使是基于它们的数字来过滤SqlExceptions也是有问题的。

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

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

我想在这里至少说一点有帮助的事情,所以:

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

一厢情愿

我理解整个字符串来自数据库

是的,它有。

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

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

在我所知的数据库中,没有一个提供了更多神秘地隐藏在异常中的信息——即使它会这样做,它也不会是跨数据库的标准方法。