2016-11-05 24 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

[out of memory Image.FromFile](http://stackoverflow.com/questions/3848132/out-of-memory)の可能な複製-image-fromfile) – GSerg

+0

イメージが大きい場合は、イメージをどこかにアーカイブし、ファイル名だけを保存することを検討してください。あなたの読者は、複数の画像を作成することができるループを読むように設定されています。前のものは一切廃棄されていません。 – Plutonix

+0

箱にRAMスティックを少し追加してください。 –

答えて

1

エラーは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) 
0

は、あなたのバイト配列を画像に変換し、これを試してみてください。

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