【问题标题】:How can I handle oracle exceptions using Enterprise Library in C#?如何在 C# 中使用 Enterprise Library 处理 oracle 异常?
【发布时间】:2012-07-06 20:54:08
【问题描述】:

我正在使用 C#、企业库和 Oracle 为数据库构建一个 ASP.NET Web 应用程序。这是我第一次使用 Oracle 作为数据库,到目前为止我的经验并不是那么好(我更喜欢使用 MS SQL Server)。所以这是场景:

用户可以输入和更改数据库中唯一字段的值(例如 - 用户名)。如果用户输入了一个已经作为不同记录输入的值(在此上下文中为用户名),则要求通知用户。由于插入和/或更新是通过存储过程完成的,我决定在存储过程中处理异常。为此,我声明了一个名为 erCode 的 NUMBER 类型的 out 参数,并将以下块添加到 SQL 语句之后的存储过程中。

EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN
        erCode := SQLCODE

如果 INSERT/UPDATE 操作成功,我返回 erCode 值为 0。

由于有返回值,应用程序的数据访问层 (DAL) 中的代码的 try-catch 块中自然不会捕获异常。因此,我将 erCode 的值从 DAL 返回到业务逻辑层 (BLL),然后返回到 UI 层,我在 inside try 块中通过以下方式处理它:

if (errorCode = -1)
{
    lblMsg.Text = "Username already exists";
}
else
{
    lblMsg.Text = "Username changed successfully";
}

我意识到这是一种可怕的方法,即使 oracle 错误代码是除“-1”之外的值,那么 用户名已成功更改 也会显示出来,这完全是误导性的。

我不应该使用 System.Data.OracleClient.OracleException 类,因为当我们在我的工作场所与企业库相邻使用该类时,它看起来并不受欢迎。如果我们使用的是企业库,那么我们应该将它单独用于所有与数据库相关的功能。

这让我想到了我的问题;我该如何处理这种情况?是否可以单独使用企业库来做到这一点?

【问题讨论】:

    标签: c# oracle exception enterprise-library


    【解决方案1】:

    如果您需要将代码作为您正在做的事情并且仍然安全,那么您可以这样做:

    • 当没有遇到错误时,如果我假设 ErrorCode 返回将是一个空值,你可以这样做:

      if(erCode==null)
      errorCode = 1;
      
    • 设置 ErrorCode =1 肯定会表明操作是 成功。

    • 修改你的代码为:

      if (errorCode = -1)
      {
          lblMsg.Text = "Username already exists";
      }
      else if(errorCode = 1)
      {
          lblMsg.Text = "Username changed successfully";
      }
      else{
          lblMsg.Text = "Unknown error while updating!";
      }
      
    • 所以如果有任何其他错误代码,相关信息是 显示出来了!

    希望你觉得值得!

    【讨论】:

    • 那么我是否正确地假设如果返回错误代码,那么它总是一个负值?
    • 不!这种方式不对,你必须做一个冒烟测试,在重复的情况下返回什么错误代码,它可能总是一样的!
    • 在这种情况下,如果发生未处理/意外的异常,那么我们只会知道发生了错误,但我们不知道它的性质对吗?
    • 我想我必须接受这个。谢谢!
    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2018-11-16
    • 2010-12-30
    相关资源
    最近更新 更多