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