在try/catch块的catch语句中关闭SQLConnection

本文关键字:catch SQLConnection 块的 try 语句 | 更新日期: 2023-09-27 18:26:13

sc是从调用函数传入的SQL连接我在整个程序中使用一个SQL连接,并根据需要打开和关闭每个子函数。(我读到这很好,因为SQLConnection类有自己的连接池功能)

        string q = "this would be a query";
        using (SqlCommand cmd = new SqlCommand(q, sc))
        {
            cmd.Parameters.Add("@ID", SqlDbType.Int);
            cmd.Parameters["@ID"].Value = (an id that is passed in);
            try
            {
                sc.Open();
                using (var reader = cmd.ExecuteReader())
                {
                   if(reader.read())
                   { logic that might throw exception }
                   else
                   { logic that might throw exception }
                }
                sc.Close();
            }
            catch (Exception e)
            {
                alert user, program does not halt but current function returns
            }
        }

因此,连接打开,命令尝试执行,并执行一些可能引发异常的逻辑。(我没想到)这个函数是处理大型数据集的大型程序的一部分。如果它由于异常而失败,它需要注意它,但它也需要尝试保持运行。

程序的其他部分共享这个连接,并根据需要打开和关闭它,我已经将这个基本模板用于程序中的所有查询。

我突然想到,如果发生异常,连接可能不会关闭。我这样想对吗?在写这篇文章时,我最初担心的是sc.Open()会引发异常,但当我在多个地方使用它时,我意识到这是短视的,因为连接可能会打开,然后关闭之间的任何步骤都可能引发异常。

这里是否需要额外的逻辑来确保此连接已关闭,并且程序可以尝试继续运行

如果我的理解是正确的,即在打开和关闭之间发生异常时需要关闭连接,我认为我有两个选项:

  1. 在打开和关闭之间切换
  2. catch块中的sc.Close()(额外的问题:如果sc.Open()抛出异常,catch块尝试sc.Clos(),会抛出额外的异常吗?)

在try/catch块的catch语句中关闭SQLConnection

您不需要担心关闭连接。当连接被创建连接的using语句处理时,该连接将自动关闭。

在发生异常的情况下,连接仍将被释放(从而关闭),因为using语句就是这样设计的。

您有SqlConnection的State属性,可以使用该属性来确定上次网络操作使连接处于何种状态。此属性在此处描述:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx

我建议分别对SqlConnection(如Open)和SqlCommand中的异常做出反应,因为根据我的经验,您通常需要采取不同的操作。即使采用了您想要采取的总体方法,如果您无法打开连接,那么准备查询就没有意义,对于无法打开连接,您可能想说一些与查询失败时不同的话。我会在创建SqlCommand之前移动sc.Open(),并尝试/catch绕过它。

@roryap对上述答案的澄清-如果您的连接是在using语句中创建的,则不需要sc.Close(),但从您的问题来看,我猜不是。在这种情况下,您可能应该在try-catch块中添加一个finally部分,并在其中关闭连接。

最好在最终阻止时关闭连接

finally
{
   sc.Close(); 
}

try块完成后,finally块将工作。在出现异常的情况下,finally块也起作用。因此,在任何情况下,连接都将关闭。