ADOを利用する

お仕事で使うのでいろいろ調べると、ADO(ActiveX Data Objects)を利用して、 DBのサーバー(SQLServerやMSDE)に接続してDBにアクセスするようだ。

とりあえず、仕事ではVC++でやっているので、VC++でのお話。
ここに書くのはADOを利用できる状態にする方法です。
DB(ODBC)への接続は後ほど・・・

最初にやること

ADOはDLLで提供されているっぽいのでDLLをインポートしなければなりません。
この作業は決めうちっぽいので下記のようにすればよいみたい。v

    #import "msado15.dll"\
    no_namespace    rename ("EOF", "adoEOF")
    #include "icrsint.h"

また、ネームスペースを指定する場合は

    #define INITGUID        // これはADOを定義するための定数(GUID)の初期化
    #import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename_namespace("ADOCG") rename("EOF", "adoEOF")
    using namespace ADOCG;  // 名前空間
    #include "icrsint.h"    // ADOを使って取得したフィールドのデータを変換するマクロなどが定義されたヘッダー

とするとよい。

利用するヘッダで組み込めば良い。
stdafx.hに組み込まなくてもできることもあるようだが、極力stdafx.hに組み込むのが望ましいようだ
(特にネームスペースを指定する場合。それに気づかなくて1日仕事をつぶした経験あり・・・無知とは恐ろしい)
stdafx.hに組み込むパターンが多いみたい(ADO関連のページだとこのパターンが多い)

#include文の所は無くても良いみたい。
MicrosoftのADOのページを見ると、icrsint.h は ADO用のVisual C++ Extensions という物らしい。
過去のADOのバージョンだと、このヘッダを使っていたらしい。
(詳しくはこっちに書いてある。)

まぁ、とりあえずはこう書けば良いと言うことらしい。

インポートが終わったら、COMの初期化を行う記述をしましょう。
ADOはCOMコントロールなので初期化が必要だとか・・・
COMってなに?(おまえは本当に仕事でWindowsプログラムしているのか!というような発言だと思う)

で、COMの初期化は

//COMライブラリ初期化
::CoInitialize(NULL);


といった感じで行う。

これを行わないと、DBサーバーに接続できないのでなーんにもできない。
(実際にやってしまったし)
COMの初期化はDBに接続する前に行えばよいです。

COMってなにさ!

ちょっと調べたらCOM (Component Object Model) という名前らしい。

Insider's Computer Dictionary から引用
 Microsoftが考案したソフトウェア・コンポーネント技術。
 従来は単独の実行ファイルとして構成されていたアプリケーションなどを、
 オブジェクト指向技術にのっとって独立した複数のコンポーネントとして分離し、
 それらが互いに連携することで全体の処理を進められるようにする。
 この際に分離されたコンポーネントは、独立して機能できるので、
 必要に応じて他のコンポーネントと組み合わせ可能なソフトウェア部品として再利用することができる。
・・・DelphiやC++Builderのコンポーネントと同じ様な感じってことだな(適当な解釈)

参考文献

ADO プログラマーズ リファレンス
ADO プログラマーズ ガイド
ADO 用の Visual C++ Extensions
ADOを使ったデータベースアクセス
Insider's Computer Dictionary