Недостаточно памяти в vb.net

Я вставляю и извлекаю изображение из своей базы данных. Теперь я могу вставить, но мне трудно получить файл. Я использовал varbinary(max) в качестве типа данных изображения.

Это мой код для вставки:

Dim ms As New MemoryStream
PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat)
Dim img() As Byte
img = ms.ToArray()

cmd.CommandText = "insert into stud values ('" & studno.Text & "', '" & password.Text & "', '" & fname.Text & "', '" & mname.Text & "', '" & lname.Text & "', @img, '" & gender.Text & "', '" & mm.Text & "/" & dd.Text & "/" & yyyy.Text & "', '" & phone.Text & "', '" & address.Text & "', 'Student', '" & secquest.Text & "', '" & answersq.Text & "', '" & TextBox1.Text & "', '" & ComboBox1.Text & "')"

cmd.Parameters.Add("@img", SqlDbType.VarBinary).Value = img

и вот как я получаю:

con.Open()
cmd.CommandText = "select * from stud where studentno = 'mnb'"
cmd.Connection = con
dr = cmd.ExecuteReader()

While dr.Read()

    studnum.Text = dr.Item("studentno")
    fname.Text = dr.Item("fname")
    mname.Text = dr.Item("mname")
    lname.Text = dr.Item("lname")
    gender.Text = dr.Item("gender")
    section.Text = dr.Item("seccode")
    bday.Text = dr.Item("bday")
    phone.Text = dr.Item("phoneno")
    address.Text = dr.Item("maddress")

    Dim imageData As Byte() = DirectCast(dr("pic"), Byte())
    If Not imageData Is Nothing Then
        Using ms As New MemoryStream(imageData, 0, imageData.Length)
            ms.Write(imageData, 0, imageData.Length)
            PictureBox1.BackgroundImage = Image.FromStream(ms, True)
        End Using
    End If

End While

Моя проблема в том, что всякий раз, когда я запускаю свою программу, он говорит OUT OF MEMORY. Как это решить? Размер изображения, которое я получаю, составляет 2 МБ.

Я использую поток памяти и то, что я исследовал наиболее часто используемый файловый поток. Я считаю, что это в некотором смысле отличается.


person ABCDE    schedule 05.11.2016    source источник
comment
Возможный дубликат out of memory Image.FromFile   -  person GSerg    schedule 05.11.2016
comment
Для такого большого изображения подумайте о том, чтобы заархивировать изображения где-нибудь и просто сохранить только имя файла. Ваш ридер настроен на чтение в цикле, что означает, что вы можете создавать несколько изображений - ни одно из предыдущих не удаляется.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 05.11.2016
comment
Просто добавьте несколько планок оперативной памяти в свою коробку   -  person T.S.    schedule 05.11.2016
comment
@GSerg, я думаю, что нет. Эта тема, к сожалению, не помогла мне решить мою проблему.   -  person ABCDE    schedule 05.11.2016
comment
@Plutonix надежно ли сохранять только имя файла? мог ли я не столкнуться с проблемами по этому методу?   -  person ABCDE    schedule 05.11.2016
comment
Проблема с сохранением изображений заключается в том, что это раздувает БД и требует больше времени для извлечения данных и восстановления из них изображения, чем просто для его чтения. ЕСЛИ вы собираетесь сохранить изображение, вы должны создать изображение из байтовых данных. этот метод ms.Write не нужен, потому что в memstream уже есть все данные.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 05.11.2016
comment
(Я не знаю, какие проблемы вы ожидаете)   -  person Ňɏssa Pøngjǣrdenlarp    schedule 05.11.2016
comment
сэр, вы имеете в виду сохранение пути к изображению вместо самого изображения?   -  person ABCDE    schedule 05.11.2016
comment
если это так, что, если я перемещу изображение, у меня возникнут проблемы при извлечении, верно?   -  person ABCDE    schedule 05.11.2016
comment
На самом деле, когда я это делаю, я сохраняю файл в папке AppData, добавляю что-то к имени (например, ПК), а затем сохраняю только имя файла. Местоположение пути можно добавить обратно, чтобы загрузить файл, таким образом, вы можете перемещать папку с изображениями, ничего не нарушая.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 05.11.2016
comment
GDI+ может выдавать бесполезные сообщения об ошибках. Чтобы убедиться, что данные изображения соответствуют вашим ожиданиям, запишите данные изображения в файл и попробуйте открыть его с помощью средства просмотра изображений. (Хотя сохранение изображения в виде отдельного файла, как сказал Plutonix, обычно было бы лучше.)   -  person Andrew Morton    schedule 05.11.2016
comment
@ABCDE В этом вопросе перечислены причины, которые могут вызвать исключение нехватки памяти, и напоминание о том, что вы не должны закрывать поток. Чтобы убедиться, что это не дубликат, пожалуйста, исключите указанные случаи (ваши сохраненные данные не повреждены? Ваше изображение в правильном формате? Можно ли просмотреть его, если вы выгрузите его в файл? Что такое формат и поддерживается ли он? GDI+?) и не закрывать поток, который должен оставаться открытым, пока существует образ, созданный из него.   -  person GSerg    schedule 05.11.2016
comment
Какой версией sql server вы подключены?   -  person M.Hassan    schedule 06.11.2016
comment
@M.Hassan sql-сервер 2012   -  person ABCDE    schedule 06.11.2016


Ответы (2)


Ошибка связана с тем, что memoryStream должен быть открыт все время.

Чтобы решить эту проблему, используйте следующую функцию для получения изображения из массива байтов.

    Public Function byteArrayToImage(byteArrayIn As Byte()) As Image
        Dim img As Image = Nothing           
            Dim ms As New MemoryStream(byteArrayIn, 0, byteArrayIn.Length)
            ms.Write(byteArrayIn, 0, byteArrayIn.Length)
            img = Image.FromStream(ms, True)             
        Return img
    End Function

Вызовите функцию для заполнения PictureBox1:

  PictureBox1.Image = byteArrayToImage(imageData)
person M.Hassan    schedule 06.11.2016

Попробуйте это, чтобы преобразовать массив байтов в изображение:

Public Function byteArrayToImage(byteArrayIn As Byte()) As Image
   Using mStream As New MemoryStream(byteArrayIn)
       Return Image.FromStream(mStream)
   End Using
End Function
person Maksim Sestic    schedule 06.11.2016