title_parttitle_parttitle_part
静岡県浜松市であれこれソフトを開発している A.K.I Software のブログです。日々の開発日記やサーバー・セキュリティ関連の話題なども掲載。
<< 2024/03 >>12345678910111213141516171819202122232425262728293031
《《《 ネットワーク機器の購入は Amazon で! 》》》
Powered by BLOM Delphi で FireBird を使ってみた
小さくも大きくも閉じたりもしません
09/06/23 14:55 / IT関連

SQL と言うと MySQL や PostgreSQL などが有名ですが、InterBase から分かれた FireBird という SQL サーバーがあります。

今まで開発していたソフトウェアではデータベースの必要が感じられなかった事やオリジナルのDB サーバー(これまた独自仕様でして。要はデータをオンメモリ or ディスクスペースに置いておき、追加、削除、更新とクエリが出来ればいいのですよデータベースなんて。トランザクションは余り考慮していませんが。)があった為スルーしていたのですが、なんとなく使ってみようという感じでして。

FireBird は InterBase と互換性がありますので Delphi で InterBase コンポーネントを使います。

まず、FireBird をインストールします。
ISQL を使って、取りあえず DataBase の作成を手動でやります。

SQL]CREATE DATABASE 'd:\sample.fdb' user 'SYSDBA' password 'masterkey';

SYSDBA と masterkey はデフォルトで作成される ID/Password です。パスワードの変更はぐぐって下さい。

エラーが出なければ、Dドライブのルートに sample.fdb というファイルが生成されます。これがデータベースのファイルになります。

データベースファイルが出来たら、接続します。
同じく ISQL より

SQL]CONNECT 'd:\sample.fdb' user 'SYSDBA' password 'masterkey';

コミットするかどうか聞いてきますので取りあえず y でコミットします。

ログインが出来ますと、データベースの名前とログインしたユーザー名が表示されます。

今度はデータベースの中にテーブルを作ります。

SQL]CREATE TABLE address (
name VARCHAR(64) NOT NULL PRIMARY KEY,
tel VARCAR(11) NOT NULL
age INTEGER NOT NULL
);

address というテーブルに、name と tel と age というフィールドを作成して、それぞれの型を指定します。
ISQL はコマンドの終端を ; (セミコロン) で認識しますので長い場合は適当に改行を入れつつ最後に ; で〆る感じですね。

テーブルが作成出来たら、確認してみます。
SQL]SHOW TABLES;
で、データベースの中にあるテーブルの一覧が表示されます。今は address というテーブルが1つだけあるはずです。
SQL]SHOW TABLE address;
と入れれば、先程作成したテーブルの内容が表示されます。

ここまでで箱が出来ましたので、実際にデータ(レコード)を入れてみます。
SQL]INSERT INTO address (NAME,TEL,AGE)
VALUES('A.K.I Software','01234567890',99);

VARCHAR や INTEGER はサイズが決まっていますので、その範囲に収まるようにします。例えば tel フィールドは 11文字ですので、12文字入れようとするとエラーになります。

テーブルの中にレコードが入りましたので、所謂クエリをしてみます。

SQL]SELECT * FROM address;

フィールドに従ってレコードが表示されます。
* は全てを指定していますので、今度は
SQL]SELECT NAME,TEL FROM address;
SQL]SELECT NAME,AGE FROM address;
などをやってみると、それに従ってクエリを掛けることができます。

最後に
SQL]commit;
でコミットしておきます。

さて手動でクエリを行っていますが、これを Delphi でやってみます。

Form上に IBDataBase と IBTransaction と IBDataSet を貼り付けて、各プロパティを設定します。
(IBDataSet の代わりにに IBSQL や IBQuery を使っても良いのですが、後々楽なので)

