DB2 Everyplace/Programming

出典: Fukudat

データベースを使用するプログラムを作るためには,DB2 CLI API の仕様を参照する必要があります.ここには詳細を乗せませんので,DB2 Everyplace Information Center (オンラインマニュアル) を参照してください.

目次

サンプルプログラム

説明のためのサンプルプログラムを用意しています.Media:Db2e-sample.zip をダウンロードして,Visual Studio のプロジェクトディレクトリ(普通は マイ ドキュメント\Visual Studio 2005\Projects\)の下で展開すれば,準備完了です.

プロジェクトディレクトリに展開されたサンプルプロジェクト

WinCE アプリケーションの実行 (Sample0)

ともあれ,Hello World的なプログラム (Sample0) を実行してみましょう.

  • スタートメニューから Visual Studio 2005 を起動します
  • 先ほどダウンロードしたサンプルの中から,Sample0 を開きます.
 ファイル->開く->プロジェクト/ソリューション
 Projects\Sample0\Sample0 を選択
  • 何も考えずに,実行してみましょう.デバッグ開始ボタンを押します.最初の起動には少し時間がかかるかも知れません.
 デバッグ->デバッグ開始 または,
 ツールバー(画面上部中央)の緑の三角マークを押す

しばらく待つと,Windows CE のエミュレータが起動して,その中でアプリケーションが起動されるはずです. もしエラーが出たら,トラブルシューティング を参考にして解決してください.

Sample0の実行中

このアプリケーションは,Hello ボタンを押すと,その下のテキストボックスにメッセージを表示します(それだけです).実はまだDB2eは使っていません.動作することを確認したら,画面右上の OK ボタンを押して,アプリケーションを終了しておきます.

  • エミュレータ自身は動かしたままでも終了しても結構です.終了しても,デバッグボタンを押せばまた勝手に起動します.
  • エミュレータ終了時にはダイアログボックスが表示され「終了する前にエミュレータの状態を保存しますか?」と聞いてきます.とりあえず「いいえ」と答えておきましょう.

サンプルプログラムの基本構成

  • ここで使用するサンプルプログラムは次のクラスからできています.
CHello クラス (Hello.h, Hello.cpp)
アプリケーションクラス
CHelloDlg クラス (HelloDlg.h, HelloDlg.cpp)
ダイアログパネルのクラス
ボタンを押すと CHelloDlg::OnBnClickedButton1(...) が呼ばれる.ここから Sample クラスを使ったユーザプログラムを呼び出す.
Sample クラス
今後,このクラスに機能を追加して,DB2e 操作していきます.Sample0 には存在しません.
SQLException クラス
DB2e のエラーを表現するためのクラスです.Sample0 には存在しません.
  • HelloDlg.cpp を開いて,CHelloDlg クラスの OnBnClickedButton1() メソッドの中身を確認してください.
    • UpdateData(TRUE); -> 画面と変数の同期を取るためのおまじないです.(この例に関しては実は必要ないのですが)
    • message += hello; -> 変数 message の値がテキストボックスに表示されるよう設定されているので,変数の値を更新しています.
    • UpdateData(FALSE); -> 変数と画面の同期を取るためのおまじないです.
Sample0のソース表示中

後ほど,自分自身のアプリケーションを1から作る方法を紹介します.しばらくはサンプルを使った操作方法を学んでください.

データベースとの接続 (Sample1)

次に,データベースに接続するプログラム (Sample1) を実行してみましょう.

  • DB2e を使う最初のサンプルプログラム Sample1 を開きます.
 プルダウンメニュー「ファイル」->「開く」->「プロジェクト/ソリューション」
 Projects\Sample1\Sample1 を選択
  • これも何も考えずに実行してみましょう.
 プルダウンメニュー「デバッグ」->「デバッグ開始」 または,
 ツールバー(画面上部中央)の緑の三角ボタンを押す

