C# 从 Access .accdb 读取附件

Posted

技术标签:

【中文标题】C# 从 Access .accdb 读取附件【英文标题】:C# read attachments from Access .accdb 【发布时间】:2015-02-28 20:22:43 【问题描述】:

我必须从 .accdb 文件中读取一个表并将其迁移到数据库。 我无法在将执行迁移的服务器上安装 MS Access! 目前我使用 ODBC

OdbcConnection DbConnection = new OdbcConnection("DSN=SAMPLE_ISAM");
DbConnection.Open();
OdbcCommand DbCommand = DbConnection.CreateCommand();
DbCommand.CommandText = "SELECT Attachments FROM SomeTable";
OdbcDataReader DbReader = DbCommand.ExecuteReader();
while (DbReader.Read())

    object att = DbReader["Attachments"];

DbReader.Close();
DbCommand.Dispose();
DbConnection.Close();

SAMPLE_ISAM 指向 accdb 文件。 这适用于简单数据类型,但对于附件它只获取文件名(我还需要字节)。

正如我所说,无法安装 MS Access,因此不能选择 Interop DAO。

有没有办法获取附件?其他技术和编程语言也是可以接受的。

【问题讨论】:

查看这个答案:***.com/questions/25864092/… @Steve 谢谢,帮了大忙。 “无法安装 MS Access,因此不能选择 Interop DAO” - 不正确。如果服务器安装了 Access 数据库引擎 - 您必须拥有它才能使用 ACE ODBC 或 ACE OLEDB - 那么您可以使用带有 COM 参考“Microsoft Office 14.0 Access Database Engine Object Library”的 ACE DAO 数据访问层。如果您想自动化 Access 的一个实例,那么是的,您需要安装完整的 Access 应用程序,并且在您的 .NET 项目中使用“Microsoft Access 14.0 Object Library”COM 引用。但是,ACE DAO 数据访问不需要 Access 自动化 【参考方案1】:

感谢史蒂夫,我找到了这个Extracting files from an Attachment field in an Access database

所以工作代码是:

            OdbcConnection DbConnection = new OdbcConnection("DSN=SAMPLE_ISAM");
            DbConnection.Open();
            OdbcCommand DbCommand = DbConnection.CreateCommand();
            DbCommand.CommandText = "SELECT Attachments.FileData, ID, Attachments.FileName FROM Complaints WHERE ID IN(29,30)";
            OdbcDataReader DbReader = DbCommand.ExecuteReader();
            int fCount = DbReader.FieldCount;
            while (DbReader.Read())
            
                byte[] bytes = (byte[])DbReader[0];
                Int32 ID = (Int32)DbReader[1];
                string name = (string)DbReader[2];
                File.WriteAllBytes(@"D:\files\" + name, bytes.Skip(20).ToArray());
            
            DbReader.Close();
            DbCommand.Dispose();
            DbConnection.Close();

Skip(20) 需要using System.Linq;(请参阅链接)。 pdf 和 jpg 的元数据为 20 字节。请注意,它可能因其他文件类型而异。

【讨论】:

“pdf 和 jpg 的元数据为 20 字节。请注意,它可能因其他文件类型而异。” - 是的。事实上,对于具有相同内容的两个 JPEG 文件,元数据的大小将取决于文件扩展名(“.jpg”与“.jpeg”)。【参考方案2】:

我不确定标题格式是什么,但是第一个字节会告诉您标题的长度,以扩展 evgeni 的示例:

        OdbcConnection DbConnection = new OdbcConnection("DSN=SAMPLE_ISAM");
        DbConnection.Open();
        OdbcCommand DbCommand = DbConnection.CreateCommand();
        DbCommand.CommandText = "SELECT Attachments.FileData, ID, Attachments.FileName FROM Complaints WHERE ID IN(29,30)";
        OdbcDataReader DbReader = DbCommand.ExecuteReader();
        int fCount = DbReader.FieldCount;
        while (DbReader.Read())
        
            byte[] bytes = (byte[])DbReader[0];
            Int32 ID = (Int32)DbReader[1];
            string name = (string)DbReader[2];
            File.WriteAllBytes(@"D:\files\" + name, bytes.Skip((int)bytes[0]).ToArray());
        
        DbReader.Close();
        DbCommand.Dispose();
        DbConnection.Close();

但我认为如果附件中有多个文件,这将不起作用...怀疑标题还告诉偏移量 5 处有多少附件,但需要更多测试来查看这是否是案子。

【讨论】:

以上是关于C# 从 Access .accdb 读取附件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 自动化从访问数据库(.accdb)中读取所有记录

如何区分 Outlook 2010 中的内联图像和附件 [C#]

从 Access 2007 导出 XML(base64 附件)

使用 Access VBA 从 Outlook 获取附件

如何使用 Windows 窗体中的 Access 附件字段?

从 C# 发送带有附件的电子邮件,附件在 Thunderbird 中作为第 1.2 部分到达