MySQLDatabases/ja
│
Deutsch (de) │
English (en) │
français (fr) │
日本語 (ja) │
polski (pl) │
slovenčina (sk) │
Work in progress
はじめに
In the Database tutorialのページで、MySQLサーバーへの最初の接続を試してみる実例があります。 そのときには、ビジュアル、ノンビジュアルの、どんなコンポーネントも使いませんでした。このページでは、(多分)もっと簡単な方法で、MySQLサーバーに接続する方法を紹介します。
利用するコンポーネント
SQLdb Components
$Lazarus/components/sqldbディレクトリに、もうひとつ別のパッケージがあります。 このディレクトリに、sqldblaz.lpkがあります。このパッケージと、Lazarus/components/sqldb/mysql directoryから、mysql4connlaz.lpkをインストールする必要があります。 最初のsqldblaz.lpkは、すべてのデータベースで利用する一般的なコンポーネントを含みます。これらのコンポーネントは、SQLdbタブの中の、TSQLTransactionやTSQLQueryです。mysql4connlaz.lpkをインストールした後では、SQLdbタブにTMySQLConnectionを見つけることができるでしょう。(depicted by a dolphin)
もし、$Lazarus/components/sqldb/mysql ディレクトリや、 mysql4connlaz.lpkを見つけられない場合、mysql4connlaz.lpkがsqldblaz.lpkにマージされた新しいバージョンを使っている事を意味しています。 もしそうだったら、sqldblaz.lpkをインストールすれば、すべてのコンポーネントをLazarusのIDEのツールバーの中に手に入れることができます。
もし、どうやってコンポーネントやパッケージをインストールするか分からなかったら、インストールの方法の解説を呼んでください。 SQLdbコンポーネントはより一般的で、他のデータベースにも接続できるので、たとえば、TMySQLConnectionをTIBConnectionへ置き換えることも可能です。ですから、(より一般的な)SQLdbコンポーネントでプログラムを開発するようにしましょう。
利用したコンポーネントの説明
TMySQLConnection
TMySQLConnectionは、データベースサーバーに接続するパラメータを保存するのに使われます。 接続するのに使われる、接続するホスト、ユーザーID,パスワードをセットします。 TMySQLConnectionのほかのプロパティは、使いたい時に必要に応じて使います。
'LoginPrompt'プロパティは、まだ機能しないので、接続を開始するために必要なHostNameとDatabaseName、UserName、Passwordプロパティは必ず設定してください。
TSQLTransactionを使う場合、MySQLConnectionと同様に、Transactionプロパティを設定してください。さもないと、SQLQueryをオープンすることができません。
ノート:最新のLazarusのSVN版では、MySQLConnectionコンポーネントに3つのバージョンがあります。
それらは、TMySQL40Connection, TMySQL41Connection and TMySQL50Connectionです。
サーバーにあっている正しいものを使うようにしてください。もし、MySQL 4.1を使っているなら、TMySQL41Connectionを使ってください。
TSQLTransaction
SQLTransactionは、内部的な仕事に使われます。SQLTransactionは、あなたがデータセットをオープンするときには、自動的にactivateされます。接続を閉じるときには、関連のあるトランザクションもdeactivateされ、SQLTransactionをつかっているデータセットもcloseされます。
TSQLQuery
TSQLQueryはSQL文を実行するときに使用されます。SQLにSELECT文を設定し、Openメソッドをコールすることで、データを受け取ることができます。または、INSERT,DELETE,UPDATE文で、データを操作することができます。この場合は、Openメソッドではなく、ExecSQLメソッドを使います。
TDataSource
データソースは、DBEditやDBGridといった目に見える「データを表示し操作するコンポーネント(=data aware components)」と、データセットの間の接続を提供します。データソースは、data aware componentに表示するためのデータを提供する役割があります。
データソースは、1度に1つのデータセットに接続されるべきです。しかし、いくつかのdata awareコンポーネントに接続されることがあります。
TDBGrid
DBグリッドはデータセットのデータを表示するのに使われます。DBGridはデータセットに接続するために、データソースを必要とします。データセットがOpenされると、DBグリッドは自動的にデータを表示します。
私達のプログラム
私達がベースとするもの
私達は、ここで作られたものをベースにしたプログラムをつくるようにしましょう。 これは、オリジナル (in English) Chrisによるものをベースにしています。
メインフォーム
私たちは、同じメイン画面を使用し、最初から、すべての機能性を築き上げます。 コンポーネントが本当にすべての面倒なことを取り去ってくれますが、これから、気をつけるべきいろいろな事があります。
それでは、次のような画面を作るところから始めてみましょう。
SQLdbタブから、TMySQLConnection、TSQLTransaction,TSQLQuery
をフォームの上におきます。Connectionコンポーネント以外は、これらのコンポーネントにつけられたデフォルトの名前を変更しないでください。
すべてのバージョンのMySQLに対応するために、MySQL??Connectionには、MySQLConnection1という名前をつけてください。そして、これらのコンポーネントが連携して動作するために、リンクする必要がありますので、次のようにプロパティをセットしてください。
コンポーネント | プロパティ | 値 |
MySQLConnection1 | Transaction | SQLTransaction1 |
SQLTransaction1 | Database | MySQLConnection1 |
SQLQuery1 | Database | MySQLConnection1 |
SQLQuery1 | Transaction | SQLTransaction1 |
SQLQuery1のトランザクションのプロパティは、最初にMySQLConnection1のトランザクションプロパティをセットしたときに、自動的に設定されます。
これを設定したら、SQLTransaction1.Databaseに、MySQLConnection1が設定されていることに注意してください。
前にも言いましたが、MySQLサーバーのバージョンにあった正しい接続コンポーネントを使っていることを確認してください。
プログラムコード
スクリーン画像を見てください。プログラムの開始時に有効なボタンは、"Connect to Server"と"Exit"だけです。 その他のボタンが機能するためには、まだ充分な情報がないので、無効になっています。 "Connect to Server"ボタンも、接続先ホスト、ユーザー名、パスワードが与えられるまでは無効にしておく、ということもできますが、この場合、ユーザーは何もすることが無いから、"Exit"を押すしかないな、と考えてしまうでしょう。
まずコードを示す前に、コードには、例外を扱うコードを入れるべきであることを強調したいと思います。
クリティカルなセクションは、
try ... finally
あるいは、
try ... except
の構文に入れるようにしてください。
サーバーに接続する
最初にやることは、サーバーに接続することです。接続する時に、サーバーのどのデータベースが利用可能かどうか知らなければ、実行時の接続するときにデータベースのリストから尋ねるようにできます。 しかしながら、今回は1つを選択し、MySQLConnectionのプロパティの、有効なDatabaseNameを開いて接続するようにしてください。コードの中に、私が使っている"mysql"データベースがあります。 このデータベースはmysqlによって内部的に使われるもので、常に存在します。
procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
begin
// アクティブコネクションがあることを調べる。もしあれば閉じよう
if MySQLConnection1.Connected then CloseConnection(Sender);
// コネクションパラメータを設定
MySQLConnection1.HostName := HostEdit.Text;
MySQLConnection1.UserName := UserEdit.Text;
MySQLConnection1.Password := PasswdEdit.Text;
MySQLConnection1.DatabaseName := 'mysql'; // MySQLはいつもここにある!
ShowString('Opening a connection to server: ' + HostEdit.Text);
MySQLConnection1.Open;
// 始めに利用できるデータベースのリストを取得する
if MySQLConnection1.Connected then begin
ShowString('Connected to server: ' + HostEdit.Text);
ShowString('Retrieving list of available databases.');
SQLQuery1.SQL.Text := 'show databases';
SQLQuery1.Open;
while not SQLQuery1.EOF do begin
DatabaseComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
SQLQuery1.Next;
end;
SQLQuery1.Close;
ShowString('List of databases received!');
end;
end;
まず、最初にチェックすることは、サーバーに接続しているかどうか、そして、プライベートメソッドのCloseConnectionを呼んでいるか、ということです。このメソッドで、いくつかの内部的な処理がおこなわれ、終了します。ボタンをdisableにしたり、チェックボックスやリストボックスをクリアしたりします。 そして、サーバに接続するために必要なパラメータをセットします。
- プログラムでは、ShowStringをコールしていることに気が付くでしょう。これは、memoにログのように、文を追加していきます。
パラメータをセットすれば、サーバーに接続できます。これは、次の文をコールすることで実行されます。
MySQLConnection1.Open;
行儀の良いアプリケーションでは、これを例外処理構造にいれて、接続が失敗した場合に、わかりやすいメッセージでユーザーに伝えるべきです。
接続がおこなわれれば、サーバーからデータベースのリストを取得します。サーバーからデータを取得するには、TSQLQueryを使います。SQLプロパティに、SQL文を入れ、サーバーに送ります。MySQLサーバーは、"SHOW DATABASES"コマンドが、データベースのリストを取得するコマンドである、ということを理解します。SQL文をセットしたら、次のようにコールします。
SQLQuery1.Open;
SQLQueryの結果セットは、fieldsプロパティを使って調べることができます。 レコードをイテレーションするために、次のようにコールします。
SQLQuery1.Next;
すべての利用できるデータベースをコンボボックスに追加したら、SQLQueryを再びクローズしてください。
データベースを選択する
ユーザがDatabaseComboBoxからデータベースを選択したときに、"Select Database"ボタンを有効にします。そのボタンのOnClickイベントで、MySQLConnection1のDatabaseNameをセットして、テーブルのリストを要求します。このプロシージャの最後の命令で、"Open Query"ボタンを有効にして、ユーザーが"Command"エディットボックスでクエリを入力でき、サーバに送信できるようにします。
procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject); begin // A database has been selected so lets get the tables in it. CloseConnection(Sender); if DatabaseComboBox.ItemIndex <> -1 then begin with DatabaseComboBox do MySQLConnection1.DatabaseName := Items[ItemIndex]; ShowString('Retreiving list of tables'); SQLQuery1.SQL.Text := 'show tables'; SQLQuery1.Open; while not SQLQuery1.EOF do begin TableComboBox.Items.Add(SQLQuery1.Fields[0].AsString); SQLQuery1.Next; end; SQLQuery1.Close; ShowString('List of tables received'); end; OpenQueryButton.Enabled := True; end;
MySQLはデータベースのリストを取得する場合と比較して、テーブルのリストを取得するための特別のコマンド"show tables"を持っています。このクエリの結果もデータベースリストと同じように、すべてのテーブルをTableComboBoxに追加していきます。
どうしてこのクエリをオープンする前に、コネクションを再度オープンしなかったのか、疑問に思うかもしれません。 これは、自動的にSQLQueryが有効になったときに、必要に応じて内部的におこなわれるので、必ずしも必要ではありません。
テーブル内のフィールド
MySQLにおいて、テーブルと同様に、テーブルのフィールドを取得する場合にも、"SHOW"を使って、"SHOW COLUMNS FROM <tablename>"とすることでできます。ユーザーがテーブルをTableComboBoxから選択すると、そのComboBoxのOnChangedEventがトリガーとなって、FieldListboxへフィールドの名前を入れます。
procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject); begin FieldListBox.Clear; SQLQuery1.SQL.Text := 'show columns from ' + TableComboBox.Text; SQLQuery1.Open; while not SQLQuery1.EOF do begin FieldListBox.Items.Add(SQLQuery1.Fields[0].AsString); SQLQuery1.Next; end; SQLQuery1.Close; end;
結果セットには、フィールドの名前と同じように、フィールドの型情報、キーになっているかどうか、nullが許されるか、など、色んな情報が含まれています。
データを表示する
データベースに接続するために、コンポーネントを使うという方針と同様に、データを表示するためにも、いくつかのコンポーネントを使ってみましょう。
ユーザーからの要求に応じてデータを表示するグリッドのために、2番目のフォームを使います。 このフォームは、ユーザーが"Command"エディットボックスにSQLコマンドを入力し、"Open Query"ボタンを押した後で表示されるようにします。
これはそのOnClickイベントです。
procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject); begin ShowQueryForm := TShowQueryForm.Create(self); ShowQueryForm.Datasource1.DataSet := SQLQuery1; SQLQuery1.SQL.Text := CommandEdit.Text; SQLQuery1.Open; ShowQueryForm.ShowModal; ShowQueryForm.Free; SQLQuery1.Close; end;
ShowQueryFormは、次のようにします。
下記のようにコントロールを配置します。
TPanel | Align | alBottom |
TDataSource | ||
TDBGrid | Align | alClient |
DataSource | DataSource1 | |
TButton | Caption | Close |
ボタンはパネルの上に配置してください。"Open Query"のOnClickで起きることは次の通りです。 まず最初に、TShowQueryFormのインスタンスを生成します。次に、DataSourceのDatasetのプロパティに、SQLQuery1を設定します。それから、SQLQueryにユーザが"Command"エディットボックスで入力したSQLコマンドを設定し、オープンします。そして、ShowQueryFromをモーダル表示させ、クローズされるまでは、フォーカスを維持するようにします。
このフォームがクローズされたら、Freeして、SQLQuery1を再びクローズします。
ソースコード
The sources for this project can be downloaded here For more demo projects see sourceforge