使用OLE-DB从数据库中读取附加文件

本文关键字:文件 读取 OLE-DB 数据库 使用 | 更新日期: 2024-10-21 13:19:09

我正在尝试使用C#读取Microsoft Access数据库。我正在使用OLE-DB类。问题是这个代码

OleDbDataReader reader = Command.ExecuteReader(); 
while (reader.Read())
{
    Console.WriteLine(reader.GetFieldType(0) + "'t" + reader.GetFieldType(1) + "'t" + reader.GetFieldType(2) +
            "'t" + reader.GetFieldType(3) + "'t" + reader.GetFieldType(4) + "'t" + reader.GetFieldType(5));
}

告诉我,第5个字段来自数据类型字符串。但这是一个附加文件。当我试图读取这个字符串时,它是空的

System.Int32    System.String   System.String   System.Int32    System.DateTime    System.String

有没有办法从数据库中读取附加文件?

使用OLE-DB从数据库中读取附加文件

我知道你要求OleDb,但有了DAO,你可以说这样的话:

    DBEngine dbe = new DBEngine();
    Database db = dbe.OpenDatabase(@"z:'docs'test.accdb", false, false, "");
    Recordset rs = db.OpenRecordset("SELECT TheAttachment FROM TheTable", 
        RecordsetTypeEnum.dbOpenDynaset, 0, LockTypeEnum.dbOptimistic);
    Recordset2 rs2 = (Recordset2)rs.Fields["TheAttachment"].Value;
    Field2 f2 = (Field2)rs2.Fields["FileData"];
    f2.SaveToFile(@"z:'docs'ForExample.xls");
    rs2.Close();
    rs.Close();

参考:使用.NET 以编程方式管理Microsoft Access Attachment类型字段

这有点棘手,但不能只查询附件列,只能获得文件名。您必须从附件列中的附件对象中选择值,并提取字节数组(存储在文件数据中),然后通过Access删除添加到文件中的头:

var connection = new OleDbConnection(connectionString);
connection.Open();
var dt = new DataTable("Attachments");
var dataAdapter = new OleDbDataAdapter(@"select attachmentColumn.FileData as filedata, attachmentColumn.FileName as filename, attachmentColumn.FileType as filetype from tablename", connection);
dataAdapter.Fill(dt);
foreach (DataRow row in dt.Rows)
{
  var filename = row["filename"].ToString();
  if (string.IsNullOrWhiteSpace(filename)) continue;
  var filedata = (byte[]) row["filedata"];
  int header = (int) filedata[0];
  byte[] actualFile = new byte[filedata.Length - header];
  Buffer.BlockCopy(filedata, header, actualFile, 0, actualFile.Length);
  // do stuff with byte array!
  File.WriteAllBytes("C:''" + filename, actualFile);
}

请记住,未压缩的文件将由Access压缩。点击此处了解更多信息。希望这对你有用!