するとエミュレータが起動し,Hello というボタンのあるアプリケーションが表示されます.

  • Hello ボタンをクリックすると,先ほど説明したように,CHelloDlg::OnBnClickedButton1() が呼び出されます.
  • その中で,データベースへの接続,切断を行う Sample::connect(), Sample::disconnect() を呼び出しています.
Sample1の実行中

では Sample.cpp を開いて,データベースに接続するにはどうすればよいか見ていきましょう.

Sample::connect() にはデータベースに接続するコードが書かれています.一般に,データベースに接続するには

  1. SQLAllocHandle() API を呼び出して,環境ハンドル (ソース中の変数名 henv) を取得する
  2. SQLAllocHandle() API を呼び出して,データベース接続ハンドル (同 hdbc) を取得する
  3. SQLConnect() API を呼び出してデータベースに接続する

という手順を踏みます.(API の詳細は DB2 Everyplace Information Center (オンラインマニュアル) を参照してください.)

Sample1のソース表示中

henv はプログラム全体で1つだけあれば良く,hdbc はデータベースに対する接続に対して1つづつ作ります.普通はデータベースは1つしか使いませんから hdbc もプログラムで1つになることが多いでしょう.一旦取得したら,以後は切断・開放するまでそのハンドルを使い続けます.

SQLConnect() には hdbc のほかに,データソース名 (ソース中の変数名 dsn), ユーザ名 (同 user), パスワード (同 passwd) を引数として与えます.DB2 Everyplace では,ユーザ名,パスワードは暗号化の際に使用することがありますが,その他の場合無視しますので,この解説の中では空文字列 (長さ0の文字列) としています.

データソース名には,データベースの存在する場所を指定します.Windows (CEを含む)版の DB2 Everyplace では,データベース本体(複数のファイルから出来ています)が保存されているディレクトリ名+"\" を指定すると憶えてください.例えば,データソース名として

 C:\dir1\dir2\

と指定すると,C:\dir1\dir2 に存在するデータベースを意味します.

 C:\dir1\dir2\dsn

と指定しても,C:\dir1\dir2 に存在するデータベースを意味します."\" を最後につけなかったので "dsn" は無視されるということに注意してください.

データソース名として存在しないディレクトリを指定するとエラーになります.また,データベース本体がまだ存在していないディレクトリをデータソース名として指定すると,データベースが自動的に作成されます.実際にデータソース名を変更して確かめてみてください.

Sample::disconnect() にはデータベースから切断するコードが書かれています.一般に,データベースから切断するには

  1. SQLDisconnect() API を呼び出してデータベースから切断する
  2. SQLFreeHandle() API を呼び出して不要なハンドルを開放する

という手順を踏みます.継続してハンドルを使用し続ける場合は,ハンドルの開放は不要です.

プログラムを停止するには,アプリケーションの右上のOKボタンを押すか,エミュレータ自身を終了してしまいます.

プログラムのデバッグ

これまでプログラムの実行に「デバッグ開始」を用いてきました.デバッグモードで実行しているので,プログラムにブレークポイントを設定して途中で一時停止させたり,一時停止した後,1ステップずつ確認しながら実行させたりすることが可能です.ここではその方法を見ていきましょう.実は,通常のプログラムのデバッグと操作は全く同じです.

  • もし既にエミュレーターが動いていたら一旦終了してください.
  • Sample.cpp を開き,Sample::connect() メソッドの中の適当な場所 (例えば,SALAllocHandle() を呼び出している行) を選んでブレークポイントを設定します.
 プルダウンメニューの「デバッグ」->「ブレークポイントの設定/解除」 または,
 行の左端をダブルクリックする または
 F9 キーを押す

すると,選択した行の左端にブレークポイントが設定されたことを示す赤い○が表示されます.

  • デバッグを開始してみます.
 プルダウンメニューの「デバッグ」->「デバッグ開始」 または,
 ツールバー(画面上部中央)の緑の三角ボタンを押す

