【问题标题】:How to insert an image into an Access OLE field via .NET如何通过 .NET 将图像插入 Access OLE 字段
【发布时间】:2014-02-25 04:51:27
【问题描述】:

我有一个 Access .mdb 数据库,我想从 Visual C# 2010 开发的应用程序中插入一张图片。图片存储在数据库中的 OLE-object 字段中。

直接在 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 中再次打开。请告诉我如何将图像作为位图图像插入。谢谢。

【问题讨论】:

    标签: c# database image ms-access ole


    【解决方案1】:

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

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

    • 表单本身已绑定到包含您要插入的 OLE 图像字段的表,
    • 表单上的唯一控件是Bound Object Frame,绑定到 OLE 字段。

    示例代码还假设正在更新的表有一个名为 [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();
    }
    

    【讨论】:

    • 我已经有了从 ole-filed 中检索图片到 c# 程序的方法(剪切 ole-header),现在我需要一个反向方法。您提出了一个非常有趣的方法,但我只需要使用 C 锐利工具来执行此操作,而无需更改任何 db。还是谢谢你!
    • @user3260339 如你所愿。请记住,Access 表单不一定必须与您正在更新的表位于同一数据库文件中。它可能位于带有链接表的单独 Access 数据库文件中。那也可以。 (事实上​​,如果包含该表的数据库文件是多用户环境中的共享后端,则需要这样做。)
    【解决方案2】:
        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();
        }
    

    【讨论】:

    • 在 OLE 字段中将图像插入 MS Access 数据库的 100% 工作代码
    猜你喜欢
    • 2014-01-06
    • 2015-02-18
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多