Sign in Join
Wiki copytemporary

MySQLDatabases/ja: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11**Work in progress**
22
33## はじめに
44
55In the [[Lazarus Database Tutorial|Database tutorialのページで]]、MySQLサーバーへの最初の接続を試してみる実例があります。 そのときには、ビジュアル、ノンビジュアルの、どんなコンポーネントも使いませんでした。このページでは、(多分)もっと簡単な方法で、MySQLサーバーに接続する方法を紹介します。
66
77## 利用するコンポーネント
88
99### SQLdb Components
1010
1111\$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)
1212
1313もし、\$Lazarus/components/sqldb/mysql ディレクトリや、 mysql4connlaz.lpkを見つけられない場合、mysql4connlaz.lpkがsqldblaz.lpkにマージされた新しいバージョンを使っている事を意味しています。 もしそうだったら、sqldblaz.lpkをインストールすれば、すべてのコンポーネントをLazarusのIDEのツールバーの中に手に入れることができます。
1414
1515もし、どうやってコンポーネントやパッケージをインストールするか分からなかったら、[[Install Packages/ja|インストールの方法の解説を]]呼んでください。 SQLdbコンポーネントはより一般的で、他のデータベースにも接続できるので、たとえば、TMySQLConnectionをTIBConnectionへ置き換えることも可能です。ですから、(より一般的な)SQLdbコンポーネントでプログラムを開発するようにしましょう。
1616
1717## 利用したコンポーネントの説明
1818
1919### TMySQLConnection
2020
2121TMySQLConnectionは、データベースサーバーに接続するパラメータを保存するのに使われます。 接続するのに使われる、接続するホスト、ユーザーID,パスワードをセットします。 TMySQLConnectionのほかのプロパティは、使いたい時に必要に応じて使います。
2222
2323'LoginPrompt'プロパティは、まだ機能しないので、接続を開始するために必要なHostNameとDatabaseName、UserName、Passwordプロパティは必ず設定してください。
2424
2525TSQLTransactionを使う場合、MySQLConnectionと同様に、Transactionプロパティを設定してください。さもないと、SQLQueryをオープンすることができません。
2626
2727ノート:最新のLazarusのSVN版では、MySQLConnectionコンポーネントに3つのバージョンがあります。 それらは、TMySQL40Connection, TMySQL41Connection and TMySQL50Connectionです。
2828
2929サーバーにあっている正しいものを使うようにしてください。もし、MySQL 4.1を使っているなら、TMySQL41Connectionを使ってください。
3030
3131### TSQLTransaction
3232
3333SQLTransactionは、内部的な仕事に使われます。SQLTransactionは、あなたがデータセットをオープンするときには、自動的にactivateされます。接続を閉じるときには、関連のあるトランザクションもdeactivateされ、SQLTransactionをつかっているデータセットもcloseされます。
3434
3535### TSQLQuery
3636
3737TSQLQueryはSQL文を実行するときに使用されます。SQLにSELECT文を設定し、Openメソッドをコールすることで、データを受け取ることができます。または、INSERT,DELETE,UPDATE文で、データを操作することができます。この場合は、Openメソッドではなく、ExecSQLメソッドを使います。
3838
3939### TDataSource
4040
4141データソースは、DBEditやDBGridといった目に見える「データを表示し操作するコンポーネント(=data aware components)」と、データセットの間の接続を提供します。データソースは、data aware componentに表示するためのデータを提供する役割があります。
4242
4343データソースは、1度に1つのデータセットに接続されるべきです。しかし、いくつかのdata awareコンポーネントに接続されることがあります。
4444
4545### TDBGrid
4646
4747DBグリッドはデータセットのデータを表示するのに使われます。DBGridはデータセットに接続するために、データソースを必要とします。データセットがOpenされると、DBグリッドは自動的にデータを表示します。
4848
4949## 私達のプログラム
5050
5151### 私達がベースとするもの
5252
5353私達は、[[Lazarus Database Tutorial|ここで]]作られたものをベースにしたプログラムをつくるようにしましょう。 これは、[[Lazarus Database Tutorial|オリジナル (in English)]] Chrisによるものをベースにしています。
5454
5555### メインフォーム
5656
5757私たちは、同じメイン画面を使用し、最初から、すべての機能性を築き上げます。 コンポーネントが本当にすべての面倒なことを取り去ってくれますが、これから、気をつけるべきいろいろな事があります。
5858
5959それでは、次のような画面を作るところから始めてみましょう。\
6060![](/wiki-images/2/28/Trymysql.png)\
6161SQLdbタブから、TMySQLConnection、TSQLTransaction,TSQLQuery ![](/wiki-images/6/6d/Components.png)をフォームの上におきます。Connectionコンポーネント以外は、これらのコンポーネントにつけられたデフォルトの名前を変更しないでください。 すべてのバージョンのMySQLに対応するために、MySQL??Connectionには、MySQLConnection1という名前をつけてください。そして、これらのコンポーネントが連携して動作するために、リンクする必要がありますので、次のようにプロパティをセットしてください。
6262
6363| | | |
6464|--------------------|----------------|------------------|
6565| **コンポーネント** | **プロパティ** | **値** |
6666| MySQLConnection1 | Transaction | SQLTransaction1 |
6767| SQLTransaction1 | Database | MySQLConnection1 |
6868| SQLQuery1 | Database | MySQLConnection1 |
6969| SQLQuery1 | Transaction | SQLTransaction1 |
7070
7171SQLQuery1のトランザクションのプロパティは、最初にMySQLConnection1のトランザクションプロパティをセットしたときに、自動的に設定されます。
7272
7373これを設定したら、SQLTransaction1.Databaseに、MySQLConnection1が設定されていることに注意してください。
7474
7575前にも言いましたが、MySQLサーバーのバージョンにあった正しい接続コンポーネントを使っていることを確認してください。
7676
7777### プログラムコード
7878
7979スクリーン画像を見てください。プログラムの開始時に有効なボタンは、"Connect to Server"と"Exit"だけです。 その他のボタンが機能するためには、まだ充分な情報がないので、無効になっています。 "Connect to Server"ボタンも、接続先ホスト、ユーザー名、パスワードが与えられるまでは無効にしておく、ということもできますが、この場合、ユーザーは何もすることが無いから、"Exit"を押すしかないな、と考えてしまうでしょう。
8080
8181まずコードを示す前に、コードには、例外を扱うコードを入れるべきであることを強調したいと思います。
8282
8383クリティカルなセクションは、
8484
85-`try ... finally`
85+```text
86+try ... finally
87+```
8688
8789あるいは、
8890
89-`try ... except`
91+```text
92+try ... except
93+```
9094
9195の構文に入れるようにしてください。
9296
9397#### サーバーに接続する
9498
9599最初にやることは、サーバーに接続することです。接続する時に、サーバーのどのデータベースが利用可能かどうか知らなければ、実行時の接続するときにデータベースのリストから尋ねるようにできます。 しかしながら、今回は1つを選択し、MySQLConnectionのプロパティの、有効なDatabaseNameを開いて接続するようにしてください。コードの中に、私が使っている"mysql"データベースがあります。 このデータベースはmysqlによって内部的に使われるもので、常に存在します。
96100
97-`procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);`\
98-`begin`\
99-`  // Check if we have an active connection. If so, let's close it.`\
100-`  if MySQLConnection1.Connected then CloseConnection(Sender);`\
101-`  // Set the connection parameters.`\
102-`  MySQLConnection1.HostName := HostEdit.Text;`\
103-`  MySQLConnection1.UserName := UserEdit.Text;`\
104-`  MySQLConnection1.Password := PasswdEdit.Text;`\
105-`  MySQLConnection1.DatabaseName := 'mysql'; // MySQL is allways there!`\
106-`  ShowString('Opening a connection to server: ' + HostEdit.Text);`\
107-`  MySQLConnection1.Open;`\
108-`  // First lets get a list of available databases.`\
109-`  if MySQLConnection1.Connected then begin`\
110-`    ShowString('Connected to server: ' + HostEdit.Text);`\
111-`    ShowString('Retrieving list of available databases.');`\
112-`    SQLQuery1.SQL.Text := 'show databases';`\
113-`    SQLQuery1.Open;`\
114-`    while not SQLQuery1.EOF do begin`\
115-`      DatabaseComboBox.Items.Add(SQLQuery1.Fields[0].AsString);`\
116-`      SQLQuery1.Next;`\
117-`    end;`\
118-`    SQLQuery1.Close;`\
119-`    ShowString('List of databases received!');`\
120-`  end;`\
121-`end;`
101+``` pascal
102+procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
103+begin
104+ // Check if we have an active connection. If so, let's close it.
105+ if MySQLConnection1.Connected then CloseConnection(Sender);
106+ // Set the connection parameters.
107+ MySQLConnection1.HostName := HostEdit.Text;
108+ MySQLConnection1.UserName := UserEdit.Text;
109+ MySQLConnection1.Password := PasswdEdit.Text;
110+ MySQLConnection1.DatabaseName := 'mysql'; // MySQL is allways there!
111+ ShowString('Opening a connection to server: ' + HostEdit.Text);
112+ MySQLConnection1.Open;
113+ // First lets get a list of available databases.
114+ if MySQLConnection1.Connected then begin
115+ ShowString('Connected to server: ' + HostEdit.Text);
116+ ShowString('Retrieving list of available databases.');
117+ SQLQuery1.SQL.Text := 'show databases';
118+ SQLQuery1.Open;
119+ while not SQLQuery1.EOF do begin
120+ DatabaseComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
121+ SQLQuery1.Next;
122+ end;
123+ SQLQuery1.Close;
124+ ShowString('List of databases received!');
125+ end;
126+end;
127+```
122128
123129まず、最初にチェックすることは、サーバーに接続しているかどうか、そして、プライベートメソッドのCloseConnectionを呼んでいるか、ということです。このメソッドで、いくつかの内部的な処理がおこなわれ、終了します。ボタンをdisableにしたり、チェックボックスやリストボックスをクリアしたりします。 そして、サーバに接続するために必要なパラメータをセットします。
124130
125131
126132*プログラムでは、ShowStringをコールしていることに気が付くでしょう。これは、memoにログのように、文を追加していきます。*
127133
128134パラメータをセットすれば、サーバーに接続できます。これは、次の文をコールすることで実行されます。
129135
130-`MySQLConnection1.Open;`
136+```text
137+MySQLConnection1.Open;
138+```
131139
132140行儀の良いアプリケーションでは、これを例外処理構造にいれて、接続が失敗した場合に、わかりやすいメッセージでユーザーに伝えるべきです。
133141
134142接続がおこなわれれば、サーバーからデータベースのリストを取得します。サーバーからデータを取得するには、TSQLQueryを使います。SQLプロパティに、SQL文を入れ、サーバーに送ります。MySQLサーバーは、"SHOW DATABASES"コマンドが、データベースのリストを取得するコマンドである、ということを理解します。SQL文をセットしたら、次のようにコールします。
135143
136-`SQLQuery1.Open;`
144+```text
145+SQLQuery1.Open;
146+```
137147
138148SQLQueryの結果セットは、fieldsプロパティを使って調べることができます。 レコードをイテレーションするために、次のようにコールします。
139149
140-`SQLQuery1.Next;`
150+```text
151+SQLQuery1.Next;
152+```
141153
142154すべての利用できるデータベースをコンボボックスに追加したら、SQLQueryを再びクローズしてください。
143155
144156#### データベースを選択する
145157
146158ユーザがDatabaseComboBoxからデータベースを選択したときに、"Select Database"ボタンを有効にします。そのボタンのOnClickイベントで、MySQLConnection1のDatabaseNameをセットして、テーブルのリストを要求します。このプロシージャの最後の命令で、"Open Query"ボタンを有効にして、ユーザーが"Command"エディットボックスでクエリを入力でき、サーバに送信できるようにします。
147159
148-`procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);`\
149-`begin`\
150-`  // A database has been selected so lets get the tables in it.`\
151-`  CloseConnection(Sender);`\
152-`  if DatabaseComboBox.ItemIndex <> -1 then begin`\
153-`    with DatabaseComboBox do`\
154-`      MySQLConnection1.DatabaseName := Items[ItemIndex];`\
155-`    ShowString('Retreiving list of tables');`\
156-`    SQLQuery1.SQL.Text := 'show tables';`\
157-`    SQLQuery1.Open;`\
158-`    while not SQLQuery1.EOF do begin`\
159-`      TableComboBox.Items.Add(SQLQuery1.Fields[0].AsString);`\
160-`      SQLQuery1.Next;`\
161-`    end;`\
162-`    SQLQuery1.Close;`\
163-`    ShowString('List of tables received');`\
164-`  end;`\
165-`  OpenQueryButton.Enabled := True;`\
166-`end;`
160+``` pascal
161+procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
162+begin
163+ // A database has been selected so lets get the tables in it.
164+ CloseConnection(Sender);
165+ if DatabaseComboBox.ItemIndex <> -1 then begin
166+ with DatabaseComboBox do
167+ MySQLConnection1.DatabaseName := Items[ItemIndex];
168+ ShowString('Retreiving list of tables');
169+ SQLQuery1.SQL.Text := 'show tables';
170+ SQLQuery1.Open;
171+ while not SQLQuery1.EOF do begin
172+ TableComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
173+ SQLQuery1.Next;
174+ end;
175+ SQLQuery1.Close;
176+ ShowString('List of tables received');
177+ end;
178+ OpenQueryButton.Enabled := True;
179+end;
180+```
167181
168182MySQLはデータベースのリストを取得する場合と比較して、テーブルのリストを取得するための特別のコマンド"show tables"を持っています。このクエリの結果もデータベースリストと同じように、すべてのテーブルをTableComboBoxに追加していきます。
169183
170184どうしてこのクエリをオープンする前に、コネクションを再度オープンしなかったのか、疑問に思うかもしれません。 これは、自動的にSQLQueryが有効になったときに、必要に応じて内部的におこなわれるので、必ずしも必要ではありません。
171185
172186#### テーブル内のフィールド
173187
174188MySQLにおいて、テーブルと同様に、テーブルのフィールドを取得する場合にも、"SHOW"を使って、"SHOW COLUMNS FROM \<tablename\>"とすることでできます。ユーザーがテーブルをTableComboBoxから選択すると、そのComboBoxのOnChangedEventがトリガーとなって、FieldListboxへフィールドの名前を入れます。
175189
176-`procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);`\
177-`begin`\
178-`  FieldListBox.Clear;`\
179-`  SQLQuery1.SQL.Text := 'show columns from ' + TableComboBox.Text;`\
180-`  SQLQuery1.Open;`\
181-`  while not SQLQuery1.EOF do begin`\
182-`    FieldListBox.Items.Add(SQLQuery1.Fields[0].AsString);`\
183-`    SQLQuery1.Next;`\
184-`  end;`\
185-`  SQLQuery1.Close;`\
186-`end;`
190+``` pascal
191+procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
192+begin
193+ FieldListBox.Clear;
194+ SQLQuery1.SQL.Text := 'show columns from ' + TableComboBox.Text;
195+ SQLQuery1.Open;
196+ while not SQLQuery1.EOF do begin
197+ FieldListBox.Items.Add(SQLQuery1.Fields[0].AsString);
198+ SQLQuery1.Next;
199+ end;
200+ SQLQuery1.Close;
201+end;
202+```
187203
188204結果セットには、フィールドの名前と同じように、フィールドの型情報、キーになっているかどうか、nullが許されるか、など、色んな情報が含まれています。
189205
190206#### データを表示する
191207
192208データベースに接続するために、コンポーネントを使うという方針と同様に、データを表示するためにも、いくつかのコンポーネントを使ってみましょう。
193209
194210ユーザーからの要求に応じてデータを表示するグリッドのために、2番目のフォームを使います。 このフォームは、ユーザーが"Command"エディットボックスにSQLコマンドを入力し、"Open Query"ボタンを押した後で表示されるようにします。
195211
196212これはそのOnClickイベントです。
197213
198-`procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);`\
199-`begin`\
200-`  ShowQueryForm := TShowQueryForm.Create(self);`\
201-`  ShowQueryForm.Datasource1.DataSet := SQLQuery1;`\
202-`  SQLQuery1.SQL.Text := CommandEdit.Text;`\
203-`  SQLQuery1.Open;`\
204-`  ShowQueryForm.ShowModal;`\
205-`  ShowQueryForm.Free;`\
206-`  SQLQuery1.Close;`\
207-`end;`
214+``` pascal
215+procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
216+begin
217+ ShowQueryForm := TShowQueryForm.Create(self);
218+ ShowQueryForm.Datasource1.DataSet := SQLQuery1;
219+ SQLQuery1.SQL.Text := CommandEdit.Text;
220+ SQLQuery1.Open;
221+ ShowQueryForm.ShowModal;
222+ ShowQueryForm.Free;
223+ SQLQuery1.Close;
224+end;
225+```
208226
209227ShowQueryFormは、次のようにします。
210228
211229![](/wiki-images/4/47/Mysqlshow.png)
212230
213231下記のようにコントロールを配置します。
214232
215233| | | |
216234|-------------|------------|-------------|
217235| TPanel | Align | alBottom |
218236| TDataSource | | |
219237| TDBGrid | Align | alClient |
220238| | DataSource | DataSource1 |
221239| TButton | Caption | Close |
222240
223241ボタンはパネルの上に配置してください。"Open Query"のOnClickで起きることは次の通りです。 まず最初に、TShowQueryFormのインスタンスを生成します。次に、DataSourceのDatasetのプロパティに、SQLQuery1を設定します。それから、SQLQueryにユーザが"Command"エディットボックスで入力したSQLコマンドを設定し、オープンします。そして、ShowQueryFromをモーダル表示させ、クローズされるまでは、フォーカスを維持するようにします。
224242
225243このフォームがクローズされたら、Freeして、SQLQuery1を再びクローズします。
226244
227245## ソースコード
228246
229247The sources for this project can be downloaded [here](http://prdownloads.sourceforge.net/lazarus-ccr/mysql_demo_20050408.tar.gz?download) For more demo projects see [sourceforge](http://sourceforge.net/project/showfiles.php?group_id=92177&package_id=148359)
230248
231249---
232250*From the Free Pascal wiki, page "MySQLDatabases/ja", as it stood on 2009-04-06 after a change by Swen, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history