(mój oryginalny odpowiedź na to pytanie jest mylące To działało w porządku dla plików PDF, które następnie zostały otwarte za pomocą programu Adobe Reader, ale tak się nie stało. zawsze działa poprawnie dla innych typów plików. Poniżej znajduje się poprawiona wersja.)
Niestety, nie możemy bezpośrednio pobrać zawartości pliku w polu Access Attachment
używając OleDb. Aparat baz danych programu Access dodaje niektóre metadane do binarnej zawartości pliku, a metadane są uwzględniane, jeśli pobierzemy .FileData
za pośrednictwem OleDb.
Aby to zilustrować, dokument o nazwie "Dokument1.pdf" jest zapisywany w polu Załącznik przy użyciu interfejsu użytkownika Access. Początek tego pliku PDF wygląda następująco:

Jeśli używamy poniższy kod, żeby spróbować wyodrębnić plik PDF na dysku
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = con;
cmd.CommandText =
"SELECT Attachments.FileData " +
"FROM AttachTest " +
"WHERE Attachments.FileName='Document1.pdf'";
using (OleDbDataReader rdr = cmd.ExecuteReader())
{
rdr.Read();
byte[] fileData = (byte[])rdr[0];
using (var fs = new FileStream(
@"C:\Users\Gord\Desktop\FromFileData.pdf",
FileMode.Create, FileAccess.Write))
{
fs.Write(fileData, 0, fileData.Length);
fs.Close();
}
}
}
następnie plik wynikowy będzie obejmować metadane na początku pliku (20 bajtów w tym przypadku)

Program Adobe Reader może otworzyć ten plik, ponieważ jest wystarczająco odporny, aby zignorować wszelkie "śmieci", które mogą pojawić się w pliku przed podpisaniem "% PDF-1.4". Niestety nie wszystkie formaty plików i aplikacje są na początku pliku tak wybaczające dla obcych bajtów.
tylko Dziennik ™ sposób pobierania plików z pola w dostępie Attachment
jest użycie metody obiektu ACE DAO Field2
.SaveToFile
, tak:
// required COM reference: Microsoft Office 14.0 Access Database Engine Object Library
//
// using Microsoft.Office.Interop.Access.Dao; ...
var dbe = new DBEngine();
Database db = dbe.OpenDatabase(@"C:\Users\Public\Database1.accdb");
Recordset rstMain = db.OpenRecordset(
"SELECT Attachments FROM AttachTest WHERE ID=1",
RecordsetTypeEnum.dbOpenSnapshot);
Recordset2 rstAttach = rstMain.Fields["Attachments"].Value;
while ((!"Document1.pdf".Equals(rstAttach.Fields["FileName"].Value)) && (!rstAttach.EOF))
{
rstAttach.MoveNext();
}
if (rstAttach.EOF)
{
Console.WriteLine("Not found.");
}
else
{
Field2 fld = (Field2)rstAttach.Fields["FileData"];
fld.SaveToFile(@"C:\Users\Gord\Desktop\FromSaveToFile.pdf");
}
db.Close();
Zauważ, że jeśli spróbuje użyć .Value
obiektu Field2 nadal otrzymasz metadane na początku sekwencji bajtów; Proces, który go usuwa, to proces .SaveToFile
.
Bardzo interesujące, szukałem czegoś takiego i nie mogę go znaleźć. – Steve
Gord, jesteś mężczyzną. Dzięki. –
Jak można wyodrębnić tablicę plików z kolumny Załączniki? –