0

我使用了我的数据库访问代码,如下所示:

//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();
    }
}

但随后连接为空并给出错误。

  1. 有什么方法可以关闭上面代码中的连接吗?
4

2 回答 2

1

连接池何时根据asp.net中的默认设置重置?

如果 MinPoolSize 未在连接字符串中指定或指定为零,则池中的连接将在一段时间不活动后关闭。但是,如果指定的 MinPoolSize 大于零,则连接池不会被破坏,直到 AppDomain 被卸载并且进程结束。

提交事务与连接有什么关系吗? 不,提交连接不会(不应该)关闭连接

有什么方法可以关闭上面代码中的连接吗?

您可以使用 Connection 对象的 Close 或 Dispose 方法来执行此操作,或者通过在 C# 中的 using 语句中打开所有连接,以便将它们返回到连接池。未明确关闭的连接可能不会添加或返回到池中。

于 2012-08-22T04:11:12.480 回答
0

您得到了答案,但是对于问题 3),您可能会发现 using 语句在这种情况下很有趣。然而,这意味着代码更改,但它是保持资源关键对象安全的好方法。(就像你的 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)

如果您对此感兴趣,可以在这里找到更多详细信息和解释: Your Friend the C# Using Statement

于 2012-08-22T06:15:15.807 回答