AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
DelphiXE3 [FMX] データベース SQLite 2014/07/25
 
前回は、データベース Firebird について記述してみました。Firebird の場合、Windowsアプリケーションであればかろうじて動作出来ましたが、MacOSXアプリケーションだと残念な結果となってしまいました(※当方が使用しているのは DelphiXE3 Professional版である為)
 
このままでは、MacOSX用のデータベース・アプリケーションを作成したい、という場合に困った事になってしまうため、今回は「SQLite」を利用する事を考えてみます。
 
「SQLite」は、フリーウェアの軽量・高速なデータベースで、スタンドアロン用?のようです。SQLiteの動的ライブラリは、MacOSX には元々標準で入っていて、別段何もする必要はありません。アプリケーションは通常と同じように配布すれば良いようです。Windows用は、http://www.sqlite.org/ にて公開されているDLLファイルをダウンロードして利用します。32bitアプリケーションを作成する場合は、32bit用のDLLファイル、64bitアプリケーションを作成する場合は、64bit用のDLLファイルを、実行型ファイルと同じフォルダに入れるだけです。今現在、「sqlite-dll-win32-x86-3080500.zip」及び「sqlite-dll-win64-x64-3080500.zip」となっています。
 
Firebird や Interbase等のように、データベースエンジンを別途インストールする、というような事はありません。しかし、クライアント/サーバー型データベースの代わりになるようなものではない、というような記述もありますので、用途に応じてうまく利用する、という事なのでしょう。
 
DelphiXE3のヘルプに「チュートリアル:SQLite データベースに接続する(Delphi)」というページがありますので、その簡単なサンプルプログラムを FireMonkey HD アプリケーションで作成してみます。
 
このヘルプ内容と同じように、メモ、ボタン2つ、そして、[dbExpress]内の TSQLConnection を配置します。オブジェクトインスペクタで、配置したSQLConnection1 の Driver プロパティを「Sqlite」に設定します。

 
また、LoginPrompt を「False」にして(Trueのままでも、SQLiteにはログイン名・パスワードの設定はないので、何も出ませんが…)、Params プロパティの右横[…]をクリックします。そして、
「ColumnMetaDataSupported」が「True」になっているのを「False」
「FailIfMissing」が「True」になっているのを「False」
と書き換えます。
前者は、MacOSXアプリケーションを作成する場合は必須事項です。これをしておかないとアプリケーションは正常動作しません
後者は、データベースに接続する際、データベースファイルが存在しない場合、自動的に新規状態のファイルを作成してくれるようになります。
 
「SQLite」でのデータベースは、データベースファイルが1つだけ、というシンプルで扱い易い状態になります。データテーブルはこのデータベースファイルの中に格納されます。
 
ボタンが逆になってしまいましたが、Button2=接続なので、まずはこの Button2 のクリックイベントハンドラを記述します。
// 接続
procedure TForm1.Button2Click(Sender: TObject);
begin
 SQLConnection1.Params.Add('Database='+DBFile);
 try
  // 接続を確立
  SQLConnection1.Connected := true;
  Button1.Enabled := true;
  Memo1.Text := 'Connection established!';
 except
  on E: EDatabaseError do
   ShowMessage('Exception raised with message' + E.Message);
 end;
end;
ヘルプのコードそのままです。
データベースファイルは、フォームを最初に表示した際に、設定しておきます。変数 DBFile は、Form1 の pivate 宣言部で変数宣言しています。
procedure TForm1.FormShow(Sender: TObject);
begin
 DBFile := ExtractFilePath(ParamStr(0))+'test.s3db';
end;
ここでは、実行プログラムファイルと同じフォルダにデータベースファイルを置く、というふうにしています。
 
次に、[実行]ボタン=Button1 をクリックした時の処理を記述します。
ヘルプでは下記のようになります(少し書き直しています)。
procedure TForm1.executeButtonClick(Sender: TObject);
var
 results: TDataSet;
 query: String;
begin
 Memo1.Clear;
 // ランダム クエリ
 query := 'SELECT * FROM example;';
 
 try
  // データベースでクエリを実行
  SQLConnection1.Execute(query, nil, results);
 except
  on E: Exception do
   Memo1.Text := 'Exception raised with message: ' + E.Message;
 end;
 // クエリの結果を TMemo コントロールに表示
 ShowSelectResults(results);
end;
 
procedure TForm1.ShowSelectResults(results: TDataSet);
var
 names: TStringList;
 i: Integer;
 currentField: TField;
 currentLine: string;
