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()会引发异常,但是我已经在多个地方使用过这个,我意识到这是短视的,因为连接可以打开然后关闭之间任意数量的步骤都可能引发异常。
我是否需要其他逻辑以确保此连接已关闭且程序可以尝试继续运行?
如果我的理解是正确的,在打开和关闭之间发生异常时需要关闭连接我认为我有两个选择:
答案 0 :(得分:2)
你不需要担心关闭连接。当连接由创建连接的using
语句处理时,它将自动关闭。
如果发生异常,连接仍将被处理(并因此关闭),因为using
语句的设计方式如何。
答案 1 :(得分:1)
您可以使用SqlConnection的State属性来确定上次网络操作离开连接的状态。此属性在此处描述:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx
我建议单独对SqlConnection(例如Open)和SqlCommand中的异常做出反应,因为根据我的经验,您通常会想要采取不同的操作。即使你想采取整体方法, 如果您无法打开连接,那么准备查询就没有意义, 你可能想要说一些与无法打开连接有关的事情,而不是查询失败。我会在创建SqlCommand之前移动sc.Open()并尝试/捕获它。
答案 2 :(得分:0)
对@roryap的上述答案进行澄清 - 如果您的连接是在using语句中创建的,则不需要sc.Close(),但是根据您的问题,我猜不是。在这种情况下,您应该将一个finally部分添加到try catch块并关闭其中的连接。
答案 3 :(得分:0)
最好在finally块中关闭连接
finally
{
sc.Close();
}
在try块完成后,finally块将起作用。 在异常的情况下,finally块也有效。 因此,无论如何连接都将关闭。