ODBCを使ったデータベースアクセス

ODBCとは?
ODBC(Open DataBase Connectivity)インターフェイスは、 データベースにアクセスするためのインターフェイスの規格であり、Microsoft社が提唱したものである。 さまざまな種類のデータベースに対するプラグイン(ODBCドライバ)が用意されており、 これにより異なるデータベースに対しても同一の方法でアクセスできる。 アプリケーションの開発者にとっては、 ODBCを使ったデータベースアクセス方法を学ぶだけで多くの種類のデータベースを使用できることになる。

データベース(CSVファイル)の作成
ここではテキストデータベースを使用する。 任意のフォルダに、"MyData.csv"という名前のCSVファイルを作成する。 CSVファイルはテキストファイルなのでメモ帳などのテキストエディタで作成できる。 内容は以下のとおりにする。改行も必ず入れること。
"ID","RaceName","Distance"
1,"皐月賞","芝2000"
2,"ダービー","芝2400"
3,"菊花賞","芝3000"
4,"有馬記念","芝2500"
ODBCアドミニストレータでのデータソース登録方法
ODBCアドミニストレータを開く方法はOSによって異なるので、ここでは省略する (大抵、スタートメニューからコントロールパネルを選択し、その中をたどっていけば見つかるはず)。 わからない場合はWindowsヘルプなどを参照のこと。
  1. 「ユーザー DSN」タブを選択し、「追加」ボタンを押す。
  2. 「データソースの新規作成」ダイアログが表示されたら、 ドライバのリストから「Microsoft Text Driver」を選択し、「完了」ボタンを押す。
  3. 「ODBC テキスト セットアップ」ダイアログが表示されたら、 データソース名(任意の名前)とデータベースフォルダを指定する。 仮にここではデータソース名を「TEXTDATABASE」とする。 フォルダは、データベースとするCSVファイルが格納されているフォルダを指定する。 ちなみにテキストデータベースの場合、フォルダがデータベース全体を表し、 ファイルがテーブルを表しているものと考えることができる。
  4. アドミニストレータのリストに新規作成したデータソースが追加されるのを確認し、 「OK」ボタンを押してアドミニストレータを終了する。

アプリケーションの作成
  1. ダイアログベースのプロジェクト「UKOdbcTest」を新規に作成する。
    プロジェクトを作成したら、ダイアログリソースを右図のようにレイアウトする。 レイアウトができたら、3つのエディットコントロールについて下表のようにDDX変数を追加すること。

    項目名コントロールIDDDX変数の型変数名
    IDIDC_EDIT_IDintm_iID
    レース名IDC_EDIT_RACENAMECStringm_strRaceName
    距離IDC_EDIT_DISTANCECStringm_strDistance

  2. 「挿入」−「クラスの新規作成」メニューを選択し、 「クラスの新規作成」ダイアログで新しいクラスCMyRecordsetを作成する。 クラスの種類は「MFCクラス」、基本クラスは「CRecordset」とする。
    OKボタンを押すと「データベースのオプション」ダイアログが表示されるので、 データソースとしてODBCを選択し、「TEXTDATABASE」を選択してOKボタンを押す。
    今度は「データベーステーブルの選択」ダイアログが表示され、 作成したCSVファイルがリストの中に表示されているのでそれを選択する。 これでOKボタンを押せば、新しいクラスが作成されるだろう。

  3. MyRecordSet.hファイルを開き、以下のインクルード文を追加する。
    #include <afxdb.h>
  4. MyRecordSet.cppファイルを開き、以下の関数を修正する。
    CString CMyRecordset::GetDefaultSQL()
    {
    	// return _T("[MyData].[csv]");
    	return _T("[MyData.csv]");
    }
    
  5. UKOdbcTestDlg.hファイルを開き、以下のように修正する。
    // インクルード文を追加
    #include "MyRecordset.h"
    
    /////////////////////////////////////////////////////////////////////////////
    // CUKOdbcTest3Dlg ダイアログ
    
    class CUKOdbcTest3Dlg : public CDialog
    {
    ……
    private:
    	CMyRecordset m_Recordset;
    };
    
  6. UKOdbcTestDlg.cppファイルを開き、OnInitDialog関数を修正する。 また、WM_DESTROYメッセージのハンドラ関数OnDestroyを追加し、処理を入れる。
    BOOL CUKOdbcTest3Dlg::OnInitDialog()
    {
    ……
    	m_Recordset.Open();
    	m_Recordset.MoveFirst();
    
    	m_iID = m_Recordset.m_ID;
    	m_strRaceName = m_Recordset.m_RaceName;
    	m_strDistance = m_Recordset.m_Distance;
    	UpdateData(FALSE);
    	
    	return TRUE;  // TRUE を返すとコントロールに設定したフォーカスは失われません。
    }
    
    // WM_DESTROYメッセージハンドラ
    void CUKOdbcTest3Dlg::OnDestroy() 
    {
    	CDialog::OnDestroy();
    	
    	// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
    	m_Recordset.Close();
    }
    
    この時点でプロジェクトをビルドし、実行してみる。正しく作成されていれば、 ダイアログを開くと同時にデータベースの最初のレコードの内容がエディットコントロールに表示されるはずである。 ちなみにCMyRecordsetクラスのメンバ変数m_ID, m_RaceName, m_Distanceはクラス生成時に自動生成されたもので、 データベースのカレントレコード内の各フィールドを示している。

  7. ダイアログ下部の「<<」ボタンと「>>」ボタン(それぞれのリソースIDをIDC_BUTTON_PREV、IDC_BUTTON_NEXTとする) を押したときのメッセージハンドラを以下のように記述する。
    void CUKOdbcTest3Dlg::OnButtonPrev() 
    {
    	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    	m_Recordset.MovePrev();
    
    	if( m_Recordset.IsBOF() )
    	{
    		m_Recordset.MoveFirst();
    	}
    	else
    	{
    		m_iID = m_Recordset.m_ID;
    		m_strRaceName = m_Recordset.m_RaceName;
    		m_strDistance = m_Recordset.m_Distance;
    		UpdateData(FALSE);
    	}
    }
    
    void CUKOdbcTest3Dlg::OnButtonNext() 
    {
    	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    	m_Recordset.MoveNext();
    
    	if( m_Recordset.IsEOF() )
    	{
    		m_Recordset.MoveLast();
    	}
    	else
    	{
    		m_iID = m_Recordset.m_ID;
    		m_strRaceName = m_Recordset.m_RaceName;
    		m_strDistance = m_Recordset.m_Distance;
    		UpdateData(FALSE);
    	}
    }
    
    これで、「<<」ボタンと「>>」ボタンを使ってデータベースの各レコードを順次表示することが可能となる。

目次へ