2015-01-04 4 views
2

Я пытаюсь использовать AxHost.GetPictureFromIPicture() для получения изображения GIF (сохраненного как тип вложения) из файла базы данных MS Access 2013 (* .accdb) - преобразуйте его в Image, чтобы я мог отображать его в PictureBox. Но метода нет! :(Мне что-то не хватает? Нужно ли устанавливать или устанавливать smtg?Отсутствует метод AxHost.GetPictureFromIPicture(), извлекающий изображение (вложение) из базы данных MS Access

Без преобразования Я получаю эту ошибку: «Невозможно передать COM-объект типа« System .__ ComObject »в тип класса« System.Drawing.Image » "

ли я на самом деле делать все это правильный путь? Или есть лучшее решение? Пожалуйста, помогите мне.

DBEngine dbe = new DBEngine(); 
Database db = dbe.OpenDatabase("Database1.accdb", false, false, ""); 
Recordset rs = db.OpenRecordset("select solution from tab2 where id = 1", RecordsetTypeEnum.dbOpenDynaset, 0, LockTypeEnum.dbOptimistic); 
rs.MoveFirst(); 

object o = rs.Fields[0].Value; 
Image img = (Image)o; -> error 
Image img = AxHost.GetPictureFromIPicture(o); - the method is missing 
pictureBox1.Image = img; 

rs.Close(); 

ответ

2

документация для AxHost Class говорит

You typically do not use the AxHost class directly. You can use the Windows Forms ActiveX Control Importer (Aximp.exe) to generate the wrappers that extend AxHost.

Должен признаться, что я не пробовал этот подход. Насколько я знаю, единственный способ надежного извлечения файла из поля Attachment в базе данных Access - использовать метод .SaveToFile() объекта ACE DAO Field2. В вашем случае код будет выглядеть примерно так:

public partial class Form1 : Form 
{ 
    string tempFileName; 
    Image img; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     DBEngine dbe = new DBEngine(); 
     Database db = dbe.OpenDatabase(@"C:\Users\Public\AttachmentsDB.accdb"); 
     Recordset rsMain = db.OpenRecordset(
       "select solution from tab2 where id = 1", 
       RecordsetTypeEnum.dbOpenSnapshot); 
     Recordset2 rsAttach = rsMain.Fields["solution"].Value; 
     tempFileName = System.IO.Path.GetTempPath() + "\\" + rsAttach.Fields["FileName"].Value; 
     try 
     { 
      System.IO.File.Delete(tempFileName); 
     } 
     catch { } 
     Field2 fldAttach = (Field2)rsAttach.Fields["FileData"]; 
     fldAttach.SaveToFile(tempFileName); 
     rsAttach.Close(); 
     rsMain.Close(); 
     db.Close(); 
     img = Image.FromFile(tempFileName); 
     pictureBox1.Image = img; 
    } 

    private void Form1_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     img.Dispose(); 
     System.IO.File.Delete(tempFileName); 
    } 

}