database - 将图像存储到 Access 数据库的附件字段中

标签 database vb.net attachment oledbcommand ms-access-2013

我正在编写一个 VB 应用程序,我需要在其中将图像存储在数据库中。用户在他们的计算机上选择图像,这为我提供了字符串形式的路径。这是我的尝试,但是我收到错误消息“INSERT INTO 查询不能包含多值字段。”

这是我的代码:

Dim buff As Byte() = Nothing
Public Function ReadByteArrayFromFile(ByVal fileName As String) As Byte()
    Dim fs As New FileStream(fileName, FileMode.Open, FileAccess.Read)
    Dim br As New BinaryReader(fs)
    Dim numBytes As Long = New FileInfo(fileName).Length
    buff = br.ReadBytes(CInt(numBytes))
    Return buff
End Function

Sub ....
    Dim connImg As New OleDbConnection
    Dim sConnString As String
    Dim cmdImg As New OleDbCommand

    sConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & My.Settings.DB & ";Persist Security Info=False;"
    connImg = New OleDbConnection(sConnString)
    connImg.Open()
    cmdImg.Connection = connImg
    cmdImg.CommandType = CommandType.Text

    If d.slogo <> "" Then
        cmdImg.CommandText = "INSERT INTO Logo ( refId, [type], [img] ) VALUES(@refId, @type, @imgBinary)"
        cmdImg.Parameters.Add("@refId", OleDbType.Double).Value = refId
        cmdImg.Parameters.Add("@type", OleDbType.Double).Value = 0
        cmdImg.Parameters.Add("@imgBinary", OleDbType.VarBinary).Value = ReadByteArrayFromFile(PathToImage)
        cmdImg.ExecuteNonQuery()
    End If
    ....
End Sub

我试过在线搜索其他解决方案,但似乎我找到的所有内容都是 VB6 或 VBA 代码。我知道人们会争辩说图像不应该存储在数据库中,但在这种情况下,这是我唯一的选择。

感谢您的帮助!

最佳答案

正如您所发现的,您不能使用 SQL 语句将文件插入到 Access 数据库的 Attachment 字段中。您必须使用 ACE DAO Field2 对象的 LoadFromFile() 方法。以下 C# 代码适用于我。它改编自 Office 博客条目 here .

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Access.Dao;

namespace daoConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            // This code requires the following COM reference in your project:
            //
            // Microsoft Office 14.0 Access Database Engine Object Library
            //
            var dbe = new DBEngine();
            Database db = dbe.OpenDatabase(@"C:\__tmp\testData.accdb");
            try
            {
                Recordset rstMain = db.OpenRecordset(
                        "SELECT refId, img FROM Logo WHERE refId = 1", 
                        RecordsetTypeEnum.dbOpenDynaset);
                if (rstMain.EOF)
                {
                    // record does not already exist in [Logo] table, so add it
                    rstMain.AddNew();
                    rstMain.Fields["refId"].Value = 1;
                }
                else
                {
                    rstMain.Edit();
                }
                // retrieve Recordset2 object for (potentially multi-valued) [img] field
                //     of the current record in rstMain
                Recordset2 rstAttach = rstMain.Fields["img"].Value;
                rstAttach.AddNew();
                Field2 fldAttach = 
                        (Field2)rstAttach.Fields["FileData"];
                fldAttach.LoadFromFile(@"C:\__tmp\testImage.jpg");
                rstAttach.Update();
                rstAttach.Close();
                rstMain.Update();
                rstMain.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
}

关于database - 将图像存储到 Access 数据库的附件字段中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18764314/

相关文章:

ios - Rails 4.2 - 将图像数据作为电子邮件附件发送而不保存图像

email - 更改 CFMail 中附件的文件名

email - 使用Google Script在Gmail中插入带有超链接的文本吗?

python - pyodbc - 从 MS Access (MDB) 数据库读取主键

database - 需要有关 Oracle 10g Express Edition 的帮助

mysql - 标准 SQL SELECT * FROM TABLE 返回语法错误

vb.net - 如何将带有 "!@@@"的字符串格式函数从vb6.0迁移到vb.net?

java - 当有多个结果时使用 hibernate Criteria.uniqueResult()

database - Grails GORM映射FK而不是另一个表的PK

c# - 使用 .NET 从邮件帐户获取附件