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 附件)