Обработка полей типа Attachment в MS Access с использованием ADO

У меня есть некоторые поля в моей базе данных, которые должны хранить изображения (растровые изображения, JPG или PNG) и PDF (или Excel / RTF / TXT) файлы. Просматривая Интернет, я узнал, что MS Access 2007 (и более новые версии) имеют поле типа Attachment это может удовлетворить мои потребности.

Тем не менее, я заполняю базу данных через графический интерфейс (сделано в C++ а также WinAPI ), с помощью ADO, Мне не удалось найти пример вставки / загрузки таких данных в / из базы данных с помощью ADO, Просматривая здесь несколько похожих вопросов (VB, Delphi, Python …), я обнаружил, что мой подход может быть не самым лучшим, но кажется возможным сделать.

Будучи неопытным, и поскольку я впервые решаю задачу такого типа, я прошу сообщество помочь мне решить эту задачу. Поэтому мой вопрос:

  • Как я должен обрабатывать вставку / загрузку данных этого типа (изображения, документы …) в / из базы данных MS Access 2007 (или выше), используя ADO?

Можете ли вы предоставить небольшой фрагмент кода, который иллюстрирует вставку / загрузку таких данных в / из базы данных, используя ADO?

Спасибо.

2

Решение

Если вы планируете использовать только приложение C ++ в качестве внешнего интерфейса и не ожидайте, что пользователи будут открывать базу данных в самом Access, тогда я предлагаю вам избегать использования Attachment тип поля. Вместо этого используйте отдельную дочернюю таблицу с именем [Attachments] с отношением «один ко многим» (ограничение внешнего ключа) между таблицей [Attachments] и родительской таблицей (где вы рассматривали возможность использования Attachment поле). Затем сохраните документы как необработанные двоичные данные в OLE Object (длинное двоичное) поле в дочерней таблице.

Attachment Тип поля предлагает несколько преимуществ для приложений, которые используют интерфейс доступа. Поддержка нескольких вложений в одну запись базы данных может быть столь же простой, как удаление Attachment контроль над формой доступа. Вложения также могут быть доступны из представления таблицы, хотя все, что вы видите, это значок «скрепка».

Полями вложений можно манипулировать из кода, но только с помощью ACE DAO Recordset2 объект (пример Вот). Чтобы иметь возможность сохранять несколько вложений на запись, компонент Access Database Engine использует скрытую дочернюю таблицу. Можно извлечь некоторую информацию в запрос SELECT, используя «магические» квалификаторы имени поля (например, Field1.FileName) но ни ADO, ни ODBC не могут вставлять или вставлять в поля записи вложения.

Поскольку вы не будете использовать интерфейс доступа для своего приложения

  1. вы не сможете использовать многие из преимуществ, которые предлагает поле «Вложение», и
  2. вы все еще можете манипулировать полем Attachment через ACE DAO из вашего приложения C ++, но это будет неприятно.

Одно (возможно) существенное преимущество, которое вы можете упустить, не используя Attachment поле базы данных Access автоматически сжимает файлы в Attachment поле, но сырые двоичные данные в OLE Object поле хранится без сжатия. Если все файлы, которые вы намереваетесь сохранить, все равно были в сжатом формате (например, JPEG, .docx, .xlsx), то это не будет проблемой. Однако, если вы планируете хранить много больших документов в несжатых форматах (например, .txt, .rtf), то может возникнуть проблема с переполнением файла. В этом случае ваше приложение C ++ может автоматически сжимать эти документы (возможно, используя GZipStream) перед сохранением и распаковкой при извлечении.

3

Другие решения