2011-08-31 43 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