如何在C#中使用Enterprise Library处理oracle异常?

时间:2012-07-06 20:54:08

标签: c# oracle exception enterprise-library

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

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

EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN
        erCode := SQLCODE

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

当然,由于存在返回值,因此在应用程序的数据访问层(DAL)中的代码的try-catch块中从未捕获到异常。因此,我将 erCode 的值从DAL返回到业务逻辑层(BLL),然后返回到我在其中处理内部 try块的UI层:

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

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

我不应该使用System.Data.OracleClient.OracleException类,因为当我在工作场所的Enterprise Library中使用该类时,它没有得到好评。如果我们使用Enterprise Library,那么我们应该单独使用它来处理所有与数据库相关的函数。

这让我想到了我的问题;我该如何处理这种情况?是否可以单独使用Enterprise Library进行此操作?

1 个答案:

答案 0 :(得分:0)

如果您需要将代码视为您正在进行的操作且仍然安全,那么您可以这样做:

  • 当没有遇到错误时,如果我假设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!";
    }
    
  • 因此,如果有任何其他错误代码,相关消息是 显示在这个

希望你觉得它值得!