Sign in Join
Wiki copytemporary

MySQLDatabases/ja: what changed

Revision 1 to 2. 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
8585`try ... finally`
8686
8787あるいは、
8888
8989`try ... except`
9090
9191の構文に入れるようにしてください。
9292
9393#### サーバーに接続する
9494
9595最初にやることは、サーバーに接続することです。接続する時に、サーバーのどのデータベースが利用可能かどうか知らなければ、実行時の接続するときにデータベースのリストから尋ねるようにできます。 しかしながら、今回は1つを選択し、MySQLConnectionのプロパティの、有効なDatabaseNameを開いて接続するようにしてください。コードの中に、私が使っている"mysql"データベースがあります。 このデータベースはmysqlによって内部的に使われるもので、常に存在します。
9696
9797`procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);`\
9898`begin`\
9999`  // Check if we have an active connection. If so, let's close it.`\
100100`  if MySQLConnection1.Connected then CloseConnection(Sender);`\
101101`  // Set the connection parameters.`\
102102`  MySQLConnection1.HostName := HostEdit.Text;`\
103103`  MySQLConnection1.UserName := UserEdit.Text;`\
104104`  MySQLConnection1.Password := PasswdEdit.Text;`\
105105`  MySQLConnection1.DatabaseName := 'mysql'; // MySQL is allways there!`\
106106`  ShowString('Opening a connection to server: ' + HostEdit.Text);`\
107107`  MySQLConnection1.Open;`\
108108`  // First lets get a list of available databases.`\
109109`  if MySQLConnection1.Connected then begin`\
110110`    ShowString('Connected to server: ' + HostEdit.Text);`\
111111`    ShowString('Retrieving list of available databases.');`\
112112`    SQLQuery1.SQL.Text := 'show databases';`\
113113`    SQLQuery1.Open;`\
114114`    while not SQLQuery1.EOF do begin`\
115115`      DatabaseComboBox.Items.Add(SQLQuery1.Fields[0].AsString);`\
116116`      SQLQuery1.Next;`\
117117`    end;`\
118118`    SQLQuery1.Close;`\
119119`    ShowString('List of databases received!');`\
120120`  end;`\
121121`end;`
122122
123123まず、最初にチェックすることは、サーバーに接続しているかどうか、そして、プライベートメソッドのCloseConnectionを呼んでいるか、ということです。このメソッドで、いくつかの内部的な処理がおこなわれ、終了します。ボタンをdisableにしたり、チェックボックスやリストボックスをクリアしたりします。 そして、サーバに接続するために必要なパラメータをセットします。
124124
125125
126126*プログラムでは、ShowStringをコールしていることに気が付くでしょう。これは、memoにログのように、文を追加していきます。*
127127
128128パラメータをセットすれば、サーバーに接続できます。これは、次の文をコールすることで実行されます。
129129
130130`MySQLConnection1.Open;`
131131
132132行儀の良いアプリケーションでは、これを例外処理構造にいれて、接続が失敗した場合に、わかりやすいメッセージでユーザーに伝えるべきです。
133133
134134接続がおこなわれれば、サーバーからデータベースのリストを取得します。サーバーからデータを取得するには、TSQLQueryを使います。SQLプロパティに、SQL文を入れ、サーバーに送ります。MySQLサーバーは、"SHOW DATABASES"コマンドが、データベースのリストを取得するコマンドである、ということを理解します。SQL文をセットしたら、次のようにコールします。
135135
136136`SQLQuery1.Open;`
137137
138138SQLQueryの結果セットは、fieldsプロパティを使って調べることができます。 レコードをイテレーションするために、次のようにコールします。
139139
140140`SQLQuery1.Next;`
141141
142142すべての利用できるデータベースをコンボボックスに追加したら、SQLQueryを再びクローズしてください。
143143
144144#### データベースを選択する
145145
146146ユーザがDatabaseComboBoxからデータベースを選択したときに、"Select Database"ボタンを有効にします。そのボタンのOnClickイベントで、MySQLConnection1のDatabaseNameをセットして、テーブルのリストを要求します。このプロシージャの最後の命令で、"Open Query"ボタンを有効にして、ユーザーが"Command"エディットボックスでクエリを入力でき、サーバに送信できるようにします。
147147
148148`procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);`\
149149`begin`\
150150`  // A database has been selected so lets get the tables in it.`\
151151`  CloseConnection(Sender);`\
152152`  if DatabaseComboBox.ItemIndex <> -1 then begin`\
153153`    with DatabaseComboBox do`\
154154`      MySQLConnection1.DatabaseName := Items[ItemIndex];`\
155155`    ShowString('Retreiving list of tables');`\
156156`    SQLQuery1.SQL.Text := 'show tables';`\
157157`    SQLQuery1.Open;`\
158158`    while not SQLQuery1.EOF do begin`\
159159`      TableComboBox.Items.Add(SQLQuery1.Fields[0].AsString);`\
160160`      SQLQuery1.Next;`\
161161`    end;`\
162162`    SQLQuery1.Close;`\
163163`    ShowString('List of tables received');`\
164164`  end;`\
165165`  OpenQueryButton.Enabled := True;`\
166166`end;`
167167
168168MySQLはデータベースのリストを取得する場合と比較して、テーブルのリストを取得するための特別のコマンド"show tables"を持っています。このクエリの結果もデータベースリストと同じように、すべてのテーブルをTableComboBoxに追加していきます。
169169
170170どうしてこのクエリをオープンする前に、コネクションを再度オープンしなかったのか、疑問に思うかもしれません。 これは、自動的にSQLQueryが有効になったときに、必要に応じて内部的におこなわれるので、必ずしも必要ではありません。
171171
172172#### テーブル内のフィールド
173173
174174MySQLにおいて、テーブルと同様に、テーブルのフィールドを取得する場合にも、"SHOW"を使って、"SHOW COLUMNS FROM \<tablename\>"とすることでできます。ユーザーがテーブルをTableComboBoxから選択すると、そのComboBoxのOnChangedEventがトリガーとなって、FieldListboxへフィールドの名前を入れます。
175175
176176`procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);`\
177177`begin`\
178178`  FieldListBox.Clear;`\
179179`  SQLQuery1.SQL.Text := 'show columns from ' + TableComboBox.Text;`\
180180`  SQLQuery1.Open;`\
181181`  while not SQLQuery1.EOF do begin`\
182182`    FieldListBox.Items.Add(SQLQuery1.Fields[0].AsString);`\
183183`    SQLQuery1.Next;`\
184184`  end;`\
185185`  SQLQuery1.Close;`\
186186`end;`
187187
188188結果セットには、フィールドの名前と同じように、フィールドの型情報、キーになっているかどうか、nullが許されるか、など、色んな情報が含まれています。
189189
190190#### データを表示する
191191
192192データベースに接続するために、コンポーネントを使うという方針と同様に、データを表示するためにも、いくつかのコンポーネントを使ってみましょう。
193193
194194ユーザーからの要求に応じてデータを表示するグリッドのために、2番目のフォームを使います。 このフォームは、ユーザーが"Command"エディットボックスにSQLコマンドを入力し、"Open Query"ボタンを押した後で表示されるようにします。
195195
196196これはそのOnClickイベントです。
197197
198198`procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);`\
199199`begin`\
200200`  ShowQueryForm := TShowQueryForm.Create(self);`\
201201`  ShowQueryForm.Datasource1.DataSet := SQLQuery1;`\
202202`  SQLQuery1.SQL.Text := CommandEdit.Text;`\
203203`  SQLQuery1.Open;`\
204204`  ShowQueryForm.ShowModal;`\
205205`  ShowQueryForm.Free;`\
206206`  SQLQuery1.Close;`\
207207`end;`
208208
209209ShowQueryFormは、次のようにします。
210210
211-<center>
212-
213-<figure>
214-<img src="Mysqlshow.png" title="Mysqlshow.png" />
215-<figcaption>Mysqlshow.png</figcaption>
216-</figure>
217-
218-</center>
211+![](/wiki-images/4/47/Mysqlshow.png)
219212
220213下記のようにコントロールを配置します。
221214
222215| | | |
223216|-------------|------------|-------------|
224217| TPanel | Align | alBottom |
225218| TDataSource | | |
226219| TDBGrid | Align | alClient |
227220| | DataSource | DataSource1 |
228221| TButton | Caption | Close |
229222
230223ボタンはパネルの上に配置してください。"Open Query"のOnClickで起きることは次の通りです。 まず最初に、TShowQueryFormのインスタンスを生成します。次に、DataSourceのDatasetのプロパティに、SQLQuery1を設定します。それから、SQLQueryにユーザが"Command"エディットボックスで入力したSQLコマンドを設定し、オープンします。そして、ShowQueryFromをモーダル表示させ、クローズされるまでは、フォーカスを維持するようにします。
231224
232225このフォームがクローズされたら、Freeして、SQLQuery1を再びクローズします。
233226
234227## ソースコード
235228
236229The 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)
237230
238231---
239232*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