连接当前状态的连接错误消息
问题描述:
我一直随机收到此错误:连接当前状态的连接错误消息
服务器无法处理System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.InvalidOperationException:连接未关闭。连接的当前状态正在连接。
它complaning有关的代码如下:
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-statement
,因为它将从dispose
隐含close
它连接。
经验法则:对每个实现IDisposable(如Connections,DataAdapter,Commands)的类使用using语句。另一方面,DataSet
或DataTable
手动或通过使用不执行它和does not need to be disposed。
但变化:
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
你隐藏了异常的原始来源。
答
带走finally块作为using
声明将采取您关闭连接的护理
沿着这些线路:命令对象也应该是在一个using语句。 – NotMe 2012-03-28 14:29:02
@ChrisLively:据此编辑我的答案。 – 2012-03-28 14:40:51
@TimSchmelter谢谢你。 – Paritosh 2012-03-29 13:31:21