Доступ к BLOB-полям Microsoft Access 2003 и 2007 из .Net

Мне нужно иметь возможность извлекать большие двоичные объекты как из Access 2003, так и из Access 2007. Access 2003 хранит большие двоичные объекты как «объекты OLE», а Access 2007 предоставляет вам еще один вариант - «вложение». Основное отличие состоит в том, что в одну строку можно добавить несколько вложений, тогда как для каждого типа данных «объект OLE» может быть только один большой двоичный объект.

Я должен иметь возможность сделать это без использования взаимодействия, поскольку я не могу принудительно установить зависимость от установленного Office. Остается либо DAO, либо ADO. Итак, я написал код для использования обеих технологий для извлечения больших двоичных объектов из тестовой базы данных с множеством встроенных типов файлов.

У меня проблема в том, что кажется, что Access оборачивает встроенные файлы в какой-то тип метаданных. Конечный результат состоит в том, что однажды извлеченный файл уже не тот и не может быть открыт ассоциированным приложением, поскольку он «поврежден». Access хранит в этих метаданных такие вещи, как исходное имя файла и т. Д. Мне нужно удалить эти метаданные из файлов, чтобы файл оставался в исходном состоянии.

Есть ли какая-нибудь темная магия вуду, которая может это сделать? Документации по этому вопросу очень мало. Любая помощь будет оценена.

Заранее спасибо.


person Qerim Shahini    schedule 24.05.2010    source источник
comment
Когда вы говорите ADO, вы имеете в виду ADODB.Stream?   -  person Fionnuala    schedule 24.05.2010
comment
В Jet / ACE поля BLOB и OLE представляют собой два разных типа данных. Первое - это чисто двоичное поле с произвольными данными, хранящимися в нем в соответствии с вашими потребностями. С другой стороны, поле OLE имеет стандартную оболочку для двоичного содержимого, которая управляет тем, как внедренный в него объект открывается и манипулируется.   -  person David-W-Fenton    schedule 24.05.2010
comment
Я не уверен, что вы сможете сделать то, что вам нужно, без автоматизации. Вы смотрели на утилиту для извлечения OLE Стивена Лебанса? lebans.com/oletodisk.htm - код в этой базе данных может дать вам некоторое представление о как это делается в Access, и, таким образом, может дать вам представление о том, что возможно без автоматизации (или без нее).   -  person David-W-Fenton    schedule 24.05.2010
comment
Спасибо за подсказку по поводу OleToDisk. Я посмотрю и посмотрю, что я могу придумать. Кроме того, я нашел фрагменты, которые описывают удаление первых X байтов из массива байтов в зависимости от типа файла, что может быть тем, что мне нужно сделать, чтобы это заработало. Проблема в том, что это похоже на ковыряние в темноте, поскольку нет спецификации того, что на самом деле происходит, когда файл упакован.   -  person Qerim Shahini    schedule 25.05.2010
comment
Я слышу тебя. У меня был проект, в котором мы хранили документы всех типов (Word, Excel, Powerpoint) в полях OLE, и когда пришло время переходить на другое приложение, мы не могли извлечь данные. К тому времени большая часть его была устаревшей, поэтому они не беспокоились, но это подтвердило для меня, что хранить документы в базе данных - не лучшая идея.   -  person David-W-Fenton    schedule 25.05.2010


Ответы (1)


Это происходит потому, что объекты OLE хранятся в Access как «изображения». Это приводит к проблемам с производительностью, а также к проблемам, подобным вашей. Чтобы справиться с этими ограничениями, Microsoft представила в Access 2007/2010 поля вложений, которым не требуются серверы OLE для запуска содержимого. Вложения, которые должны быть более одного файла на запись, автоматически управляются за кулисами с помощью MS-Access. Возможно, вам стоит использовать вложения или изменить свою базу данных для SQL Server, MY-SQL, Firebird.

person Alex    schedule 09.02.2011