C# 如何通过.NET将图像插入Access OLE字段

C# 如何通过.NET将图像插入Access OLE字段,c#,database,image,ms-access,ole,C#,Database,Image,Ms Access,Ole,我有一个Access.mdb数据库,我想插入一个来自visual C#2010中开发的应用程序的图像。图片存储在数据库的OLE对象字段中 在Access中直接添加图像后,图像以位图图像的格式存储。双击即可在Access中打开这些图片 我有以下代码: OdbcConnection Connection = new OdbcConnection(); ... sql = "INSERT INTO film (poster) VALUES (" ' " + Image.FromFile(textBox

我有一个Access.mdb数据库,我想插入一个来自visual C#2010中开发的应用程序的图像。图片存储在数据库的OLE对象字段中

在Access中直接添加图像后,图像以位图图像的格式存储。双击即可在Access中打开这些图片

我有以下代码:

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

代码运行良好,但Access将图片存储为二进制数据,无法在Access中再次打开。请告诉我如何将图像作为位图图像插入。谢谢。

这是一个有点不寻常的请求。大多数询问Access中嵌入OLE的图像的人都在询问如何将它们从OLE对象转换为原始二进制数据,而不是反过来。当前版本的Access具有类似于
Image
控件的功能,该控件可以显示位图图像,而无需处理添加到对象数据中的OLE“包装器”的复杂性

不过,这里有一种方法可以满足您的要求。它使用了一个
Access.Application
对象,因此必须在计算机上安装Access才能工作。它还需要Access数据库中的一个表单,其中

  • 表单本身绑定到包含要插入的OLE图像字段的表
  • 表单上唯一的控件是绑定到OLE字段的
    绑定对象帧

示例代码还假设正在更新的表有一个名为[ID]的数字主键字段

private void按钮1\u单击(对象发送者,事件参数e)
{
//测试数据
int-recordIdToUpdate=15;
字符串bmpPath=@“C:\Users\Gord\Pictures\bmpMe.bmp”;
var path=new System.Collections.Specialized.StringCollection();
添加路径(bmpPath);
剪贴板.SetFileDropList(路径);
//需要COM参考:
//Microsoft Access 14.0对象库
var accApp=new Microsoft.Office.Interop.Access.Application();
OpenCurrentDatabase(@“C:\Users\Public\Database1.accdb”);
accApp.DoCmd.OpenForm(
“照片形式”,
Microsoft.Office.Interop.Access.AcFormView.acNormal,
无效的
“ID=“+recordIdToUpdate”);
accApp.DoCmd.RunCommand(Microsoft.Office.Interop.Access.AcCommand.acCmdPaste);
accApp.DoCmd.Close(
Microsoft.Office.Interop.Access.AcObjectType.acForm,
“照片形式”,
Microsoft.Office.Interop.Access.AcCloseSave.acSaveNo);
accApp.CloseCurrentDatabase();
accApp.Quit();
这个。关闭();
}

我已经有了一种从ole文件中检索图片到c#程序(剪切ole头)的方法,现在我需要一种反向方法。您提出了一个非常有趣的方法,但我只需要使用C sharp工具,而不需要更改db。无论如何谢谢你@用户3260339,如您所愿。请记住,访问表单不一定必须与要更新的表位于同一数据库文件中。它可以位于带有链接表的单独Access数据库文件中。那也行。(事实上,如果包含该表的数据库文件是多用户环境中的共享后端,则这是必需的。)在OLE字段中将图像插入MS Access数据库的100%工作代码
    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();
    }