フリープログラミング for windows.

MinGW(gcc)でFirebirdを使ってみる(1)

今回はMinGW(gcc)でInterBase APIを使用してFirebirdデータベースにアクセスするプログラムを作成します。

Firebirdの入手とインストール

Firebirdの入手

Firebirdのインストールについては「Firebirdのインストール」に記載していますので参照してください。

Firebird 1.5.2 を入手します。 ダウンロードはダウンロードページ から「Firebird-1.5.2.4731-Win32.exe」と「Firebird-1.5.2.4731_embed_win32.zip」をダウンロードします。

「Firebird-1.5.2.4731-Win32.exe」はデータベースパッケージ本体です。 「Firebird-1.5.2.4731_embed_win32.zip」は「Firebird 1.5.2 Embedded Server」で、データベースサービスを別途起動することなく ローカルでFirebirdのデータベースにアクセスすることができるDLLです。

Firebirdのインストール

「Firebird-1.5.2.4731-Win32.exe」はインストーラ形式ですので適当な場所にインストールします。 (後述する例では E:\Firebird_1_5 にインストールした場合の例となります) 「Firebird-1.5.2.4731_embed_win32.zip」も適当な場所に解凍します。

C++環境

筆者の環境は「MinGW 4.1.1」「MSYS 1.0.10」とEcripse(CDT)を利用しています。

InterBase APIを使用したアプリケーションの作成

InterBase API を利用するためのMakefileを作成

インストールフォルダ下の include と lib の下に InterBase APIを使用するためのヘッダファイルとライブラリがあります。 コンパイル時は include のサーチパスの追加とリンク時は静的ライブラリの fbclient_ms.lib をリンクします。 以下にMakefile例を記載します。ソースファイル名は sample1.cpp 、実行ファイル名は sample1.exe としています。

      CXX = g++
 CXXFLAGS = -g
  LDFLAGS = 
 INCLUDES = -I. -Ie:/Firebird_1_5/include
     LIBS = e:/Firebird_1_5/lib/fbclient_ms.lib
   TARGET = sample1.exe
     SRCS = sample1.cpp
     OBJS = $(SRCS:.cpp=.o)

all: $(TARGET)
clean:
	-rm $(TARGET) $(OBJS)
$(TARGET): $(OBJS)
	$(CXX) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
