2011-08-31 44 views
1

我使用的是“用”结构,但是当我在一个循环中快速载入图像,我收到以下错误异常错误:的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; 
    } 

我不知道下一步该怎么做!当我切换到“使用”格式时,此代码用于工作并最近停止工作。但即使我切换回来,现在也是错误的。

+1

这不回答你的问题,但你真的要打开和关闭周围使用SqlCommand的SQL连接。这将返回并从连接池中获取连接,这会在每次使用时重置连接,允许您针对群集SQL服务器(部分)进行工作,并使您无需实施处置。请参阅:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx,除非这意味着您已切换到“使用”模型。 –

回答

1

听起来像一个连接泄漏给我。

尝试重构大意如下:

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) 
    } 
} 
+0

原来我已经声明SqlConnection为静态。作为私人或公共的作品更好。 :) –

+0

是的,它的确如此。你不应该在字段中保持连接,因为它是连接泄漏的常见来源。在连接池耗尽之前,您将依赖于清理垃圾收集器。我仍然建议你遵循using(var x = new sqlconnection()){..}模式。 – Twisted