まず、IBDataBase1 の DatabaseName に最初に作ったデータベースファイルを指定します。
DefaultTransaction には、フォーム上に貼り付けた IBTransaction1 を指定します。
params には
user_name=SYSDBA
password=masterkey
と設定しておきますと、パラメータに従ってログインしてくれます。(LoginPrompt を false にしておきます。True にすればログイン用のダイアログが表示されます)
Connected を True に変更すれば、データベースファイルに接続してログインをします。(もちろん FireBird が起動している必要があります)

IBTransaction1 の DefaultDataBase には 上の IBDataBase1 を指定して他は特に指定しません。
設定したら、Active を True にします。これでトランザクションが有効になります。

IBDataSet1 の DataBase と Transaction にそれぞれ、IBDataBase1 と IBTransaction1 を指定します。
(IBTransaction1 が IBDataBase と IBDataSet1 の橋渡しをしてくれる訳です)

最後に IBDataSet1 の SelectSQL に手動で行っていた
SELECT * FROM address;
を入れておきます。

フォームに Memo1 と Button1 を配置して、Button1 の中に以下のコードを記述します。

procedure TForm1.Button1Click(Sender: TObject);
var
i,cnt:integer;
begin
IBDataSet1.Open;
IBDataSet1.Last;
cnt:=IBDataSet1.RecordCount;
IBDataSet1.First;
for i:=0 to cnt-1 do
begin
Memo1.lines.Add(IBDataSet1.Fields[0].AsString);
Memo1.lines.Add(IBDataSet1.Fields[1].AsString);
Memo1.lines.Add(IBDataSet1.Fields[2].AsInteger);
IBDataSet1.Next;
end;
IBDataSet1.Close;
end;

Button1 をクリックすると、レコードの内容が Memo1 に出力されます。
最初に、IBDataSet1.Last と IBDataSet1.First を行っているのはレコード数を確認する為です。(プロパティが RecordCount になっていますが、RecordPositionみたいな感じですね)
Fields[x] を使っていますが、フィールド名が分かっている場合は、FieldByName() を使った方がわかりやすいです。

上記のコードは全レコードを表示する物ですが、本来は SELECT文でWHERE等を使って条件を定義して、必要なデータのみを抽出する必要があります(でないと、SQL の意味がない)

後はアプリケーションから INSERT や DROP などを投げたりクエリしたりするようにすれば立派なDBソフトの出来上がりです。簡単ですね(^-^

[更新日付:2009/06/23 14:55:23]
トラックバックを見る(0)
Log Link [https://akisoftware.com/cgi-bin/blom.exe?akisoft+sl+29d9f37b5f4021ff10e44487e9be3f9ab5301c52]
TB Link [https://akisoftware.com/cgi-bin/blom.exe?akisoft+tb+29d9f37b5f4021ff10e44487e9be3f9ab5301c52]

記事へのコメント

名前 : じゅじゅ (2011/03/21 21:07:27)

Delphi XE + Firebird 2.5 (x64) で試したのですが、IBDatabase1/connected/False を True にしようとすると
「unavailable database」というエラーが発生します。

オブジェクトインスペクタの下部に「接続設定は InterBase Express14,13 」と出ています。

サービスは実行中であることも確認しています。
Firebird Guardian - DefaultInstance
Firebird Server - DefaultInstance

Pro版 には Firebird はサポートされておらず、フリーであるFirebird をサポートすれば週末プログラマの厳しい財布の中であってもユーザーも増えることだろうにと思うんですよね。残念です。

名前 : ななし (2009/12/12 06:37:11)

Memo1.lines.Add(IBDataSet1.Fields[2].AsInteger)に
IntTostrが入っていないと言うことですかね>>はてなさん

名前 : H.Matsuda (2009/06/24 10:27:53)

Delphi2007でやっていますので2009ではわかりませんが、2009では動かないのでしょうか?
確認されましたか?の意図がわからないのですが。


名前
コメントキー
 
コメントする時はキーを正確に入力して下さい
コメント
アドレスを含んだコメントはできません
© 2008-10 A.K.I Software all rights reserved.