0

彙集我已經下面用我的數據庫訪問代碼:Tranaction和連接在asp.net

//gets the connection and create transaction 
SqlTransaction transaction = SelectConnection(); 

try 
{ 
    dsRecordDataset = new DataSet(); 
    SqlParameter[] param = new SqlParameter[1]; 
    string[] taleNames = new string[1]; 
    taleNames[0] = "RecordSet"; 
    param[0] = new SqlParameter("@Mode", Mode); 
    SqlHelper.FillDataset(transaction, CommandType.StoredProcedure, 
          "spProject", dsRecordDataset, taleNames, param); 
    transaction.Commit(); 
    return dsRecordDataset; 
} 
catch (Exception ex) 
{ 
    transaction.Rollback(); 
    throw ex; 
} 

問題,我發現是我從來沒有關閉了連接,使連接池就會溢出,並給出一個有時對用戶有錯誤。我需要澄清以下內容

  1. 連接池何時根據asp.net中的默認設置進行重置?
  2. 提交事務是否與連接有關?

我試圖try catch塊

finally 
{ 
    if (transaction.Connection.State == ConnectionState.Open) 
    { 
     transaction.Connection.Close(); 
    } 
} 

後使用下面的代碼,但隨後的連接爲null,並且給出了一個錯誤。

  1. 有什麼辦法可以在上面的代碼中關閉連接嗎?
+2

你似乎是返回(斷開)的數據集,所以關閉連接。使用連接快速搜索ADO.NET –

回答

1

連接池何時根據asp.net中的默認設置重置?

如果未在連接字符串中指定MinPoolSize或將其指定爲零,則池中的連接將在一段時間不活動後關閉。但是,如果指定的MinPoolSize大於零,則在AppDomain卸載並且進程結束之前,連接池不會被銷燬。

是否提交事務與連接有關? 不,犯了連接不(應該)關閉連接

有沒有什麼辦法來關閉在上面的代碼中的連接?

您可以使用Connection對象的Close或Dispose方法,或者打開C#中的using語句中的所有連接,以使它們返回連接池。未明確關閉的連接可能不會被添加或返回到池中。

0

你已經得到了答案,但對於問題3)在這種情況下你可能會發現使用語句intresting。但它意味着代碼更改,但這是保持資源關鍵對象安全的好方法。 (如您的SqlConnection)

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

    command.CommandText = "mysp_GetValue"; 
    command.CommandType = CommandType.StoredProcedure; 

    connection.Open(); 
    object ret = command.ExecuteScalar(); 
} 

這只是一個很簡單的例子,但這一說法全自動調用它實現了IDisposable接口的對象的Dispose方法。 (像的SqlConnection)

如果您在本intrested,在這裏你可以找到更多的細節和解釋: Your Friend the C# Using Statement