Sign in Join
Wiki copytemporary

MySQLDatabases/ja: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: MySQLDatabases/ja

OldNewLine
1+**Work in progress**
2+
3+## はじめに
4+
5+In the [[Lazarus Database Tutorial|Database tutorialのページで]]、MySQLサーバーへの最初の接続を試してみる実例があります。 そのときには、ビジュアル、ノンビジュアルの、どんなコンポーネントも使いませんでした。このページでは、(多分)もっと簡単な方法で、MySQLサーバーに接続する方法を紹介します。
6+
7+## 利用するコンポーネント
8+
9+### SQLdb Components
10+
11+\$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)
12+
13+もし、\$Lazarus/components/sqldb/mysql ディレクトリや、 mysql4connlaz.lpkを見つけられない場合、mysql4connlaz.lpkがsqldblaz.lpkにマージされた新しいバージョンを使っている事を意味しています。 もしそうだったら、sqldblaz.lpkをインストールすれば、すべてのコンポーネントをLazarusのIDEのツールバーの中に手に入れることができます。
14+
15+もし、どうやってコンポーネントやパッケージをインストールするか分からなかったら、[[Install Packages/ja|インストールの方法の解説を]]呼んでください。 SQLdbコンポーネントはより一般的で、他のデータベースにも接続できるので、たとえば、TMySQLConnectionをTIBConnectionへ置き換えることも可能です。ですから、(より一般的な)SQLdbコンポーネントでプログラムを開発するようにしましょう。
16+
17+## 利用したコンポーネントの説明
18+
19+### TMySQLConnection
20+
21+TMySQLConnectionは、データベースサーバーに接続するパラメータを保存するのに使われます。 接続するのに使われる、接続するホスト、ユーザーID,パスワードをセットします。 TMySQLConnectionのほかのプロパティは、使いたい時に必要に応じて使います。
22+
23+'LoginPrompt'プロパティは、まだ機能しないので、接続を開始するために必要なHostNameとDatabaseName、UserName、Passwordプロパティは必ず設定してください。
24+
25+TSQLTransactionを使う場合、MySQLConnectionと同様に、Transactionプロパティを設定してください。さもないと、SQLQueryをオープンすることができません。
26+
27+ノート:最新のLazarusのSVN版では、MySQLConnectionコンポーネントに3つのバージョンがあります。 それらは、TMySQL40Connection, TMySQL41Connection and TMySQL50Connectionです。
28+
29+サーバーにあっている正しいものを使うようにしてください。もし、MySQL 4.1を使っているなら、TMySQL41Connectionを使ってください。
30+
31+### TSQLTransaction
32+
33+SQLTransactionは、内部的な仕事に使われます。SQLTransactionは、あなたがデータセットをオープンするときには、自動的にactivateされます。接続を閉じるときには、関連のあるトランザクションもdeactivateされ、SQLTransactionをつかっているデータセットもcloseされます。
34+
35+### TSQLQuery
36+
37+TSQLQueryはSQL文を実行するときに使用されます。SQLにSELECT文を設定し、Openメソッドをコールすることで、データを受け取ることができます。または、INSERT,DELETE,UPDATE文で、データを操作することができます。この場合は、Openメソッドではなく、ExecSQLメソッドを使います。
38+
39+### TDataSource
40+
41+データソースは、DBEditやDBGridといった目に見える「データを表示し操作するコンポーネント(=data aware components)」と、データセットの間の接続を提供します。データソースは、data aware componentに表示するためのデータを提供する役割があります。
42+
43+データソースは、1度に1つのデータセットに接続されるべきです。しかし、いくつかのdata awareコンポーネントに接続されることがあります。
44+
45+### TDBGrid
46+
47+DBグリッドはデータセットのデータを表示するのに使われます。DBGridはデータセットに接続するために、データソースを必要とします。データセットがOpenされると、DBグリッドは自動的にデータを表示します。
48+
49+## 私達のプログラム
50+
51+### 私達がベースとするもの
52+
53+私達は、[[Lazarus Database Tutorial|ここで]]作られたものをベースにしたプログラムをつくるようにしましょう。 これは、[[Lazarus Database Tutorial|オリジナル (in English)]] Chrisによるものをベースにしています。
54+
55+### メインフォーム
56+
57+私たちは、同じメイン画面を使用し、最初から、すべての機能性を築き上げます。 コンポーネントが本当にすべての面倒なことを取り去ってくれますが、これから、気をつけるべきいろいろな事があります。
58+
59+それでは、次のような画面を作るところから始めてみましょう。\
60+![](/wiki-images/2/28/Trymysql.png)\
61+SQLdbタブから、TMySQLConnection、TSQLTransaction,TSQLQuery ![](/wiki-images/6/6d/Components.png)をフォームの上におきます。Connectionコンポーネント以外は、これらのコンポーネントにつけられたデフォルトの名前を変更しないでください。 すべてのバージョンのMySQLに対応するために、MySQL??Connectionには、MySQLConnection1という名前をつけてください。そして、これらのコンポーネントが連携して動作するために、リンクする必要がありますので、次のようにプロパティをセットしてください。
62+
63+| | | |
64+|--------------------|----------------|------------------|
65+| **コンポーネント** | **プロパティ** | **値** |
66+| MySQLConnection1 | Transaction | SQLTransaction1 |
67+| SQLTransaction1 | Database | MySQLConnection1 |
68+| SQLQuery1 | Database | MySQLConnection1 |
69+| SQLQuery1 | Transaction | SQLTransaction1 |
70+
71+SQLQuery1のトランザクションのプロパティは、最初にMySQLConnection1のトランザクションプロパティをセットしたときに、自動的に設定されます。
72+
73+これを設定したら、SQLTransaction1.Databaseに、MySQLConnection1が設定されていることに注意してください。
74+
75+前にも言いましたが、MySQLサーバーのバージョンにあった正しい接続コンポーネントを使っていることを確認してください。
76+
77+### プログラムコード
78+
79+スクリーン画像を見てください。プログラムの開始時に有効なボタンは、"Connect to Server"と"Exit"だけです。 その他のボタンが機能するためには、まだ充分な情報がないので、無効になっています。 "Connect to Server"ボタンも、接続先ホスト、ユーザー名、パスワードが与えられるまでは無効にしておく、ということもできますが、この場合、ユーザーは何もすることが無いから、"Exit"を押すしかないな、と考えてしまうでしょう。
80+
81+まずコードを示す前に、コードには、例外を扱うコードを入れるべきであることを強調したいと思います。
82+
83+クリティカルなセクションは、
84+
85+`try ... finally`
86+
87+あるいは、
88+
89+`try ... except`
90+
91+の構文に入れるようにしてください。
92+
93+#### サーバーに接続する
94+
95+最初にやることは、サーバーに接続することです。接続する時に、サーバーのどのデータベースが利用可能かどうか知らなければ、実行時の接続するときにデータベースのリストから尋ねるようにできます。 しかしながら、今回は1つを選択し、MySQLConnectionのプロパティの、有効なDatabaseNameを開いて接続するようにしてください。コードの中に、私が使っている"mysql"データベースがあります。 このデータベースはmysqlによって内部的に使われるもので、常に存在します。
96+
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;`
122+
123+まず、最初にチェックすることは、サーバーに接続しているかどうか、そして、プライベートメソッドのCloseConnectionを呼んでいるか、ということです。このメソッドで、いくつかの内部的な処理がおこなわれ、終了します。ボタンをdisableにしたり、チェックボックスやリストボックスをクリアしたりします。 そして、サーバに接続するために必要なパラメータをセットします。
124+
125+
126+*プログラムでは、ShowStringをコールしていることに気が付くでしょう。これは、memoにログのように、文を追加していきます。*
127+
128+パラメータをセットすれば、サーバーに接続できます。これは、次の文をコールすることで実行されます。
129+
130+`MySQLConnection1.Open;`
131+
132+行儀の良いアプリケーションでは、これを例外処理構造にいれて、接続が失敗した場合に、わかりやすいメッセージでユーザーに伝えるべきです。
133+
134+接続がおこなわれれば、サーバーからデータベースのリストを取得します。サーバーからデータを取得するには、TSQLQueryを使います。SQLプロパティに、SQL文を入れ、サーバーに送ります。MySQLサーバーは、"SHOW DATABASES"コマンドが、データベースのリストを取得するコマンドである、ということを理解します。SQL文をセットしたら、次のようにコールします。
135+
136+`SQLQuery1.Open;`
137+
138+SQLQueryの結果セットは、fieldsプロパティを使って調べることができます。 レコードをイテレーションするために、次のようにコールします。
139+
140+`SQLQuery1.Next;`
141+
142+すべての利用できるデータベースをコンボボックスに追加したら、SQLQueryを再びクローズしてください。
143+
144+#### データベースを選択する
145+
146+ユーザがDatabaseComboBoxからデータベースを選択したときに、"Select Database"ボタンを有効にします。そのボタンのOnClickイベントで、MySQLConnection1のDatabaseNameをセットして、テーブルのリストを要求します。このプロシージャの最後の命令で、"Open Query"ボタンを有効にして、ユーザーが"Command"エディットボックスでクエリを入力でき、サーバに送信できるようにします。
147+
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;`
167+
168+MySQLはデータベースのリストを取得する場合と比較して、テーブルのリストを取得するための特別のコマンド"show tables"を持っています。このクエリの結果もデータベースリストと同じように、すべてのテーブルをTableComboBoxに追加していきます。
169+
170+どうしてこのクエリをオープンする前に、コネクションを再度オープンしなかったのか、疑問に思うかもしれません。 これは、自動的にSQLQueryが有効になったときに、必要に応じて内部的におこなわれるので、必ずしも必要ではありません。
171+
172+#### テーブル内のフィールド
173+
174+MySQLにおいて、テーブルと同様に、テーブルのフィールドを取得する場合にも、"SHOW"を使って、"SHOW COLUMNS FROM \<tablename\>"とすることでできます。ユーザーがテーブルをTableComboBoxから選択すると、そのComboBoxのOnChangedEventがトリガーとなって、FieldListboxへフィールドの名前を入れます。
175+
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;`
187+
188+結果セットには、フィールドの名前と同じように、フィールドの型情報、キーになっているかどうか、nullが許されるか、など、色んな情報が含まれています。
189+
190+#### データを表示する
191+
192+データベースに接続するために、コンポーネントを使うという方針と同様に、データを表示するためにも、いくつかのコンポーネントを使ってみましょう。
193+
194+ユーザーからの要求に応じてデータを表示するグリッドのために、2番目のフォームを使います。 このフォームは、ユーザーが"Command"エディットボックスにSQLコマンドを入力し、"Open Query"ボタンを押した後で表示されるようにします。
195+
196+これはそのOnClickイベントです。
197+
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;`
208+
209+ShowQueryFormは、次のようにします。
210+
211+<center>
212+
213+<figure>
214+<img src="Mysqlshow.png" title="Mysqlshow.png" />
215+<figcaption>Mysqlshow.png</figcaption>
216+</figure>
217+
218+</center>
219+
220+下記のようにコントロールを配置します。
221+
222+| | | |
223+|-------------|------------|-------------|
224+| TPanel | Align | alBottom |
225+| TDataSource | | |
226+| TDBGrid | Align | alClient |
227+| | DataSource | DataSource1 |
228+| TButton | Caption | Close |
229+
230+ボタンはパネルの上に配置してください。"Open Query"のOnClickで起きることは次の通りです。 まず最初に、TShowQueryFormのインスタンスを生成します。次に、DataSourceのDatasetのプロパティに、SQLQuery1を設定します。それから、SQLQueryにユーザが"Command"エディットボックスで入力したSQLコマンドを設定し、オープンします。そして、ShowQueryFromをモーダル表示させ、クローズされるまでは、フォーカスを維持するようにします。
231+
232+このフォームがクローズされたら、Freeして、SQLQuery1を再びクローズします。
233+
234+## ソースコード
235+
236+The 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)
237+
238+---
239+*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