的ExecuteScalar保持返回
我使用的是“用”结构,但是当我在一个循环中快速载入图像,我收到以下错误异常错误:的ExecuteScalar保持返回
的ExecuteScalar需要一个开放和可用的连接。连接的当前状态正在连接。
奇怪的部分是它每次运行时都会在循环的不同时间发生。
我已搜查我的整个解决方案,也没有调用open()或关闭()任何地方,但在以下几点:
public myMethod()
{
string conString;
conString = "Server=(local);Database=myDB;Uid=appaccess;Pwd=xxxxxx";
con = new SqlConnection(conString);
con.Open();
}
public void Dispose()
{
con.Close();
}
再后来在我的代码调用此方法中的循环imgIDs:
public byte[] GetImageBitStream(int imgID)
{
SqlCommand cmd = new SqlCommand("GetImageBitStream", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@imgID", imgID));
Object picData = new Object();
picData = cmd.ExecuteScalar();
if (picData == null)
{
picData = "";
}
return (byte[])picData;
}
我不知道下一步该怎么做!当我切换到“使用”格式时,此代码用于工作并最近停止工作。但即使我切换回来,现在也是错误的。
听起来像一个连接泄漏给我。
尝试重构大意如下:
string conString;
conString = "Server=(local);Database=myDB;Uid=appaccess;Pwd=xxxxxx";
using (var con = new SqlConnection(conString))
{
con.Open();
foreach (int id in imgIdCollection)
{
var img = GetImageBitStream(id,con)
}
}
原来我已经声明SqlConnection为静态。作为私人或公共的作品更好。 :) –
是的,它的确如此。你不应该在字段中保持连接,因为它是连接泄漏的常见来源。在连接池耗尽之前,您将依赖于清理垃圾收集器。我仍然建议你遵循using(var x = new sqlconnection()){..}模式。 – Twisted
这不回答你的问题,但你真的要打开和关闭周围使用SqlCommand的SQL连接。这将返回并从连接池中获取连接,这会在每次使用时重置连接,允许您针对群集SQL服务器(部分)进行工作,并使您无需实施处置。请参阅:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx,除非这意味着您已切换到“使用”模型。 –