2014-01-30 22 views
0

感謝您的關注。內存不足從SQL Server中下載(小)圖像

我正在測試我的一個小程序,專門用於從SQL Server上載和檢索圖像。

當我運行下面的代碼時,我得到一個'Out of Memory'錯誤 - 儘管我的電腦有8GB內存,而且程序實際上只是一種形式。

Dim cmd As New SqlCommand("SELECT DP FROM PersonsA WHERE Members_ID = 1", con) 
cmd.CommandType = CommandType.Text 
Dim ImgStream As New IO.MemoryStream(CType(cmd.ExecuteScalar, Byte())) 
PictureBox2.BackgroundImage = Image.FromStream(ImgStream) 
ImgStream.Dispose() 
con.Close() 

類型 '的System.OutOfMemoryException' 的未處理的異常發生在System.Drawing.dll程序

其他信息:內存。

調試是突出BackgroundImage =線,如果我改變BackgroundImage只是Image,程序工作。但我以這種方式犧牲了佈局選項。

爲什麼這個錯誤發生,只有當它是BackgroundImage

+0

如果你使用' Image.FromStream(ImgStream,False,True)',你會得到不同的異常嗎?該代碼驗證(第三個參數爲True)圖像數據。 – FrankPl

+0

它可能也取決於如何和保存到數據庫 - 可能是不正確的保存。看看你是否可以從數據庫創建一個圖像並將其保存到磁盤,以便您可以檢查它。 – Plutonix

+0

SQL Server上的數據類型是Image。它以十六進制格式存儲圖像 - 無論如何,從它的外觀來看。 – user3224987

回答

0

設置一個斷點閱讀,然後當它命中該斷點按F10一次,然後檢查並確保你有東西,它的確是二進制文件(影像)...

Dim cmd as New SqlCommand("SELECT DP FROM PersonsA WHERE Members_ID = 1", con) 
Dim reader as SqlDataReader = cmd.ExecuteReader() 
Dim obj as Object, B() as Byte 

If reader.HasRows Then 
    While reader.Read() 
     obj = reader.GetValue(0) 
     Exit While 
    End While 
    If Not IsDBNull(obj) Then 
     B = DirectCast(obj, Byte()) 
     Using ms as New IO.MemoryStream(B) 
      PictureBox2.BackgroundImage = Image.FromStream(ms) 
     End Using 
    End If 
End If 
+0

爲什麼ExecuteScalar不能工作?此外,它是'HasRows'(複數),並且在代碼中缺少'reader.Read()'語句。 – LarsTech

+0

那麼你可以,我使用的讀者,因爲有可能不止一行從該查詢返回。除此之外,如果「我們」知道他只返回一個值,您仍然可以使用定標器。並且謝謝@LarsTech指出閱讀和註釋,從手機做出來並不是我想說的最好的解決方案... – Codexer

+1

如果你只需要一行,你可以使用'If reader.Read Then'和消除'HasRows'檢查和'While'循環。 – LarsTech