我必须从.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不是一个选项。
有没有办法获得附件?其他技术和编程语言也是可以接受的。
答案 0 :(得分:3)
感谢Steve,我发现了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();
using System.Linq;
需要 Skip(20)
(请参阅链接)。
对于pdf和jpg,元数据是20个字节。请注意,它可能因其他文件类型而异。
答案 1 :(得分:0)
我不确定标题格式是什么,但第一个字节会告诉你标题的长度,以扩展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的附件数量,但是需要更多的测试才能看出这是否是案件。