3

我正在尝试使用 AxHost.GetPictureFromIPicture() 从 MS Access 2013 数据库文件 (*.accdb) 中获取 GIF 图像(保存为附件类型) - 将其转换为图像,以便我可以在 PictureBox 中显示它。但是方法不存在!:( 我错过了什么吗?我需要设置或安装 smtg 吗?

如果没有转换,我会收到此错误:“无法将 'System.__ComObject' 类型的 COM 对象转换为类类型 '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();
4

1 回答 1

2

AxHost 类的文档说

您通常不直接使用 AxHost 类。您可以使用 Windows 窗体 ActiveX 控件导入器 (Aximp.exe) 生成扩展 AxHost 的包装器。

我必须承认我没有尝试过这种方法。据我所知,从 Access 数据库的附件字段中可靠地提取文件的唯一方法是使用.SaveToFile()ACE DAOField2对象的方法。在您的情况下,代码将如下所示:

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);
    }

}
于 2015-01-04T18:22:00.750 回答