エミュレータ上でプログラムが起動したら,Hello ボタンを押します.すると,設定したブレークポイントでプログラムが一時停止し,赤い○の上に,小さな黄色い矢印が表示されます.

この黄色い矢印は,次に実行しようとしている行をさしています.

プログラムのステップ実行中

ツールバーまたはプルダウンメニューの「ステップイン」「ステップオーバー」「ステップアウト」を使うと,プログラムのステップ実行が可能です.

テーブルの作成 (Sample2)

次に,データベースに新しくテーブルを作成するプログラム (Sample2) を見ていきます.

  • Sample2 を開きます.
 プルダウンメニュー「ファイル」->「開く」->「プロジェクト/ソリューション」
 Projects\Sample2\Sample2 を選択
  • これも何も考えずに実行してみましょう.
 プルダウンメニュー「デバッグ」->「デバッグ開始」 または,
 ツールバー(画面上部中央)の緑の三角ボタンを押す
  • エミュレーター上でプログラムが動き出したら,Hello ボタンを押します.するとデータベースに接続し,「酒」という名前のテーブルを作成し,データベースから切断します.

プログラムの作りはこれまでと全く同じで,Helloボタンが押された結果 CHelloDlg::OnBnClickedButton1() が呼び出され,そこから Sampleクラスのメソッドが connect(), createTable(), disconnect() の順に呼び出されます.

Sample.cpp を開いて Sample::createTable() の中身を覗いてみましょう.

データベースにテーブルを作成するためには,"create table..." というSQL文をデータベースに送って実行させます.一般に,接続中のデータベースでSQL文を実行するには

  1. ステートメントハンドル (プログラム中の変数名 hstmt) を取得する
  2. SQLPrepare() API を呼び出して,SQL文 (同 ddl) を準備し,ステートメントハンドル (hstmt) に関係付ける
  3. SQLExecute() API を呼び出して,ステートメントハンドル (hstmt) に関係付けられたSQL文を実行する

という手順を踏みます.ハンドルの取得と準備を1回だけ行っておけば,同じSQL文を繰り返し実行することが出来ます.使わなくなったステートメントハンドルは SQLFreeHandle() API を使って開放します.

ここでは「酒名」,「日本酒度」,「製造元」というカラムを持つ「酒」という名前のテーブルを作成しています.

当然,このプログラムは2度実行するとエラーになります.同じ名前のテーブルを2度作ることが出来ないからです. エラー処理についてもプログラムを追いかけて,調べてみると良いでしょう.

Sample2の2度目の実行でエラーが表示されたところ

また,Windows CE のファイルエキスプローラで,データベースを作ったディレクトリを開き,どのようなファイルが新しく出来ているか見れ見ましょう.データベースのテーブルの実体は,実は 「DSY_テーブル名」 というファイルだということが判ります.

Command Line Processor (DB2eCLP)

DB2 Everyplace を対話的に使うためのアプリケーション「Command Line Processor (DB2eCLP)」が製品に付属しています.試したいこと,調べたいことをすぐに実行できるので便利です.エミュレーターにインストールして使ってみましょう.

DB2eCLP のインストール

もし現在エミュレーターが動いていなかったら起動します.Sample2 をデバック開始して,エミュレータを起動しておきます.

エミュレータのプルダウンメニュー「ファイル」->「リセット」->「ハード」を選んで,一旦全部初期化してしまいましょう(本来不要ですが,以後の操作が同じになるようにするためです).エミュレータ上のWindows CEがリブートするのをしばらく待ちます.

Windows CEが立ち上がったら,プルダウンメニューの「ファイル」->「構成」を選択します.「全般」タブの一番下の「共有フォルダ」に C:\DB2Everyplace\Clients\wince と入力し,OKを押します(DB2 Everyplace のインストールディレクトリに合わせて,C:\DB2Everyplace の部分が変えてください).

エミュレータの構成画面

次に,Windows CE のファイルエキスプローラを起動し,\マイデバイス\Storage Card\database\ja_JP\install ディレクトリを開きます.

