0

我正在捕获一个 sql 异常,而不是重新抛出它。这似乎意味着连接没有像我预期的那样返回到池中。这可能吗?

        using (IDbCommand paymentCommand = this.Connection.CreateCommand())
        {
            try
            {
                //database stuff
            }
            catch (SqlException ex)
            {
               //LOG CALL
            }
        }
4

3 回答 3

0

目前尚不清楚您对连接池的体验。但是,我肯定会在声明中包含您的联系using

这是我通常使用的(注意这dac.GetConnection()只是一个集中代码以获取连接对象的类):

using (SqlConnection connection = dac.GetConnection())
{
  using (SqlCommand command = new SqlCommand("myProc", connection))
  {
    command.CommandType = CommandType.StoredProcedure;
    try
    {
      connection.Open();           
      //add params, run query

    }
    catch (Exception ex)
    {
      //handle/log errror
    }
    finally
    {
      if (connection.State == ConnectionState.Open)
        connection.Close();
    }
  }
}
于 2012-04-27T15:25:03.080 回答
0

为什么不将 using(...){} 放在 try{} 块中?这样即使抛出异常,使用块也会处理掉 IDBcmd obj。

于 2012-04-27T12:52:09.097 回答
0

您的问题不清楚您是如何创建连接的,但您确实需要确保打开它,然后关闭它,无论是否有错误。

通常我会做这样的事情:

SqlConnection connection = null;
try {
    connection.Open();

    // Do stuff like run a query, setup your IDbCommand, etc.
} catch (Exception ex) {
    // Log error
} finally {
    if (connection != null) {
        connection.Close();
    }
}

这样,无论发生什么,您的连接都将关闭并返回到池中。如果您未能关闭(),您将“泄漏”该连接并最终用完池连接以进行提取。连接的生命周期通常应该只与发出 sql 命令所需的时间一样长,此时您应该关闭它。

于 2012-04-27T14:56:37.687 回答