MySQLDatabases/ja: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: MySQLDatabases/ja
| Old | New | Line | |
|---|---|---|---|
| 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 | + | \ | |
| 61 | + | SQLdbタブから、TMySQLConnection、TSQLTransaction,TSQLQuery をフォームの上におきます。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).* |
