2014-06-20 2 views
0

VB.NET 2012Stockage/Récupération des images avec accès et VB.NET 2012

J'ai une image, un fichier mdb, et un mal de tête ...

J'ai créé une table qui aura un champ de chemin, un champ de nom et un champ d'objet pour stocker une image dans Access. Assez facile à exécuter:

CREATE TABLE DATATABLE (FilePath CHAR, FileName CHAR, FileObject LONGBINARY) 

Mon problème maintenant? SOMEHOW obtenir une image dans et hors de cette table. Cela semble que cela devrait être facile à faire - mais je me suis cogné la tête avec des méthodes obsolètes Append/GetChunk, des méthodes WriteBLOBToFile qui ne fonctionnent pas, et tout le reste. Google est généralement mon ami, mais aujourd'hui, je reçois de l'aide qui ne fonctionne tout simplement pas.

Quelqu'un a-t-il un moyen d'obtenir une image dans et hors de la table mentionnée ci-dessus? Cela semble vraiment devoir être simple.

Et s'il vous plaît - autant que je préfère stocker les images dans le système de fichiers plutôt que cela, les spécifications appellent pour le stockage d'image dans Access. Pas moyen de contourner cela. Merci pour toute aide à ce sujet !!!

Merci,

Jason

+0

Si la colonne est OLEObject, vous pouvez simplement utiliser un flux de mémoire pour enregistrer l'image. Lorsque vous le lisez, il revient en tant que Byte() à partir de laquelle un nouveau MemoryStream temporaire peut être créé jusqu'à ce que l'image réelle soit nécessaire. – Plutonix

+0

Vous mentionnez un fichier .mdb, pas un fichier .accdb. Avez-vous besoin d'insérer l'image de telle sorte qu'elle puisse être utilisée par les anciennes versions de l'application Access elle-même? (Autrement dit, doit-il être stocké en tant qu'objet OLE au lieu de seulement les octets d'image brute?) –

Répondre

0

Comme suggéré, vous pouvez utiliser un MemoryStream d'intermédiaire si vous n'avez pas besoin de stocker les données de telle sorte qu'il peut être consulté comme une image dans Access.

Private Sub SaveImage(picture As Image, id As Integer) 
    Dim connection As New OleDbConnection("connection string here") 
    Dim command As New OleDbCommand("UPDATE MyTable SET Picture = @Picture WHERE ID = @ID", connection) 

    '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("@Picture", stream.GetBuffer()) 
    End Using 

    command.Parameters.AddWithValue("@ID", id) 

    connection.Open() 
    command.ExecuteNonQuery() 
    connection.Close() 
End Sub 

Private Function LoadImage(id As Integer) As Image 
    Dim connection As New OleDbConnection("connection string here") 
    Dim command As New OleDbCommand("SELECT Picture FROM MyTable WHERE ID = @ID", connection) 

    command.Parameters.AddWithValue("@ID", id) 

    connection.Open() 

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

    connection.Close() 

    Dim picture 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. 
     picture = Image.FromStream(stream) 
    End Using 

    Return picture 
End Function