我正在尝试使用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();发布于 2015-01-05 02:22:01
AxHost Class的文档中写道
通常不直接使用AxHost类。可以使用Windows Forms ActiveX控件导入程序(Aximp.exe)生成扩展AxHost的包装。
我必须承认我没有尝试过这种方法。据我所知,从Access数据库的附件字段中可靠地提取文件的唯一方法是使用ACE Field2对象的.SaveToFile()方法。在您的示例中,代码将如下所示:
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);
}
}https://stackoverflow.com/questions/27768044
复制相似问题