sampwce400.armv4 をクリックして実行すると,DB2eCLP がインストールされます.

  • 横方向の画面サイズが小さいので,ファイル名が確認できないと思います.そういう時は,4つあるクイックボタンの左から2番目のボタン(カレンダーのような表のアイコン)を押してください.エミュレータが横向きに変わり,長いファイル名も表示できるようになります.インストールが終わったらもう一度ボタンを押して,縦長に戻しておきます.
CLPインストールの準備

DB2eCLP を使う

では,早速 DB2eCLP を起動してみましょう.

  • Windows CE のスタートメニューからプログラムを選びます.
  • 表示されるアイコンの中に,DB2 Everyplace Samples というディレクトリが出来ているはずです.それを開いて,中の DB2eCLP をクリックして起動します.
  • タイトル画面が出たら OK を押します.

これで DB2eCLP が起動しました.上の方にあるテキスト入力ボックスに

 connect to \myDB\

と入力して,実行ボタンを押してみましょう.

myDBへ接続

これで \myDB\ に接続しました.次に,同じ入力ボックスに

 list tables

と入力して,実行ボタンを押してみましょう.データベースに作られているテーブルのリストが表示されます.もし Sample2 を実行した後であれば,次の様に表示されるはずです.

myDBへ接続

DB2eCLP の終了

DB2eCLP を終了するときは,必ずクローズボタンを押してください.クローズボタンを押さずに,ウィンドウを閉じてしまうと,DB2eCLP がデータベースに接続したままの状態になり,他のプログラムからそのデータベースに接続できないといったことが起こります.つまり,DB2 Everyplace では同時に一つのプログラムからしかデータベースに接続できないのです.

エミュレータを終了するときに「状態を保存する」を選んでおくと,このインストール作業を再び繰り返さなくても,エミュレータは DB2eCLP がインストールされた状態で立ち上がります.

レコードの追加 (Sample3)

次にレコードをテーブルに追加するプログラム (Sample3) を見ていきます.

  • Sample3 を開きます.
 プルダウンメニュー「ファイル」->「開く」->「プロジェクト/ソリューション」
 Projects\Sample3\Sample3 を選択
  • これも何も考えずに実行してみましょう.
 プルダウンメニュー「デバッグ」->「デバッグ開始」 または,
 ツールバー(画面上部中央)の緑の三角ボタンを押す
  • エミュレータ上でプログラムが動き出したら,Hello ボタンを押します.するとプログラムはデータベースに接続し,「酒」という名前のテーブルに対してレコードを追加し,データベースから切断します.

確かにデータが入ったかどうか,DB2eCLP を使って確かめてみましょう.

  • DB2eCLP を起動し,以下のコマンドを順に実行する.
 connect to \myDB\
 select * from 酒

すると以下のような結果が得られると思います.

Sample3の実行結果

テーブルの作成と違って,このプログラムは何回実行しても成功します.重複した行がいくつも出来ることになります.

レコードを追加するには "insert into..." という SQL文を実行します.実行の手順は "create table..." のときと同様です.

レコードの取得 (Sample4)

次にレコードをテーブルに追加するプログラム (Sample4) を見ていきます.

  • Sample4 を開きます.
 プルダウンメニュー「ファイル」->「開く」->「プロジェクト/ソリューション」
 Projects\Sample4\Sample4 を選択
  • これも何も考えずに実行してみましょう.
 プルダウンメニュー「デバッグ」->「デバッグ開始」 または,
 ツールバー(画面上部中央)の緑の三角ボタンを押す
  • エミュレータ上でプログラムが動き出したら,Hello ボタンを押します.するとプログラムはデータベースに接続し,「酒」という名前のテーブルの全レコードを読んで表示し,データベースから切断します.

更新中

レコードの更新 (Sample5)

更新中

レコードの削除 (Sample6)

更新中

サーバーとの同期

更新中