2008-10-20 45 views
6

時關閉連接/ datareader,我們發現連接池錯誤消息。因此,我一直在瀏覽代碼,並關閉SqlDataReader對象,無論它們是否處於未關閉狀態。我需要知道的是如何關閉在SqlDataSource或ObjectDataSource標記的SelectStatement屬性中指定的datareader(或者如果需要關閉的話)。如果沒有處理,會不會有連接泄漏?如何在Beta測試期間使用SqlDataSource或ObjectDataSource

在此先感謝!

回答

12

我傾向於使用「使用」關鍵字,尤其是在處理打開和關閉數據庫連接時。 「使用」是Dispose模式的快捷方式 - here是MSDN書寫的鏈接,here是鏈接到有用的博客條目的概述。

+1

同樣在這裏。我驚訝於有多少開發人員編寫不使用「使用」關鍵字來自動處理對象的代碼(特別是在使用像數據讀取器這樣的東西時)。 – Mun 2008-10-21 00:30:27

2

我的理解是,與SqlDataSource,連接管理是爲你執行的,你沒有什麼可怕的。

ObjectDataSource沒有直接與數據庫直接對話,所以它將是安全的 - 只要基礎對象正確地執行其連接和讀取器管理。

正如其他人所提到的,Close()using是您與ObjectDataSource一起使用的課程的朋友。

我的預感是,如果你已經有效地清理了代碼庫,你可能已經根除了這個問題。

0

我相信SqlDataSource會處理它自己的連接/閱讀器問題,所以不用擔心。至於你手動連接,我發現在過去的這個模式非常有用:

using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     try 
     { 
     SqlCommand command = connection.CreateCommand(); 
     command.CommandText = ... 

     connection.Open(); 
     using (SqlDataReader reader = command.ExecuteReader()) 
     { 
      do 
      { 
       while (reader.Read()) 
       { 
        ... handle each row ... 
       } 
      } while (reader.NextResult()); 
     } 
     } 
     catch (Exception ex) 
     { 
      ... error handling ... 
     } 
     finally 
     { 
     if (connection != null && connection.State == ConnectionState.Open) 
     { 
      connection.Close(); 
     } 
     } 
    } 
-1

我同意,爲ObjectDataSource閉幕應由其選擇的方法處理。我的ObjectDataSource Select方法返回一個SqlDataReader。我關心的是......將SqlDataReader返回給用戶界面後,SqlDataReader在關閉時會無用。例如請參閱以下示例代碼。我沒有嘗試過,也不想在這個階段發展。

SqlDataReader MySelectMethod(){ 
    SqlDataReader dr = null; 
    try{ 
     dr = DBObject.GetDataReader(); 
     return dr; 
    } 
    finally{ 
     dr.Close(); 
    } 
} 

感謝您收到的所有投入!

...........

我的理解是,隨着 的SqlDataSource,連接管理 爲您執行,你必須 有恃無恐。

ObjectDataSource控件不首先聊到 數據庫直接, 所以這將是安全的 - 只要 底層對象正確執行其 連接和讀者管理 。

正如其他人所說,關閉()和 使用您對 你的ObjectDataSource

使用的類的朋友。

+0

這不起作用。由於它在finally塊中,所以在返回發生時會執行close(代碼將退出try塊並最終執行)。 – tvanfosson 2008-10-21 00:43:41

4

要提高Close()/ Dispose()的性能,請考慮在處理或關閉閱讀器之前在關聯的命令對象上調用Cancel(),特別是當您未達到記錄集的末尾時。

例如:

  using (var cmd = ...)) 
      { 
       using (var reader = (DbDataReader) cmd.ExecuteReader()) 
       { 
        try 
        { 
         ConsumeData(reader); // may throw 
        } 
        catch(Exception) 
        { 
         cmd.Cancel(); 
         throw; 
        } 
       } 
      } 
2

在這裏,我們不得不在生產環境同樣的問題。

解決了這個問題。首先問題是,我的代碼中沒有使用任何聲明。 (這是幾年前建立的,有一些知識較少)。

然後我試着把SqlDataSource放在using子句中。但是這也沒有幫助。

這裏的訣竅就像tvanfosson和Mischa建議的那樣,把讀者放入使用條款中。這是實際關閉連接的對象。

中等負載時連接數縮小到最小池大小10。