Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.net中处理数据库异常_C#_Sql Server_Exception Handling - Fatal编程技术网

C# 在.net中处理数据库异常

C# 在.net中处理数据库异常,c#,sql-server,exception-handling,C#,Sql Server,Exception Handling,当我们可以捕捉到一个异常时,比如:违反唯一密钥约束“IX_Product”。无法在对象“产品”中插入重复密钥。(2627) 面临的挑战是如何将索引名IX_产品作为成员进行转运(即,我不想在邮件中添加子串)。一个表上可能有多个唯一约束,我们需要知道哪一个约束可以向用户提供更详细的信息。最好将其捕获为DbException,这样它就不是特定于SQL Server的。有没有一种方法可以从异常中获取受影响的索引,而不必解析字符串 我提出但尚未测试的唯一解决方案是使用存储过程并在其中捕获错误,然后从存储过

当我们可以捕捉到一个异常时,比如:
违反唯一密钥约束“IX_Product”。无法在对象“产品”中插入重复密钥。(2627)

面临的挑战是如何将索引名IX_产品作为成员进行转运(即,我不想在邮件中添加子串)。一个表上可能有多个唯一约束,我们需要知道哪一个约束可以向用户提供更详细的信息。最好将其捕获为DbException,这样它就不是特定于SQL Server的。有没有一种方法可以从异常中获取受影响的索引,而不必解析字符串


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

嗯……也许我遗漏了一些明显的东西……但是,与其解析异常,不如利用您的时间来修复错误,这样不是更好吗?

您必须:

  • 将客户端组件编码为 识别所使用的约束名称 每个insert/update语句都可能 抛出异常
  • 重命名您的所有约束,以便它们可以按照您希望在客户机代码中使用的方式“解密”,或者
  • 在尝试插入/更新之前,请检查存储过程中的所有约束,如果检查失败,请在尝试插入更新并让约束创建异常之前,在该过程中引发(引发)您自己的自定义异常
    一旦将其作为异常,对象解析就是最好的选择。不过,我不会很快就将其视为一种实现——带组的正则表达式对于您的情况来说不太难做到完美


    您也可能在存储的进程中得到类似的解决方案(解析)。此外,通过将解析代码推送到数据库服务器,您正在强制数据库能够在不进行解析的情况下解析确切的细节(在数据库A上这可能很简单,但在数据库B&C上却异常困难)

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

    不分析异常文本。(在这里呼应安德鲁…)

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


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

    在这种情况下,它不是一个bug。用户输入的数据违反了数据库约束。我需要向他们提供正确的信息,以便他们能够更正输入的内容并重试。这更多的是验证问题,而不是错误。@Kay:LOL!是的,这仍然是一个错误。用户不应该看到数据库异常,如果您发现自己正在解析数据库异常以向用户显示它们,那么很明显您忽略了一些输入验证规则。改为修复丢失的验证。@Steven,您如何知道此特定应用程序已编码到数据库约束中的业务逻辑。。。这位绅士的目标是防止用户看到原始数据库异常…@Steven,不,这不是一个“错误”(错误)。如果您有一个名称varchar(20)UNIQUE NOT NULL,那么用户可能会在已经输入一个名称后尝试输入一个“James”。即使系统先进行检查,仍然有可能违反种族条件约束。@[查尔斯·布雷塔纳]:因为他在评论中刚刚告诉我。他并不是试图阻止用户看到db异常,而是试图解析db异常以更详细地显示信息。而不是首先检查验证中是否存在冲突。唯一性是一个约束,在点击db之前,您不会意识到该约束。你可以先做一个检查,但有人可以在检查后插入。当然,但同样,这不应该发生。如果您需要担心唯一性问题,那么应该在应用程序级别为这类事情提供一个简单的缓存。您不应该试图解析数据库异常消息,句号。