2016-11-05 4 views
1

데이터베이스에 이미지를 삽입하고 검색하고 있습니다. 이제 삽입 할 수 있지만 파일을 검색하는 데 어려움을 겪고 있습니다. varbinary (max)를 이미지의 데이터 유형으로 사용했습니다.vb.net의 메모리 부족

이것은 삽입 내 코드입니다 :

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 

내 문제는, 내가 내 프로그램을 실행할 때마다 메모리 부족했다. 그것을 해결하는 방법? 검색하는 이미지의 크기는 2MB입니다.

저는 memorystream을 사용하고 있으며 가장 많이 사용한 파일 스트림을 연구했습니다. 나는 그것이 여러면에서 다르다고 믿습니다.

+0

가능한 [메모리 부족 Image.FromFile] (http://stackoverflow.com/questions/3848132/out-of-memory -image-fromfile) – GSerg

+0

큰 이미지의 경우 이미지를 어딘가에 보관하고 파일 이름 만 저장하는 것이 좋습니다. 독자가 여러 이미지를 만들 수 있음을 의미하는 루프를 읽을 수 있도록 설정되어 있습니다. 이전 이미지는 모두 삭제됩니다. – Plutonix

+0

상자에 RAM 스틱을 몇 개만 추가하십시오. –

답변

1

오류는 memoryStream으로 인해 항상 열려 있어야합니다.

PictureBox1.Image = byteArrayToImage(imageData) 
0

이미지로 바이트 배열을 변환하려면이 시도 :

는 바이트 배열에서

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을 작성하는 기능을 이미지를 얻기 위해 다음과 같은 기능을 사용하여이 문제를 해결하려면 :

Public Function byteArrayToImage(byteArrayIn As Byte()) As Image 
    Using mStream As New MemoryStream(byteArrayIn) 
     Return Image.FromStream(mStream) 
    End Using 
End Function