处理.net中的数据库异常

时间:2008-12-29 16:09:14

标签: c# sql-server exception-handling

当我们可以捕获例如:Violation of UNIQUE KEY constraint 'IX_Product'. Cannot insert duplicate key in object 'Product'. (2627)的异常时 挑战在于如何将索引名称IX_Product作为成员(即我不希望对消息进行细分)。表上可能有多个唯一约束,我们需要知道哪一个给用户提供更详细的信息。最好将其作为DbException捕获,因此它不是特定于SQL Server的。有没有办法从异常中获取受影响的索引而不必解析字符串?

我提出的唯一解决方案但是我没有测试过将使用存储过程并在其中捕获错误并从存储过程返回更详细的消息。但我相信这仍然会有问题。

5 个答案:

答案 0 :(得分:4)

你必须要么:

  1. 将您的客户端组件编码为 识别那些约束名称 每个插入/更新语句可能 抛出例外,
  2. 重命名所有约束,以便它们以您希望在客户端代码中使用它们的方式“可辨认”,或者......
  3. 在尝试插入/更新之前检查存储过程中的所有约束,如果检查失败,则在proc中抛出(提升)自己的自定义异常,在尝试插入更新并让约束创建异常之前...

答案 1 :(得分:1)

呃...也许我错过了一些明显的东西......但是不是更好地利用你的时间来修复错误而不是解析异常吗?

答案 2 :(得分:1)

这听起来像是一个糟糕的设计问题。 RDBMS 应该强制执行这些操作,但应用程序也应该了解并构建这些约束。期望您的RBDMS处理应用程序应该捕获或阻止开始的逻辑异常是一件非常残酷的事情。数据库引擎用于数据操作,而不是用于向应用程序抛出异常。

答案 3 :(得分:0)

将它作为Exception对象进行解析是最佳选择。我不会过于迅速地将其视为一种实现方式 - 具有组的正则表达式不应该太难以完美适合您的情况。

您也可能在存储过程中最终得到类似的解决方案(解析)。此外,通过将解析代码推送到数据库服务器,您迫使数据库无需解析就能够解析确切的详细信息(在数据库A上可能很简单,但在数据库B和C上却非常困难)。

答案 4 :(得分:0)

不解析异常文本。 (在这里回应安德鲁......)

如果您期望在数据插入/更新操作中出现许多可能的陷阱,那么您应该陷入C#层中的陷阱。从ApplicationException扩展以构建您自己的异常以处理这些特定的约束。

但是这假定您的数据模型的位置使您可以进行这些确定而无需使用db来告诉您可以成功执行语句。如果您的数据设计不允许您在不通过数据库引擎运行的情况下知道您是否违反约束,那么您的数据设计就存在缺陷。