我一直随机收到此错误:
System.Web.Services.Protocols.SoapException:System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.InvalidOperationException:未关闭连接。连接的当前状态是连接。
它抱怨的代码如下:
DataSet ds = new DataSet();
cn = new SqlConnection(GetDBConnectionString());
using (cn)
{
try
{
SqlCommand cmd = new SqlCommand("uspGetNavigationItems", cn);
cmd.CommandType = CommandType.StoredProcedure;
cn.Open();
SqlDataAdapter adp = new SqlDataAdapter(cmd);
adp.Fill(ds, "NavItems");
}
catch (Exception ex)
{
ds = null;
throw ex;
}
finally
{
if (cn.State != ConnectionState.Closed)
{
cn.Close();
}
}
}
if (ds.Tables.Count > 0)
{
if (ds.Tables[0].Rows.Count > 0)
{
return ds.Tables[0];
}
else
{
return null;
}
}
else
{
return null;
}
我不明白问题在哪里,为什么它说连接正在连接,当我终于要清理它时。是因为我正在使用Finally关闭和using语句,它应该关闭它吗?再次发生这种情况并不总是发生,这就是为什么我不确定发生了什么。
谢谢。
答案 0 :(得分:3)
如果您使用的是using-statement
,则无需最后关闭连接,因为它会close
隐含dispose
。
经验法则:对每个实现IDisposable的类使用using语句(如Connections,DataAdapter,Commands)。另一方面,DataSet
或DataTable
并未手动或通过使用来实现cn = new SqlConnection(GetDBConnectionString());
using (cn)
{
//code
}
。
但改变:
using (var cn = new SqlConnection(GetDBConnectionString()))
{
//code
}
为:
SqlConnection cn = new SqlConnection(GetDBConnectionString());
try
{
//code
}
finally
{
if (cn != null)
((IDisposable)cn).Dispose();
}
这将被翻译为:
throw
旁注:throw ex
代替throw ex
会保留堆栈跟踪。使用{{1}},您将隐藏异常的原始来源。
答案 1 :(得分:0)
当你的using
声明处理你的连接关闭