2

C#を使用してMicrosoftAccessデータベースを読み取ろうとしています。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

データベースから添付ファイルを読み取る方法はありますか?

4

2 に答える 2

4

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を使用したMicrosoftAccess添付ファイルタイプのフィールドのプログラムによる管理

于 2012-08-05T19:55:12.193 に答える
1

少し注意が必要ですが、添付ファイルの列をクエリするだけでなく、ファイル名のみを取得できます。添付ファイル列の添付ファイルオブジェクトから値を選択し、バイト配列(filedataに格納されている)をプルしてから、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によって圧縮されることに注意してください。詳しくはこちらをご覧ください。これがあなたのために働くことを願っています!

于 2013-11-14T21:43:02.780 に答える