2014-01-30 1 views
0

спасибо за ваш интерес.Загрузка из памяти (малого) изображения с SQL Server

Я тестирую небольшую мою программу, предназначенную для загрузки и получения изображений с SQL Server.

Когда я запускаю приведенный ниже код, я получаю ошибку «Недостаточно памяти», хотя мой компьютер имеет 8 ГБ оперативной памяти, а программа - буквально только одна форма.

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

это также может зависеть от того, как и что было сохранено в БД - возможно, это было неправильно сохранено. Посмотрите, можете ли вы создать изображение из db и сохранить его на диск, чтобы вы могли его изучить. – Plutonix

+0

Тип данных на SQL Server - это изображение. Он сохраняет изображение в шестнадцатеричном формате - от внешнего вида в любом случае. – 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

Ну, вы можете, я использовал читателя, так как там может быть больше одной строки, возвращенной из этого запроса. Помимо этого вы все еще можете использовать масштабирующее устройство, если «мы» знаем, что hes только возвращает одно значение. И спасибо @LarsTech за то, что вы указали, что прочитали и выбрали, делать это с телефона - это не лучшее решение, которое я бы сказал ... – Codexer

+1

Если вы ожидаете всего одну строку, вы можете использовать 'If reader.Read Then' и устраните проверку «HasRows» и цикл «While». – LarsTech

Смежные вопросы