2014-06-21 1 views
0

J'ai pensé que j'avais la solution, maintenant je lance une nouvelle erreur. J'essaie de stocker et de récupérer des images dans MS Access via VB.NET. Je sais, je sais, garder les images dans la structure du fichier serait un meilleur moyen. Pas mon appel et les spécifications ne peuvent pas être changées. J'ai eu de l'aide de jmcilhinney (merci!), Semble que je peux obtenir l'image dans une table d'accès. Mais je n'arrive pas à sauvegarder le fichier sur le disque. La dernière ligne de code (picture2.Save) jette l'erreur suivante:VB.NET - Stockage/Récupération de Blobs (images) dans Access

"Une exception non gérée du type 'System.Runtime.InteropServices.ExternalException' a eu lieu dans System.Drawing.dll"

« Informations supplémentaires : Une erreur générique s'est produite dans GDI + "

C'est vraiment ... Générique. Voici mon code, toute aide serait grandement appréciée !!!

'Put the image into Access 
    Dim connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jason_000\Documents\System.accdb;Persist Security Info=False;") 
    Dim command As New OleDbCommand("INSERT INTO DATATABLE (FilePath, FileName, FileObject) VALUES (@FilePath, @FileName, @Picture)", connection) 
    Dim Picture As Image = Image.FromFile("C:\Satan.jpg") 

    connection.Open() 

    'Create an empty stream in memory. 
    Using stream As New IO.MemoryStream 
     'Fill the stream with the binary data from the Image. 
     Picture.Save(stream, Imaging.ImageFormat.Jpeg) 

     'Get an array of Bytes from the stream and assign to the parameter. 
     command.Parameters.AddWithValue("@FilePath", "C:\") 
     command.Parameters.AddWithValue("@FileName", "Satan.jpg") 
     command.Parameters.AddWithValue("@Picture", stream.GetBuffer()) 
    End Using 


    command.ExecuteNonQuery() 
    connection.Close() 




    'Get The Image Out of Access 
    Dim connection2 As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jason_000\Documents\System.accdb;Persist Security Info=False;") 
    Dim command2 As New OleDbCommand("SELECT FileObject FROM DataTable WHERE PK = @ID", connection2) 

    command2.Parameters.AddWithValue("@ID", 4) 

    connection2.Open() 

    Dim pictureData As Byte() = DirectCast(command2.ExecuteScalar(), Byte()) 

    connection2.Close() 

    Dim picture2 As Image 

    'Create a stream in memory containing the bytes that comprise the image. 
    Using stream As New IO.MemoryStream(pictureData) 

     'Read the stream and create an Image object from the data. 
     picture2 = Image.FromStream(stream) 
    End Using 

    picture2.Save("C:\Users\jason_000\Desktop\SatansBack.jpg") 
+0

@downvoter vraiment? Quel est le problème avec cette question? –

+0

Pas de doute. Quelqu'un a été downvoting chaque poste que je fais. Il va probablement downvote ce commentaire LOL! –

+0

cette erreur est parce que vous fermez le flux avant de sauvegarder l'image. Avec les images et les bitmaps créés à partir d'un flux, le flux doit rester ouvert pendant toute la durée de vie de l'image. Voir [remarques à MSDN] (http://msdn.microsoft.com/en-us/library/93z9ee4x.aspx). Déplacez le SAVE vers le haut à l'intérieur de l'UTILISATION et cette partie fonctionnerait. La réponse ci-dessous est une meilleure alternative pour couper l'homme du milieu. – Plutonix

Répondre

0

Le problème est que stream.GetBuffer() peut retourner un tableau qui est plus grand que les données qu'il contient. Vous devriez utiliser command.Parameters.AddWithValue("@Picture", stream.ToArray()) à la place.

Mieux encore sera de lire uniquement les données de fichier dans un tableau d'octets, et non dans un objet image, donc au lieu de

Dim Picture As Image = Image.FromFile("C:\Satan.jpg") 

vous devez utiliser

Dim Data As Byte() = File.ReadAllBytes("C:\Satan.jpg") 

Et au lieu de

command.Parameters.AddWithValue("@Picture", stream.GetBuffer()) 

vous utiliserez

command.Parameters.AddWithValue("@Picture", Data) 

De plus, dans ce cas, vous n'avez pas besoin de la variable stream (Using stream As New IO.MemoryStream).

+0

Essayé cela, toujours obtenir l'erreur sur la dernière ligne de code (picture2.Save). Merci quand même! –

+0

C'était le billet! A complètement disparu avec le type de données Image et est allé avec IO.File.WriteAllBytes. Merci bosonix! –

Questions connexes