2012-07-06 22 views
0

我正在爲一個數據庫構建一個使用C#,企業庫和Oracle的ASP.NET Web應用程序。這是我第一次使用Oracle作爲數據庫,到目前爲止,我的經驗並不是那麼棒(我更喜歡使用MS SQL Server)。因此,這裏是場景:如何在C#中使用Enterprise Library處理oracle異常?

用戶可以輸入和更改數據庫中唯一字段的值(例如 - 用戶名)。如果用戶輸入了一個已經作爲不同記錄輸入的值(在這種情況下是用戶名),那麼需求就是通知用戶。由於插入和/或更新是通過存儲過程完成的,我決定在存儲過程中處理異常。我這樣做是通過聲明NUMBER類型的輸出參數erCode,並將以下塊添加到SQL語句後面的存儲過程中。

EXCEPTION 
    WHEN DUP_VAL_ON_INDEX THEN 
     erCode := SQLCODE 

在該事件的INSERT/UPDATE操作是成功的我回到erCode值爲0

當然,因爲有一個返回值的異常從未在的在try-catch塊捕獲代碼在應用程序的數據訪問層(DAL)中。因此,我回來的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來完成?

回答

0

如果你需要採取的代碼,你在做什麼,仍是在安全方面,那麼你可以這樣做:

  • 當遇到沒有錯誤,那麼如果我假設錯誤代碼 返回值將是一個空值,你可以這樣做:

    if(erCode==null) 
    errorCode = 1; 
    
  • 設置錯誤碼= 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!"; 
    } 
    
  • 那麼是否會有其他的錯誤代碼,顯示相關信息 !

希望你覺得它值得!

+0

所以我正確地認爲,如果返回一個錯誤代碼,那麼它將始終是一個負值? – 2012-07-06 21:30:44

+0

不!如果不是這樣的話,你必須做一個冒煙測試,以便在重複的情況下返回什麼錯誤代碼,並且它可能總是相同的! – 2012-07-06 22:11:57

+0

在這種情況下,如果發生未處理的/意外的異常,那麼我們只會知道發生了錯誤,但我們不知道它的性質是正確的嗎? – 2012-07-07 03:35:08