VC++6.0からADOを使ってみる

VCからADOを使用するのは、結構面倒くさい。VBだったら参照設定をして、New ADODB.Connection でインスタンスができるのに、、、、

ADOを使用するためには、使用するモジュール(.cpp)ファイルの先頭で、以下を入力する。
------------------------------------------------------------
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename_namespace("ADOCG") rename("EOF", "EndOfFile")
using namespace ADOCG;
------------------------------------------------------------

これはVBの参照設定と同じ事で、これからADOを使いますよー。とコンパイラに教える。

そして、データベースとのコネクションを開く。
------------------------------------------------------------
CString strCon = "接続文字列";
_ConnectionPtr con;
con.CreateInstance(__uuidof(Connection));
con->Open(_bstr_t(strCon), "", "", adOpenUnspecified);
------------------------------------------------------------

これでコネクションが開かれる。
ここで、接続文字列は以下のように設定する。
1.MDBファイルの場合
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ファイルパス
2.CSVファイルなどのテキストファイル
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=フォルダパス;Extended Properties=TEXT;
3.SQLサーバー
Provider=SQLOLEDB.1;Server=ホスト名;Database=データベース名;Trusted_Connection=Yes

レコードセット全体を取得するには、以下のようにする。
ここでは、データ更新用に、ダイナミックカーソル・排他ロック・非同期を指定。
------------------------------------------------------------
_RecordsetPtr rs;
rs.CreateInstance(__uuidof(Recordset));
rs->Open(_variant_t("SELECT * FROM テーブル名", con.GetInterfacePtr(), adOpenDynamic, adLockPessimistic, adAsyncFetch);
------------------------------------------------------------

CSVの読み取りや、読み込み専用で開く場合には下のように、、、
------------------------------------------------------------
rs->Open(_variant_t("SELECT * FROM テーブル名"), conCSV.GetInterfacePtr(), adOpenForwardOnly, adLockReadOnly, adCmdText);
------------------------------------------------------------
また、CSVでは、テーブル名としてファイル名を指定する。

データの取得は、
------------------------------------------------------------
_variant_t varValue;
varValue = rs->GetCollect(_variant_t("列名"));
------------------------------------------------------------

設定は、
------------------------------------------------------------
Field *fld;
rs->Fields->get_Item(_variant_t("列名"), &fld);
fld->put_Value(_variant_t("設定する文字とか"));
...
rs.Update();
------------------------------------------------------------

順次アクセスは、
------------------------------------------------------------
while(!rs.EndOfFile)
{
//ここで処理
rs.MoveNext();
}
------------------------------------------------------------

ここで分かるように、基本的にVARIANTという何でも入れられる構造体型で値の受け渡しを行っています。いちおうVARIANTをラップした_variant_tというクラスがあり、変換などの面倒を見てくれます。よく、_variant_t("文字")などとしていますが、これで文字列のVARIANTができます。double や、 long 等も同じ要領で作成できますが、intは、longなどにキャストする必要があります。

値の設定は簡単ですが、取得はやっかいです。
------------------------------------------------------------
// double の場合
varValue.ChangeType(VT_R8);
double val = varValue.dblVal;

// 文字列の場合
varValue.ChangeType(VT_BSTR);
CString strVal = varValue.bstrVal;
------------------------------------------------------------
等です。

もし、もっと簡単な使い方を知っている人がいたら教えてください。
お願いします。m(_ _)m

エラー処理については、ほとんどすべてのメソッドが、エラーを通知するために、_com_error オブジェクトの参照を trow します。なので、それをcatchする必要があります。
------------------------------------------------------------
try
{
//ADOで何かする
}
catch(_com_error& e)
{
// エラー処理例:
AfxMessageBox(CString("ADOエラー\n\nメッセージ:")
+ e.ErrorMessage()
+ CString("\n\n詳細:") + (char*)e.Description()
+ CString("\n\nソース:") + (char*)e.Source());
return FALSE;
}
------------------------------------------------------------


最後に、COMの初期化と解放について。
上記のすべての処理を行う前に、
::CoInitialize(NULL);
をコールする必要があります。
また、すべての処理が完了したら、
::CoUninitialize();
をコールします。
これはお約束です。
[PR]
by isoq | 2004-02-13 13:39 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< ADO Recordset カ... タイトル写真 >>