2012-07-05 66 views
1

我在網上搜索了一段時間。但是我的問題沒有找到明確的答案。無論何時連接到數據庫,我都應該使用「using」,或者我可以使用try-catch-finally?我的意思是:當使用「DbConnection」時,我應該使用「using」還是try-catch-finally使用DbConnection.close()來關閉連接?

我不知道每次我完成與數據庫的交互或關閉連接時是否應該調用dispose方法。

static public List<Category> GetAll() 
    { 
     List<Category> CategoryList; 

     try 
     { 
      BaseDAO.Dbconn.Open(); 
      BaseDAO.SetCommand(BaseDAO.CommandAction.Read, "SELECT * FROM Categories"); 

      CategoryList = new List<Category>(); 

      using (DbDataReader reader = BaseDAO.Dbcmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        int ID = reader.GetInt32(reader.GetOrdinal("CategoryID")); 
        string Name = reader.GetString(reader.GetOrdinal("CategoryName")); 
        string Description = reader.GetString(reader.GetOrdinal("Description")); 
        CategoryList.Add(new Category(ID, Name, Description)); 
       } 
      } 
      return CategoryList; 
     } 
     catch (Exception ex) 
     { 
      BaseDAO.Dbconn.Dispose(); 
      throw ex; 
     } 
     finally { BaseDAO.Dbconn.Close(); } 

    } 

的「的DbConnection」是靜態不知道這是一個很好的解決方案,以及...

我結識ADO,只是想知道什麼是對這類問題的最佳答案。

+0

[在C#中使用「]的使用(http:// stackoverflow。com/questions/75401/c-sharp中的使用方法) –

回答

3

它沒有任何區別 - 無論你喜歡什麼。無論如何,編譯器using變成了try-finally

編輯我只注意到你只有在發生異常時才調用Dispose。你也應該把它移到finally子句中。 Dispose會調用Close,所以如果你不想要,你不需要專門調用它。

更多編輯鑑於此,如您所說,您的DbConnection是靜態的,那麼您不想調用Dispose,但您確實需要調用Close。但是,不應該有任何需要使用靜態DbConnection - 連接池將負責有效處理連接。你的代碼應該每次創建一個新的連接實例。

+0

是的,我知道使用被翻譯爲try-finally。但是,每次我停止使用try語句還是應該關閉連接時,是否應該使用dispose? –

+0

剛剛在我的更新後看到您的評論。總之,Dispose總是需要被調用,或者通過Dispose()明確地調用,或者通過'using'來隱式調用。 – Michael

+0

評論編輯:是的,但這裏是問題,調用dispose還是應該關閉連接非常重要?因爲如果我打電話處理Dbconnection是靜態的,我將需要重新初始化它 –

2

參考:Using Statement C#.

using語句允許程序員來指定使用資源的對象應該釋放他們。

提供給using語句的對象必須實現 IDisposable接口。該界面提供了應該釋放對象資源的Dispose方法, 。

使用語句可以在達到using語句的末尾時退出,或者拋出異常並且控制在語句結束之前離開語句塊。

參考:Example

按照Code Project,在.NET CLR轉換

using (MyResource myRes = new MyResource()) 
{  
    myRes.DoSomething(); 
} 

到:

{ 
    // limits scope of myRes 
    MyResource myRes= new MyResource();  
    try  
    {   
    myRes.DoSomething(); 
    } 
    finally 
    {   
    // Check for a null resource.   
    if (myRes!= null)    
    // Call the object's Dispose method.   
     ((IDisposable)myRes).Dispose();  
    } 
} 
0

調用Dispose等同於調用在大多數Close(如果不是所有)DbConnection實現,所以th如果你已經打電話給後者,那麼你不需要打電話給前者。只要確保在finally的情況下這樣做,以防出現異常。

相關問題