VC++と OLE DBによるデータベース操作

・ OLD DB コンシューマ(データベースアクセス)を MFCに追加する方法

MFCを使ってデータベースにアクセスしようと思ったら、DAO(Jet)の場合、 CDaoDatabase や CDaoRecordset クラスを使用する方法もありますが、 SQLサーバなどと接続する場合、せっかくですから OLE DB を 使ってみましょう。準備として 標準のヘッダーファイルに以下の内容を 追加します。

[StdAfx.h]
// ATL(OLE DB)関連に必要なファイル
#include <atlbase.h>
extern CComModule _Module;   // 変数自身は StdAfx.cppで宣言する
#include <atlcom.h>
#include <atldbcli.h>
#include <atldbsch.h>
#include <comdef.h>

[StdAfx.cpp]
#include <atlimpl.cpp>
CComModule _Module;

[アプリケーションクラスの.cpp]
BOOL CxxxxxApp::InitInstance()
{
// 以下の一行が記述されていることを確認
    if (!AfxOleInit()) return FALSE;
    ....
}

実際のデータベースへのアクセスは、CDataSource、CSessionクラスと CCommand<   >テンプレートを使用します。データベースのレコードに アクセスするための変数は CDataClass に宣言します。

USES_CONVERSION;       // 文字列変換マクロ用

CDataSource dbSource;
CSession dbSession;
CCommand < CAccessor < CDataClass > > dbTable;

HRESULT hr;
hr = dbSource.
    dbTable.Clear();

    HRESULT hr = dbSource.OpenFromInitializationString(T2OLE(m_sConnStr));
    hr = dbSession.Open(dbSource);

    CString sSQL;
    sSQL.Format("SELECT ID, PtCode, OrderDate, Department, Doctor, OrderType "
                "FROM tblDrugOrder WHERE PtCode = %d ORDER BY ID DESC", iPtCode);
    hr = dbTable.Open(dbSession, sSQL);

    CString msg;
    COleDateTime oleDate;
    m_lbxDrugOrderList.ResetContent();
    while (dbTable.MoveNext() == S_OK) {
        oleDate.ParseDateTime(dbTable.szOrderDate);
        msg.Format("%s\t%s\t%s\t%s", (dbTable.iOrderType == 1) ? "*" : " ",
            oleDate.Format("%y-%m-%d"),
            dbTable.szDepartment, dbTable.szDoctor);
        int iIndex = m_lbxDrugOrderList.AddString(msg);
        m_lbxDrugOrderList.SetItemData(iIndex, (DWORD)dbTable.iID);
        dbTable.Clear();
    }
    dbTable.Close();
    dbSession.Close();
    dbSource.Close();


CDataClass の内容は、具体的には以下のようになります。

class CDataClass {
public:
    int     iCode;
    char    szName[16];
    char    szDate[16];
// メンバ初期化用関数
    void    Clear() { ZeroMemory(this, sizeof(*this)); }

BEGIN_COLUMN_MAP(CDataClass)
    COLUMN_ENTRY(1, iCode)
    COLUMN_ENTRY(2, szName)
    COLUMN_ENTRY(3, szDate)
END_COLUMN_MAP()
};

・ OLD DB プロバイダ

* OLD DB プロバイダ
  1. SQLOLEDB  : Microsoft SQL Server
     ConnectionString プロパティの Provider引数を設定
       Provider=SQLOLEDB

  2. MSDASQL   : ODBC Driver
      "[Provider=MSDASQL;] DRIVER=driver; SERVER=server; DATABASE=database;
       UID=user; PWD=password"

  3. Microsoft.Jet.OLDEB.3.51  : Microsoft Jet (mdb)
      Provider=Microsoft.Jet.OLEDB.3.51

* CDataSource で,データベースをオープンするには,
     CDataSource source;
     source.Open(GetSafeHwnd());  --- プロバイダ選択用の画面が出力される
     確定後,
     source.GetInitializationStrin(BSTR *p, TRUE);
       この操作で,BSTR文字列 pに,接続用文字列が得られる

     次からは,
     source.OpenFromInitializationString(LPCOLESTR str);
       で開くことが出来る.

  

TOMOsan Top Page に戻る
パソコン・プログラミングに戻る


Copyright(c) 2001 Tomohiko Saito. All rights reserved.
last update :