.cpp.o:
	$(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@

ソースファイルの作成

まずは、InterBase API を使用するために ibase.h をインクルードします。

#include <ibase.h>

isc_dsql_execute_immediate()を使用してSQL文を発行します。 isc_dsql_execute_immediate()はステートメントの作成なしにSQL文が発行できます。 以下にサンプルを記載します。データベース作成後はデータベースにアタッチされた状態になりますので、 isc_detach_database()でデータベースをデタッチしています。 isc_db_handle はデータベースハンドル、 isc_tr_handle はトランザクションハンドルです。データベース作成時はトランザクションを開始しませんが、 isc_dsql_execute_immediate()のパラメータで必要ですのでNULLで初期化したエリアは定義し設定します。

isc_db_handle    hDb = NULL;
isc_tr_handle    hTrn = NULL;
ISC_STATUS_ARRAY status;

char* sql1
  = "CREATE DATABASE 'E:\\db\\test.fdb' USER 'SYSDBA' PASSWORD 'masterkey'";
if (isc_dsql_execute_immediate(status, &hDb, &hTrn, 0, sql1, 1, NULL)) {
	cerr << "Failed to create dadabase. status=" 
	     << isc_sqlcode(status) << endl;
	return 1;
}
if (isc_detach_database(status, &hDb)) {
	cerr << "Failed to detach database. status=" 
	     << isc_sqlcode(status) << endl;
	return 1;
}

こんどはテーブルの作成です。最初にisc_attach_database()で作成したデータベースにアタッチします。 この時、ユーザ、パスワードをisc_expand_dpb()を使用して設定します。

次にCREATE TABLE文を発行します。isc_dsql_execute_immediate()を呼び出しますが、呼び出し前に isc_start_transaction()でトランザクションを開始し、呼び出し後、isc_commit_transaction()でコミット します。

最後はisc_detach_database()でデータベースをデタッチします。

char* sql2
  = "CREATE TABLE sample1 ( ITEM1 NUMERIC(4), ITEM2 CHAR(4) )";
char* dpb = NULL;
short dpbLen = 0;
isc_expand_dpb(&dpb, &dpbLen, isc_dpb_user_name, "SYSDBA",
               isc_dpb_password, "masterkey", NULL);
if (isc_attach_database(status, 0, "E:\\db\\test.fdb", &hDb, dpbLen, dpb)) {
	cerr << "Failed to attach dadabase. status=" 
	     << isc_sqlcode(status) << endl;
	return 1;
}
if (isc_start_transaction(status, &hTrn, 1, &hDb, 0, NULL)) {
	cerr << "Failed to start transaction. status=" 
	     << isc_sqlcode(status) << endl;
	return 1;
}
if (isc_dsql_execute_immediate(status, &hDb, &hTrn, 0, sql2, 1, NULL)) {
	cerr << "Failed to create table. status=" 
	     << isc_sqlcode(status) << endl;
	return 1;
}
if (isc_commit_transaction(status, &hTrn)) {
	cerr << "Failed to commit transaction. status=" 
	     << isc_sqlcode(status) << endl;
	return 1;
}
if (isc_detach_database(status, &hDb)) {
	cerr << "Failed to detach database. status=" 
	     << isc_sqlcode(status) << endl;
	return 1;
}

ソースコードの例:sample1.cpp

makeの実行

作成したソースをコンパイル・リンクします。

例えば、MSYSからコンパイルする場合、Makefileとソースファイルを 同一フォルダに置き、MSYSのウインドウから、そのフォルダに移動し、 makeコマンドを実行します。

サンプルアプリケーションの実行

クライアントDLLの配置

fbclient.dll を実行するアプリケーションと同一フォルダにコピーします。 fbclient.dll はインストールフォルダ下の bin の下に格納されています。 (システムフォルダにコピーされている場合は必要ありません)

アプリケーションの実行

アプリケーションを実行します。うまく行けば、データベースとテーブルが作成 されます。上記DLLを使用する場合は Firebird が起動されている必要があります。 インストール時にデフォルトでは自動起動されるようになっています。 例の場合、データベースファイルを e:\db\test.fdb に作成しますので、予め e:\db フォルダは作成しておく必要があります。また、test.fdbが残っている場合は、 CREATE DATABASE 時にエラーになるため、削除してから実行してください。

isqlによる実行結果の確認

isqlの起動

isqlを起動します。[すべてのプログラム]-[Firebird_1_5]-[Firebird ISQL Tool] で起動できます。DOSプロンプトからインストールフォルダのbinの下のisql.exeを起動 してもかまいません。

データベースへの接続

isqlのプロンプトより、"CONNECT"でデータベースへ接続します。

Use CONNECT or CREATE DATABASE to specify a database
SQL> CONNECT 'e:\db\test.fdb' USER 'SYSDBA' PASSWORD 'masterkey';
Database:  'e:\db\test.fdb', User: SYSDBA
SQL>
				

テーブルの確認

isqlのプロンプトより、"SHOW TABLE" または "SHOW TABLE テーブル名"でテーブルを 表示します。

SQL> SHOW TABLE;
       SAMPLE1
SQL> SHOW TABLE SAMPLE1;
ITEM1                           NUMERIC(4, 0) Nullable
ITEM2                           CHAR(4) Nullable
SQL>
				

終了する場合は、以下のように"QUIT"を発行します。

SQL> QUIT;
				

Firebird Embedded Serverでのサンプルアプリケーションの実行

Embedded Server用クライアントDLLの配置

上記で配置したfbclient.dllの代わりにFirebird-1.5.2.4731_embed_win32.zipを 解凍したフォルダ下の fbembed.dll を実行するアプリケーションと同一フォルダにコピーし、 fbclient.dllに名前を変更します。

Firebirdサーバ(サービス)の停止

Embedded ServerはFirebirdサーバアプリケーションが起動しなくてもデータベースに アクセスできます。違いを確認するため、Firebirdサーバを停止します。停止がサービス としてインストールした場合、サービス「Firebird Guardian - DefaultInstance」を停止 します。

アプリケーションの実行

上記で作成したデータベースファイルが残っている場合は削除してから、 アプリケーションを実行します。うまく行けば、データベースとテーブルが作成 されます。

isqlで確認する場合は、Firebirdサーバ(サービス)起動してから行います。停止している 場合はエラーになります。

ソフトウエア製品

やっぱり、製品版でないとなにかと不自由な面も多いのは確かです。Windowsプログラミングするなら...

■ Visual Studio 2008

検出率、アップデート頻度、軽さ等、好評のセキュリティソフト...

■ カスペルスキー

格安レンタルサーバ

月額1000円以下で利用できるレンタルサーバです。

■ ロリポップ!
■ チカッパ!
■ さくらインターネット
■ TOK2 PROFESSIONAL
■ Bfit.jp

ネットバンク

金利の高さと、手数料の安さからネットバンクはたいへんお得です。

■ ジャパンネット銀行
■ イーバンク銀行

アフィリエイト

ブログ、ホームページを持っているなら、アフィリエイトで広告収入を得られます。

■ A8.net
■ リンクシェア
■ JANet

パソコン・周辺機器

インターネットだけのサービスやアウトレット、思わぬ掘り出し物があるので、こまめにチェックしたいものです。

メーカ直販系
□ パソコン本体
■ デルオンラインストア
■ エプソンダイレクト
■ ソニースタイル
■ Apple Store
■ 富士通直販サイト WEB MART
■ NEC「得選街」
■ レノボ・ジャパン株式会社
■ マウスコンピューター
□ 周辺機器
■ ioPLAZA
ショップ系
■ ジョーシン
■ パソコン専門店PCDEPOT WEB本店


Apple Store(Japan)
Copyright(C) 2005 freepg-lab. All rights reserved.
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送