ドキュメント

▲ [ オピニオンテクニカル ] [ Home ]
▼ [ 概要Index ]

C++Builder6 + dbExpress + MySQL5 (1)

概要

C++Builder には DB 接続のための方法が複数あるが、dbExpress は BDE に比べ、DB ベンダの提供するライブラリを直接叩くためパフォーマンスがよく、DB 固有の機能を利用することができ、BDE を再配布する必要がない──という点で有利である。

しかしながら、C++Builder6 Professional 版に添付されている MySQL 用 dbExpress ドライバは MySQL 3.23.x 向けであり、そのままでは MySQL5.0.x に接続できない。(未確認だが BDS2006 には MySQL 4.1.x 向けドライバが添付されているようだ。)そこでここでは C++Builder6 Pro で dbExpress による MySQL5 への接続方法について解説する。(ちなみにここで用いた MySQL バージョンは 5.0.19 である。)

# これは C++Builder6 Enterprise 版でも同様のはずである。
# しかし、Personal 版には dbExpress が付属しないので利用できない。

Index

dbExpress の概要

まず、dbExpress を用いた場合における DB アクセスの流れを示すと以下のようになる。ここでいう MySQL ドライバが DB ベンダの提供する DLL、dbExpress ドライバが C++Builder によって提供される DLL となる。つまり DLL を入れ替えるだけで他の DB にも同様の接続を行うことができる。

アプリ (TSQLConnection コンポーネント)
↓
dbExpress ドライバ (dbxpmys.dll)
↓ ドライバ取得API (getSQLDriverMYSQL())
MySQL ドライバ (libmysql.dll)
↓
MySQL サーバ

MySQL のインストールと設定

では、先に DB 本体をインストールしてアクセスする DB とユーザ名までを作成する。MySQL の Web サイト から Windows (x86) を DL してインストールする。インストールが完了すると DB の初期設定ウィザードが立ち上がるので、ここで root ユーザのパスワードを変更しておく。

ウィザードが完了すると MySQL サーバが(2000/XP なら)サービスとして起動するようになるので、スタートメニューの [プログラム]-[MySQL]-[MySQL Server 5.0]-[MySQL Command Line Client] を起動し root ユーザのパスワードでログインする。(もしくはコマンドプロンプトから「mysql -u root -p」で パスワードを入力してログインする。)

そして DB アクセスに使うユーザとデータベースを作成する。

mysql> grant all on *.* to <ユーザ名> identified by '<パスワード>';
mysql> Flush privileges;
mysql> Create databeaes <データベース名>;
mysql> exit

いったん MySQL クライアントを抜けたら、今度は上で作成したユーザ名・パスワードで再度ログインし DB の選択できることを確認する。DB は作成しただけなので、この時点でテーブルなどはもちろんない。

mysql> use <データベース名>;
mysql> show tables;

MySQL5 用に dbExpress を設定

これで DB 側は準備ができたので、次いで dbExpress の設定を行う。まずは以下のふたつの DLL をパスの通ったディレクトリ(アプリケーションのカレントディレクトリ、もしくは C:\WINDOWS\ など)にコピーする。

libmysql50.dll<MySQL 5.0>\lib\opt\libmysql.dll をリネーム
dbxopenmysql50.dllDbExpress drivers for MySQL V5.0 にある dbxopenmysql5_dll.zip を DL して解凍
a) 接続情報を ini ファイルで静的に設定する場合

dbExpress の設定はデフォルトでは C:\Program Files\Common Files\Borland Shared\DBExpress にある ini ファイルで行われる。この内容は以下の通りである。

dbxconnections.ini接続設定一覧
dbxdrivers.iniドライバ設定一覧

ini ファイルから接続情報を設定する場合は dbxdrivers.ini を開き [MYSQL5] セクションを以下のように追加する。

[MYSQL5]
GetDriverFunc=getSQLDriverMYSQL50
LibraryName=dbxopenmysql50.dll
VendorLib=libmysql50.dll
BlobSize=-1
Database=DBNAME
ErrorResourceFile=
HostName=ServerName
LocaleCode=0000
Password=password
User_Name=user
ServerCharSet=sjis

またファイル先頭の [Installed Drivers] セクションに以下の 1 行を追加してファイルを閉じる。

MYSQL5=1

そして BCB6 を起動したら、フォームに dbExpress パレットの SQLConnection コンポーネントを配置してダブルクリックする。[接続の追加] ボタンを押してドライバ名 : MYSQL5、接続名 : <接続名> として [OK] したら、接続の設定で Database、Hostname (サーバとクライアントが同じマシンなら localhost、またはサーバの IP アドレスなど)、Password、User_Name を上記で設定したものに変更する。その後、[接続のチェック] ボタンを押して、ユーザ名・パスワードを指定し「接続完了」ダイアログが表示されれば OK である。(接続完了すると該当 SQLConnection コンポーネントの Connected プロパティが true となる。)

dbExpress 接続完了

なお、ini ファイルを標準の場所以外から読み込みたい場合は、dbxdrivers.ini 相当の内容のものを LoadParamsFromIniFile( ) メソッドで読み込めばよい。

b) 接続情報を TSQLConnection コンポーネントへ静的に設定する場合

勘の鋭い方ならばもうお気づきかもしれないが、ini ファイルの内容というのは、接続時に TSQLConnection コンポーネントのプロパティに設定される値ということであり、それをプログラムの外部に持っていたということである。そのため、当然ながら上述の接続情報を TSQLConnection のプロパティに対して動的にセットすることも可能である。例えば、フォーム上にボタンを配置してダブルクリックしたら以下のようなコードを書けばよい。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TSQLConnection* conn;
    conn = new TSQLConnection(NULL);

    try
    {
        conn->ConnectionName      = "<接続名>";
        conn->DriverName          = "MYSQL5";
        conn->GetDriverFunc       = "getSQLDriverMYSQL50";
        conn->KeepConnection      = true;
        conn->LibraryName         = "dbxopenmysql50.dll";
        // これが true だと接続時に ini ファイルから設定を読み込む
        conn->LoadParamsOnConnect = false;
        // これが true だと接続時に DB のログイン画面が表示される
        conn->LoginPrompt         = false;
        conn->VendorLib           = "libmysql50.dll";

        conn->Params->Append("Database=<データベース名>");
        conn->Params->Append("User_Name=<ユーザ名>");
        conn->Params->Append("Password=<パスワード>");
        conn->Params->Append("HostName=<ホスト名>");
        conn->Params->Append("ServerCharSet=sjis");

        conn->Open();

        // DB の操作

        conn->Close();
    }
    catch(EDatabaseError& e)
    {
        conn->Close();
        delete conn;
    }
    catch(...)
    {
        conn->Close();
        delete conn;
    }

    delete conn;
}

ちなみに、MySQL サーバのセットアップ時に defaultCharacterSet を sjis などとした場合は TSQLConnection の Params でも明示的に「ServerCharSet=sjis」の一文が必要となる。これが設定されていないとテーブルに含まれる日本語文字列が文字化けしてしまう。

▲ [ Top ]


開明堂
Copyright (C) 2006 唯野 Comment to Webmaster
Last Modified 2007.2.11  Since 2006.5.5