2009-09-14 113 views
9

我有以下ado.net代碼,如果我已經使用使用來包裝我的DBCommand,是否必須明確關閉底下的連接?dbCommand.Close()是否會關閉連接?

感謝,

 public static void ExecuteSQL(int Id) 
     { 
      Database db; 
      const string sqlCommand = "Stored Procedure Name"; 
      try 
      { 
       db = DatabaseFactory.CreateDatabase(); 
       using (DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand)) 
       { 
        db.AddInParameter(dbCommand, "p_Id", DbType.Int32, Id); 
        db.ExecuteNonQuery(dbCommand); 
**//do I have to close connection explicitely here??** 
        if (dbCommand.Connection.State != ConnectionState.Closed) 
        { 
         dbCommand.Connection.Close(); 
        } 
        dbCommand.Connection.Dispose(); 
       } 
      } 
      catch (Exception ex) 
      { 
       Logger.Log.Error(ex.StackTrace, ex); 
       throw; 
      } 
     } 

回答

4

是的,如果你已經包裹在using塊全部是DbCommand,那麼你會明確關閉DbConnection,因爲你目前在你的代碼做。然而,只需撥打Dispose就足夠了。您無需撥打CloseDispose

+0

我相信@Satya在這種情況下是正確的,你的回答實際上是不正確的。 – Coops 2014-06-27 13:40:19

+0

@CodeBlend:在有人使用企業庫的情況下,是的,她的回答是正確的。但是,儘管代碼確實引用類如「數據庫」,但問題的內容和標記不引用EntLib。結果,如果人們正在尋找對問題的回答,那麼這仍然是正確的。 – 2014-11-26 22:36:57

-1

不,你不知道。

一旦使用塊的結尾被擊中,就會爲你調用dispose。

+2

我不知道爲什麼這是upvoted,因爲它只是明顯錯誤。你絕對必須關閉連接。這個問題是關於必須處理**連接**,而不是**命令**。 「單獨使用」命令並不這樣做。 – 2009-09-14 19:35:39

+0

基於他的代碼中的評論,以及他明確調用dbCommand.Connection.Close和dbCommand.Connection.Dispose()的事實,他雖然問他是否需要,因爲他已經將命令封裝在使用塊中。 如果他問他是否仍然需要調用類似db.Close和db.Dispose的東西,那麼你是100%正確的。我只是不認爲這是他的問題。 – cptScarlet 2009-09-14 19:56:12

+0

「如果我已經使用包裝我的DBCommand,是否必須關閉*下面的連接*顯式」這似乎很清楚措辭。 – 2009-09-14 22:39:35

2

http://www.willydev.net/descargas/WillyDev_EntLib_TestGuide.pdf

應用塊使其與他們完成後關閉所述的數據庫連接。例如,ExecuteNonQuery方法的實現包含using語句。 using語句獲取資源,執行語句並處理資源。在這種情況下,資源是數據庫連接。對於ExecuteReader方法,應用程序塊在閱讀器關閉後使用Command-Behavior.CloseConnection方法關閉連接。

+0

因此,這裏標記爲「答案」的回答完全錯誤? – Coops 2014-06-27 13:09:46

1

這篇文章很舊,但我回答說,如果我們在EnterpriseLibrary中使用這個塊(在代碼塊中的類和方法名稱讓我思考這個問題),我肯定連接已經關閉。 提出問題和回答的人應明確考慮我們是否在討論EnterbriseLibrary。 我測試了一個finally塊,並且YES,在使用DbCommand塊之後,連接會自動關閉。

+0

你可以發佈代碼,我想要一個例子來證明你說的是正確的,但我認爲它是 – Coops 2014-06-27 13:14:45