2016-11-05 1 views
1

J'insère et récupère une image de ma base de données. Je peux maintenant insérer mais j'ai du mal à récupérer le fichier. J'ai utilisé varbinary (max) comme type de données de l'image.Mémoire insuffisante dans vb.net

Ceci est mon code pour insérer:

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 

et voilà comment je récupérer:

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 

Mon problème est, il dit DE MÉMOIRE chaque fois que je lance mon programme. Comment le résoudre? La taille de l'image que je récupère est de 2 Mo. J'utilise memorystream et ce que j'ai recherché le plus utilisé filestream. Je crois que c'est différent à certains égards.

+0

Copie possible de [hors de la mémoire Image.FromFile] (http://stackoverflow.com/questions/3848132/out-of-memory -image-fromfile) – GSerg

+0

Pour une image de cette taille, envisagez d'archiver les images quelque part et de ne sauvegarder que le nom du fichier. Votre lecteur est configuré pour lire dans une boucle ce qui signifie que vous pourriez créer plusieurs images - aucun des précédents n'est disposé – Plutonix

+0

Il suffit d'ajouter quelques bâtonnets de RAM à votre boîte –

Répondre

1

L'erreur est due à memoryStream devrait être ouvert tout le temps.

Pour résoudre ce problème, utilisez la fonction suivante pour obtenir l'image du tableau d'octets

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 

Appelez la fonction pour remplir PictureBox1:

PictureBox1.Image = byteArrayToImage(imageData) 
0

Essayez ceci pour convertir votre tableau d'octets à l'image:

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