2011-07-05 99 views
0

我有2個類。使用通用數據訪問類,我可以從存儲過程GetDepartments獲取部門。我的問題是,在目錄訪問類,特別是在公共靜態DataTable ExecuteSelectCommand(DbCommand命令)(執行命令並返回結果作爲DataTable對象)我不知道我必須寫在CATCH循環或如何離開它blank.Can任何人都可以幫我完成這部分?或者,我可以怎樣才能改變它沒有嘗試趕上。帶trycatch函數的問題

using System;  
using System.Data;  
using System.Data.Common;  
using System.Configuration;  

public static class GenericDataAccess  
{  
    static GenericDataAccess() 
    { 

    } 


    public static DataTable ExecuteSelectCommand(DbCommand command)  
    {  
    DataTable table; 

    try  
    { 

     command.Connection.Open();  
     DbDataReader reader = command.ExecuteReader();  
     table = new DataTable();   
     table.Load(reader);   
     reader.Close();   
    }  
    catch (...)  
    {  
     ...... 
    }  
    finally  
    {   
     command.Connection.Close();  
    } 

    return table;  
    } 

    public static DbCommand CreateCommand()  
    {  
    string dataProviderName = BalloonShopConfiguration.DbProviderName; 
    string connectionString = BalloonShopConfiguration.DbConnectionString; 

    DbProviderFactory factory = DbProviderFactories.GetFactory(dataProviderName);  
    DbConnection conn = factory.CreateConnection(); 

    conn.ConnectionString = connectionString; 

    DbCommand comm = conn.CreateCommand();  
    comm.CommandType = CommandType.StoredProcedure; 

    return comm; 
    } 
} 

**The Catalog Access class:** 

using System;  
using System.Data;  
using System.Data.Common; 

public static class CatalogAccess  
{  
    static CatalogAccess() 
    { 

    } 

    public static DataTable GetDepartments()  
    {  
    DbCommand comm = GenericDataAccess.CreateCommand(); 

    comm.CommandText = "GetDepartments"; 

    return GenericDataAccess.ExecuteSelectCommand(comm);  
    }  
} 
+0

什麼如果ExecuteSelectCommand方法中發生異常,你想這麼做嗎?這將決定什麼需要進入catch塊。 – DoctorMick

+1

讀者必須在裏面使用。 – Aristos

+0

看起來Connection可能同樣泄漏。 – Constantin

回答

1

如果你不知道該怎麼做或不想處理任何異常,與catch了離開。這是有效的:

try 
{ 
    // code here 
} 
finally 
{ 
    // cleanup here 
} 

..這樣,任何異常將傳遞給調用方法的方法。如果try塊中存在問題(例外),則此方法將退出,但不會在執行finally中的任何代碼之前退出。

+0

當我嘗試第二種方式,你建議我有這個錯誤'無法打開數據庫「BalloonShop」登錄請求。登錄失敗。'。錯誤是在這行「command.Connection.Open();」 – dali1985

+0

@ theo1985,可能是您使用的連接字符串不正確。檢查你連接到正確的數據庫服務器,該服務器有'BalloonShop'數據庫。 – Constantin

0

我不知道要問什麼,但我懷疑你不想處理函數中的異常,並讓它沿着棧向下傳播(即讓調用者處理它)。

爲了達到這個目的,您可以將catch-clause從代碼中刪除。代碼finally仍然會被調用。如果你想處理您功能異常,但在返回前重新拋出它,嘗試:

catch (MyException e) 
{ 
    // Do stuff with e 
    throw; 
} 
+3

你失去了堆棧跟蹤信息。好得多隻是'扔;' –

+0

@Kieren:thx,編輯我的答案。 – larsmoa

+0

這樣做會給你一個關於未使用變量'e'的編譯器警告,所以如果你打算這麼做的話,就把它扔掉,然後'catch {throw; }'會更好。或者,如果你不介意可讀性的輕微損失,那麼根本就沒有捕獲塊... –

0

與時處理異常,你有兩個選擇:你現在可以處理他們時,他們正在拋出,或者你可以讓他們冒充代碼並在稍後處理。哪個更好取決於你的程序到底做了什麼。

你如何處理它也取決於你的代碼。你想通知用戶嗎?重試連接?都?什麼也不做(壞!)?讓我們說你只是想讓用戶知道發生了什麼壞事。然後,你會做類似如下:

try{ 
    // breakable stuff 
}catch(Exception e){ 
    System.Windows.Forms.MessageBox.Show("Something broke: " + e.Message); 
}finally{ 
    // clean up 
} 

如果你想處理異常進一步向上(又名在調用這個方法),然後執行以下操作:

try{ 
    // breakable stuff 
}catch{ 
    throw; 
}finally{ 
    // clean up 
} 
+0

'catch {throw; }'不會添加任何有價值的東西,除了可能會放置斷點的行。但是,它可能應該在'#if DEBUG'部分中。 – Constantin

+0

的確如此,但它也不會傷害任何東西,IMO也會使它更具可讀性,並且更清楚地知道究竟發生了什麼。 –

+0

抱歉:'(再一次,你當然是正確的,但是(正如你所說的)對於OP的代碼來說,刪除一個'catch'就像刪除所有註釋一樣有效的性能,以減少編譯時間:D –