begin
 if not results.IsEmpty then begin
  results.First;
  names := TStringList.Create;
  results.GetFieldNames(names);
  while not results.Eof do begin
   currentLine := '';
   for i := 0 to names.Count - 1 do begin
    currentField := results.FieldByName(names[i]);
    currentLine := currentLine + ' ' + currentField.AsString;
   end;
   Memo1.Lines.Add(currentLine);
   results.Next;
  end;
 end;
end;
このヘルプのサンプルプログラムは、見た通り、既に存在するデータベースファイル内の example テーブル内容を表示する、というもので、最初に始めるプログラムとしては成立していません。最初はデータベースファイルも中身のテーブルも何も無いのですから。
 
というわけで、まずは、データベースファイルを新規作成/開く(接続する)ところからですが、これは、
SQLConnection1.Params.Add('Database='+DBFile);
SQLConnection1.Connected := true;
をするだけで出来ます(上記のプロパティ指定をしているという前提です)。

データベースファイル(変数 DBFile)が存在しない場合は、新規作成され、データベース接続を行います。存在する場合はそれを開きます。
 
データベースは、1つ又は複数のテーブル(表)データを持ちます。例えば学校であれば、生徒の名簿データであったり、生徒の成績表データであったり、するかもしれません。
 
まずは、テーブルを作成する所から見てみます。
テーブルの作成は、他のデータベースエンジン同様、SQLにて記述する事が出来ますので、SQLの「CREATE TABLE」文で可能です。例えば、
try
 SQLConnection1.ExecuteDirect('CREATE TABLE addr ('
  + ' N INTEGER NOT NULL UNIQUE,'
  + ' PNAME TEXT,'
  + ' PKANA TEXT,'
  + ' ZIP1 TEXT,'
  + ' ZIP2 TEXT,'
  + ' ADR1 TEXT,'
  + ' ADR2 TEXT,'
  + ' TEL TEXT,'
  + ' FAX TEXT );');
 except
  ;
end;
のような感じで、テーブル「addr」が作成出来ます。
 
SQLite の データ型は、基本的に、下記のようになっています。
INTEGER整数値
REAL実数値
TEXT文字列(Unicode)
BLOBバイナリデータ(画像等)
 
 
次に、テーブルにデータを登録します。
try
 SQLConnection1.ExecuteDirect('INSERT INTO addr ('
  + ' N, PNAME, PKANA, ZIP1, ZIP2, ADR1, ADR2, TEL, FAX)'
  + ' VALUES ('
  + ' 1, ''愛上男'', ''あいうえお'', ''100'', ''1234'','
  + ' NULL,NULL,NULL,NULL );');
except
 ;
end;
のような感じです。
 
 
そして、テーブル内容を表示します。
try
 // データベースでクエリを実行
 SQLConnection1.Execute('SELECT * FROM addr;', nil, results);
except
 on E: Exception do
  Memo1.Text := 'Exception raised with message: ' + E.Message;
end;
ShowSelectResults(results);
 
 
 
それでは、、データベースの説明頁で記載した「住所録」プログラム(d013.zip)と似たようなプログラムを、FireMonkey HD アプリケーションで作成します。そのまま流用したり、画面デザインのコピー&ペーストが出来ないので、同じような感じに似せて1から画面デザインします。プログラムコードは普通にコピー&ペースト出来ますが、一部、変更を行なっています。本来は、もっとしっかりコーディングしないといけない所ですが、テストということで省いていますので注意して下さい。
 

 
・郵便番号辞書の関連は入れていません。
・データ入力・編集にて、エディットコンポーネントに MaxLength プロパティがありませんから本来はプログラムで入力文字数チェックが必要になりますが、入れていません。
・データCSV読み書きで Unicode対応をすべき所ですが、何もしていません。以前のままです。
・ShowMessageはたしか非推奨だったと思われますが、以前のまま使っています。
・アイコンは作成していません。
・トランザクション処理は正常に機能しているかどうかのチェックはしていません。(正しい手法も知りませんので…)
 
 
ソースプログラムのみです。実行プログラムやDLLファイル等は含んでいません。
 
 
LAN上の共有フォルダにデータベースファイルを配置し、複数PCからそれを参照させる、というような事は、やはり、多少の怪しい動作をしてしまう為、おすすめは出来ません。同じ登録番号のデータを複数PCから同時に登録をした場合、エラーせず、それぞれのPCで、それぞれの値を登録したかのような、おかしな動きをしたりします。
 
まぁ、そのような無茶な使い方をしない限りは、WindowsアプリケーションとMacOSXアプリケーション共通で、スタンドアロン用のデータベースを扱う事が出来るようなものを作る事が出来ます。
 
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Dehi入門編
>Delphi2010
>DelphiXE3
▲2014/07/16
 2014/07/25
▼2014/07/28
 
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.