3

データベースには、画像 (ビットマップ、JPG または PNG ) および PDF (または Excel/RTF/TXT ) ファイルを保存する必要があるフィールドがいくつかあります。インターネットをブラウジングして、MS Access 2007 (およびそれ以降のバージョン) には、Attachment私のニーズに合ったタイプのフィールドがあることを知りました。

ただし、を使用して、GUI(C++およびで作成WinAPI)を介してデータベースに入力していますADO。を使用してデータベースに/からそのようなデータを挿入/ロードする例を見つけることができませんでしたADO。ここでいくつかの同様の質問(VB、Delphi、Python ...)を検索すると、私のアプローチが最善ではない可能性があることがわかりましたが、実行できるようです。

経験が浅く、この種のタスクに取り組むのはこれが初めてなので、コミュニティにこのタスクの解決を手伝ってもらいます。したがって、私の質問:

  • を使用して、このタイプのデータ (画像、ドキュメントなど) を MS Access 2007 (またはそれ以降) のデータベースに挿入/ロードするにはどうすればよいですADOか?

を使用してデータベースに/からそのようなデータを挿入/ロードすることを示す小さなコード スニペットを提供できますADOか?

ありがとうございました。

4

1 に答える 1

6

C++ アプリケーションをフロントエンドとしてのみ使用する予定で、ユーザーが Access 自体でデータベースを開くことを想定していないAttachment場合は、フィールド タイプの使用を避けることをお勧めします。代わりに、[Attachments] テーブルと親テーブル (フィールドの使用を検討していた場所) の間に一対多のリレーションシップ (外部キー制約) を持つ [Attachments] という名前の別の子テーブルを使用しAttachmentます。OLE Object次に、ドキュメントを生のバイナリ データとして子テーブルの (ロング バイナリ) フィールドに保存します。

フィールド型には、Access UI を使用するアプリケーションにいくつかのAttachment利点があります。Attachment1 つのデータベース レコードへの複数の添付ファイルのサポートは、コントロールを Access フォームにドロップするのと同じくらい簡単です。添付ファイルにはデータシート ビューからもアクセスできますが、表示されるのは「ペーパー クリップ」アイコンだけです。

添付フィールドはコードから操作できますが、ACE DAORecordset2オブジェクトを使用する必要があります (例はこちら)。レコードごとに複数の添付ファイルを保存できるようにするために、Access データベース エンジンは非表示の子テーブルを使用します。「魔法の」フィールド名修飾子 (例: ) を使用して一部の情報を SELECT クエリに取り込むことは可能ですField1.FileNameが、ADO も ODBC も添付ファイル フィールド エントリを INSERT または UPDATE できません。

アプリケーションで Access UI を使用しないため

  1. 添付ファイル フィールドが提供する利点の多くを使用することができなくなります。
  2. C++ アプリから ACE DAO を介して Attachment フィールドを操作することはできますが、面倒です。

フィールドを使用しないことで見逃す可能性のある (おそらく) 重要な利点の 1 つAttachmentは、Access データベース エンジンがフィールド内のファイルを自動的に圧縮しますが、Attachmentフィールド内の未加工のバイナリ データはOLE Object圧縮されずに保存されることです。保存しようとしているファイルがすべて圧縮形式 (JPEG、.docx、.xlsx など) である場合、これは問題になりません。ただし、大量の大きなドキュメントを圧縮されていない形式 (.txt、.rtf など) で保存する場合は、ファイルの肥大化が問題になる可能性があります。その場合、C++ アプリでそれらのドキュメントを保存する前に (おそらくGZipStreamを使用して) 自動的に圧縮し、取得時に圧縮解除することができます。

于 2014-11-19T11:05:20.900 に答える