【发布时间】:2016-03-15 00:59:07
【问题描述】:
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() 会引发异常,但是当我在多个地方使用它时,我意识到这是短视的,因为连接可以打开然后关闭之间的任何步骤都可能引发异常。
我是否需要额外的逻辑来确保此连接已关闭并且程序可以尝试继续运行?
如果我的理解是正确的,在打开和关闭之间发生异常时需要关闭连接,我认为我有两个选择:
- 在打开和关闭之间尝试/捕捉
- sc.Close() 在 catch 块中(额外关注:如果 sc.Open() 抛出异常并且 catch 块尝试 sc.Close() 是否会抛出额外的异常?)
【问题讨论】: