Come inserire un’immagine in un campo OLE di accesso tramite .NET

Ho un database .mdb di Access e voglio inserire un’immagine da un’applicazione sviluppata in Visual C # 2010. Le immagini sono memorizzate nel database nel campo dell’object OLE.

Dopo aver aggiunto le immagini direttamente in Access, queste vengono memorizzate nel formato di un’immagine bitmap. Queste immagini possono essere aperte in Access con un doppio clic.

Ho il codice seguente:

OdbcConnection Connection = new OdbcConnection(); ... sql = "INSERT INTO film (poster) VALUES (" ' " + Image.FromFile(textBox8.Text) + " ' ");"; //texbox are stored the picture name OdbcCommand Command = new OdbcCommand(sql, Connection); Command.ExecuteNonQuery(); 

Il codice funziona bene, ma Access memorizza l’immagine come dati binari e non può essere riaperta in Access. Per favore dimmi come inserire l’immagine come immagine bitmap. Grazie.

    Questa è una richiesta alquanto insolita. La maggior parte delle persone che chiedono informazioni su OLE incorporate in Access chiede come convertirle da oggetti OLE in dati binari non elaborati, e non viceversa. Le versioni correnti di Access hanno funzionalità come il controllo Image che possono visualizzare immagini bitmap senza dover affrontare le complicazioni dei “wrapper” OLE che vengono aggiunti ai dati dell’object.

    Tuttavia, ecco un modo per fare ciò che hai richiesto. Utilizza un object Access.Application , quindi Access deve essere installato sulla macchina affinché funzioni. Richiede anche un modulo all’interno del database di Access dove

    • il modulo stesso è associato alla tabella contenente il campo immagine OLE che si desidera inserire,
    • l’unico controllo sul modulo è un Bound Object Frame associato, associato al campo OLE.

    PhotoForm.png

    Il codice di esempio presume inoltre che la tabella che si sta aggiornando abbia un campo numerico della chiave primaria denominato [ID].

     private void button1_Click(object sender, EventArgs e) { // test data int recordIdToUpdate = 15; string bmpPath = @"C:\Users\Gord\Pictures\bmpMe.bmp"; var paths = new System.Collections.Specialized.StringCollection(); paths.Add(bmpPath); Clipboard.SetFileDropList(paths); // COM Reference required: // Microsoft Access 14.0 Object Library var accApp = new Microsoft.Office.Interop.Access.Application(); accApp.OpenCurrentDatabase(@"C:\Users\Public\Database1.accdb"); accApp.DoCmd.OpenForm( "PhotoForm", Microsoft.Office.Interop.Access.AcFormView.acNormal, null, "ID=" + recordIdToUpdate); accApp.DoCmd.RunCommand(Microsoft.Office.Interop.Access.AcCommand.acCmdPaste); accApp.DoCmd.Close( Microsoft.Office.Interop.Access.AcObjectType.acForm, "PhotoForm", Microsoft.Office.Interop.Access.AcCloseSave.acSaveNo); accApp.CloseCurrentDatabase(); accApp.Quit(); this.Close(); } 
      private string ImageToBase64String(Image image) { using (MemoryStream stream = new MemoryStream()) { image.Save(stream, image.RawFormat); return Convert.ToBase64String(stream.ToArray()); } } private void SaveButton() { string Pic = ImageToBase64String(PicBox.Image); OleDbCommand PicSave = new OleDbCommand("INSERT INTO Picture(ID,PICTURE)VALUES(" + PicId.Text + ",'" + Pic + "')", con); con.Open(); var SaveValue = PicSave.ExecuteNonQuery(); if (SaveValue > 0) { MessageBox.Show("Record Saved", "Information"); ValueClear(); } else MessageBox.Show("Rocord Not Saved", "Erro Msg"); con.Close(); }