Lazarus Database Tutorial/ja: what changed
Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | 1 | ## 概要 | |
| 2 | 2 | ||
| 3 | 3 | このチュートリアルは、Lazarusでいろいろなデータベースの操作を行うためのものです。 Lazarusでは、いくつかのデータベースを外部的にサポートしています。しかし、それぞれのデータベースにたいして開発者は適切なパッケージをインストールしなくてはなりません。 データベースには、コードを書いたり、フォーム上のコンポーネントをドロップしてアクセスすることができます。データアウェアコンポーネントは、DataSourceプロパティをTDatasetに設定することで、接続し、フィールドに対応して表示することができます。データソースはあるテーブルをあらわし、データベースコンポーネント(たとえば、TPSQLDatabase, TSQLiteDataSet)へDataSetプロパティをとおして接続されます。 データアウェアコンポーネントは、IDE上の"Data Controls"タブ上にあり、データソースとデータベースのコントロールは"Data Access"タブ上にあります。 | |
| 4 | 4 | ||
| 5 | 5 | ## Lazarus と MySQL | |
| 6 | 6 | ||
| 7 | 7 | ### MySQLをLinuxやWindowsで動作させる | |
| 8 | 8 | ||
| 9 | 9 | MySQL User Manualの指示に従って進めてください。インストール後、mysqldデーモンが動作していることを確認してください。また、セキュリティを保ちうる範囲で、すべての必要なホスト('localhost',ホスト名,ネットワーク上の他のホスト名)から、すべての必要なユーザー(ルート、mysql、あなた自身、他に必要なユーザーを含む)に、必要な権限が与えられているか、確認してください。 | |
| 10 | 10 | ||
| 11 | 11 | ルートを含むすべてのユーザがパスワードを持っているのが、望ましいです。 マニュアルにある例でデータベース・システムの機能をテストしてください。そして、本当にすべてのユーザが信頼できるアクセスができるかチェックしてください。 | |
| 12 | 12 | ||
| 13 | 13 | (訳注:データベースに接続できない場合、プログラムのプロパティの設定が悪い場合もありますが、そもそも、プログラムの前に、インストール、PCの設定、ユーザー、それぞれの権限の設定がきちんとできているか、データベースのサンプルなどであらかじめ確認しておくことが必要です。) | |
| 14 | 14 | ||
| 15 | 15 | ### MySQLをFPCのテキストモードで動かしてみよう | |
| 16 | 16 | ||
| 17 | 17 | 例となるフォルダが\$(fpcsrcdir)/packages/base/mysql/にあります。 LazarusのIDEで、menu -\> Environment Options -\> Paths tab -\> FPC source directoryにFPCのソースディレクトリがあります。MySQLが置いてある可能性のあるディレクトリは、rpmによるインストールだと、/usr/share/fpcsrc/packages/base/mysql/ Windowsでは C:\lazarus\fpcsrc\packages\base\mysql\です。 | |
| 18 | 18 | ||
| 19 | 19 | このディレクトリには、mysql.pp, mysql_com.pp そして mysql_version.ppがあります。 テストスクリプトを実行する前に、testdbというデータベースを生成する必要があります。 これをおこなうには、MySQL monitorにrootとして、全権限をもってログインして、次のステートメントを発行します。 | |
| 20 | 20 | ||
| 21 | 21 | ``` sql | |
| 22 | 22 | CREATE DATABASE testdb; | |
| 23 | 23 | ``` | |
| 24 | 24 | ||
| 25 | 25 | それから、すべて関連しているユーザが適切なアクセス権を持っていることを確認してください。 | |
| 26 | 26 | ||
| 27 | 27 | ``` sql | |
| 28 | 28 | GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword'; | |
| 29 | 29 | ``` | |
| 30 | 30 | ||
| 31 | 31 | ここに、いま実行すべきであるmkdbと呼ばれるスクリプトがあります。 | |
| 32 | 32 | ||
| 33 | - | ||
| 33 | + | ```text | |
| 34 | + | sh ./mkdb | |
| 35 | + | ``` | |
| 34 | 36 | ||
| 35 | 37 | システムが、匿名のユーザにデータベースへのアクセスを許可していないとき、これはたぶん失敗するでしょう。 その場合は、エディタをつかって、MySQLがその行を呼び出すように、スクリプトを変更してください。 | |
| 36 | 38 | ||
| 37 | - | ||
| 39 | + | ```text | |
| 40 | + | mysql -u root -p ${1-testdb} << EOF >/dev/null | |
| 41 | + | ``` | |
| 38 | 42 | ||
| 39 | 43 | そして、再度mkdbを走らせてみます。プロンプトが出たら、パスワードを入力してください。 | |
| 40 | 44 | ||
| 41 | 45 | 幸運にも、あなたは何とかテストデータベースを作成したに違いありません。MySQL monitorにログインしている間、 MySQLステートメントを発行して、テストしてください。 | |
| 42 | 46 | ||
| 43 | 47 | ``` sql | |
| 44 | 48 | select * from FPdev; | |
| 45 | 49 | ``` | |
| 46 | 50 | ||
| 47 | 51 | そうすると、FPC開発者のID,ユーザー名、電子メールアドレスが表記されているテーブルを見ることができるでしょう。 | |
| 48 | 52 | ||
| 49 | 53 | 今度は、testdb.ppというプログラムを実行させてみてください。 (これは、コンパイルしてください。ほとんど最初は失敗するでしょうけど) 私はこのプログラムはいくつかの理由でmysqlに接続できないことを発見しました。 | |
| 50 | 54 | ||
| 51 | 55 | - 私の環境(SuSE Linux v9.0)で mysql v4.0.15をインストールしました。パッケージが設計されたバージョン3ではありません。 | |
| 52 | 56 | ||
| 53 | 57 | - プログラムはデータベースにアクセスするためにユーザー名、パスワードが必要です。 | |
| 54 | 58 | ||
| 55 | 59 | - コンパイラに、どこにmysqlのライブラリを探せばいいか知らせる必要があります。(もしMySQLの開発ライブラリをインストールしていなければ、今インストールしましょう。) | |
| 56 | 60 | ||
| 57 | 61 | 私はオリジナルを修正したくなかったのでtestdb.ppからtrydb.ppと名づけてコピーを作成しました。オリジナルファイルはCVSを使ったアップデートで修正されてしまうからです。 | |
| 58 | 62 | ||
| 59 | 63 | 私はさらに、mysql/ver40/というサブディレクトリの中のファイル群を、 メインのmysql/サブディレクトリに、それぞれのファイルの名前が規則性をたもつように、mysql_v4.pp, mysql_com_v4.pp,mysql_version_v4.ppと名前をかえてコピーしました。 | |
| 60 | 64 | ||
| 61 | 65 | 私はtrydb.ppのusesを次のように変更しました。 | |
| 62 | 66 | ||
| 63 | 67 | ``` pascal | |
| 64 | 68 | uses mysql_v4 | |
| 65 | 69 | ``` | |
| 66 | 70 | ||
| 67 | 71 | そして、mysql_v4.ppのusesも次のように変更しました。 | |
| 68 | 72 | ||
| 69 | 73 | ``` pascal | |
| 70 | 74 | uses mysql_com_v4 | |
| 71 | 75 | ``` | |
| 72 | 76 | ||
| 73 | 77 | /etc/fpc.cfgに、自分のライブラリを指すように次の行を加えました。 | |
| 74 | 78 | ||
| 75 | - | ||
| 79 | + | ```text | |
| 80 | + | -Fl/lib;/usr/lib | |
| 81 | + | ``` | |
| 76 | 82 | ||
| 77 | 83 | 次のステップは、devel-librariesがあなたのためにリンクとしてインストールされている場合、必要ないかもしれませんが、チェックして損はありません。 | |
| 78 | 84 | ||
| 79 | 85 | 私は/usr/libディレクトリのmysqlclintライブラリの本当の名前を調べる必要がありました。そして、私の場合、シェルコマンドを発行しました。 | |
| 80 | 86 | ||
| 81 | - | ||
| 87 | + | ```text | |
| 88 | + | ln -s libmysqlclient.so.12.0.0 lmysqlclient | |
| 89 | + | ``` | |
| 82 | 90 | ||
| 83 | 91 | FPCがライブラリを見つけられるよう、シンボリックリンクを生成するために、です。 また、私は次のようなリンクを作成しました。 | |
| 84 | 92 | ||
| 85 | - | ||
| 93 | + | ```text | |
| 94 | + | ln -s libmysqlclient.so.12.0.0 mysqlclient | |
| 95 | + | ``` | |
| 86 | 96 | ||
| 87 | 97 | そして、同じように色々なほかのディレクトリのリンクを設置しました。 厳密には、必要ではないのですが、このケースではそうしました。 | |
| 88 | 98 | ||
| 89 | 99 | 他のユーザーでは、次のようなリンクが必要かもしれません。 | |
| 90 | 100 | ||
| 91 | - | ||
| 101 | + | ```text | |
| 102 | + | ln -s libmysqlclient.so.12.0.0 libmysqlclient.so | |
| 103 | + | ``` | |
| 92 | 104 | ||
| 93 | 105 | 私はtrydb.ppをユーザーの詳細を含むように修正しました。最初にhost,user,passwordを定数としてもつように。 | |
| 94 | 106 | ||
| 95 | 107 | ``` pascal | |
| 96 | 108 | const | |
| 97 | 109 | host : Pchar= 'localhost'; | |
| 98 | 110 | user : Pchar= 'myusername'; | |
| 99 | 111 | passwd: Pchar = 'mypassword'; | |
| 100 | 112 | ``` | |
| 101 | 113 | ||
| 102 | 114 | それでも私は、mysql_connect()をコールしても、まだmysqlに接続できないでいました。しかし、より多くのパラメータを必要とするmysql_real_connect()を使うべきだったのです。さらに物事を複雑にしていたのは、多くのパラメータがversion3(パラメータは7個)とversion4(パラメータは8個)の間で変わっているように思えました。 | |
| 103 | 115 | ||
| 104 | 116 | また、mysql_real_connectを使う前に、mysql_init()を使う必要がありました。 これは、オリジナルのmysql.ppにはありませんでしたが、mysql_v4.ppにはあります。 | |
| 105 | 117 | ||
| 106 | 118 | ここまでで、接続するためのコードは次のようになりました。 | |
| 107 | 119 | ||
| 108 | 120 | ``` pascal | |
| 109 | 121 | { いくつかの追加の変数 } | |
| 110 | 122 | var | |
| 111 | 123 | alloc : PMYSQL; | |
| 112 | 124 | ||
| 113 | 125 | {メインプログラム断片} | |
| 114 | 126 | ||
| 115 | 127 | begin | |
| 116 | 128 | if paramcount=1 then | |
| 117 | 129 | begin | |
| 118 | 130 | Dummy:=Paramstr(1)+#0; | |
| 119 | 131 | DataBase:=@Dummy[1]; | |
| 120 | 132 | end; | |
| 121 | 133 | ||
| 122 | 134 | Writeln ('Allocating Space...'); | |
| 123 | 135 | alloc := mysql_init(PMYSQL(@qmysql)); | |
| 124 | 136 | Write ('Connecting to MySQL...'); | |
| 125 | 137 | sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0); | |
| 126 | 138 | if sock=Nil then | |
| 127 | 139 | begin | |
| 128 | 140 | Writeln (stderr,'Couldn''t connect to MySQL.'); | |
| 129 | 141 | Writeln (stderr, 'Error was: ', mysql_error(@qmysql)); | |
| 130 | 142 | halt(1); | |
| 131 | 143 | end; | |
| 132 | 144 | Writeln ('Done.'); | |
| 133 | 145 | Writeln ('Connection data:'); | |
| 134 | 146 | {$ifdef Unix} | |
| 135 | 147 | writeln ('Mysql_port : ',mysql_port); | |
| 136 | 148 | writeln ('Mysql_unix_port : ',mysql_unix_port); | |
| 137 | 149 | {$endif} | |
| 138 | 150 | writeln ('Host info : ',mysql_get_host_info(sock)); | |
| 139 | 151 | writeln ('Server info : ',mysql_stat(sock)); | |
| 140 | 152 | writeln ('Client info : ',mysql_get_client_info); | |
| 141 | 153 | ||
| 142 | 154 | Writeln ('Selecting Database ',DataBase,'...'); | |
| 143 | 155 | if mysql_select_db(sock,DataBase) < 0 then | |
| 144 | 156 | begin | |
| 145 | 157 | Writeln (stderr,'Couldn''t select database ',Database); | |
| 146 | 158 | Writeln (stderr,mysql_error(sock)); | |
| 147 | 159 | halt (1); | |
| 148 | 160 | end; | |
| 149 | 161 | { ... testdb.ppの本来のコードとして } | |
| 150 | 162 | ``` | |
| 151 | 163 | ||
| 152 | 164 | それでは、tyrdb.ppのコンパイルを開始する準備はいいですか? | |
| 153 | 165 | ||
| 154 | - | ||
| 166 | + | ```text | |
| 167 | + | fpc trydb | |
| 168 | + | ``` | |
| 155 | 169 | ||
| 156 | 170 | 成功しました!それでは実行してみましょう。 | |
| 157 | 171 | ||
| 158 | - | ||
| 172 | + | ```text | |
| 173 | + | ./trydb | |
| 174 | + | ``` | |
| 159 | 175 | ||
| 160 | 176 | おっ!FPC開発者のリストの一覧を得ることができました! | |
| 161 | 177 | ||
| 162 | 178 | いくつかの、さらなる改善点があります。 ユーザーに関する詳細のエントリを作る時、あるいは、MySQLのコマンドを双方向にしたいとき、定数よりは変数の方がいいでしょう。そして、いくつかの発行したいSQLコマンドに、結果を返さないコマンドでも([[Lazarus Database Tutorial/TryDbpp|full program listingを]]見てください)ユーザーの詳細情報をコンソールから入力する部分、プログラムがSQLコマンドがコンソールから入力されるループにはいる部分、結果等について、quitがキーボードから入力されるまで、プリントアウトできるようにしてください。 | |
| 163 | 179 | ||
| 164 | 180 | こちらを見てください。[[Lazarus Database Tutorial/SampleListing|Sample Console Listing]] | |
| 165 | 181 | ||
| 166 | 182 | ### LazarusアプリケーションからMySQLへの接続 | |
| 167 | 183 | ||
| 168 | 184 | このチュートリアルでは、基本的なLazarusコンポーネントのみを使って、LazarusでどのようにMySQLに接続するか、そして簡単なクエリを実行するかを示します。 このとき、Data Aware コンポーネントは使いません。しかし、データベースとインターフェースする原理を解説します。 | |
| 169 | 185 | ||
| 170 | 186 | Lazarusで新しいプロジェクトを生成してください。 | |
| 171 | 187 | ||
| 172 | - | ||
| 188 | + | ```text | |
| 189 | + | Project -> New Project -> Application | |
| 190 | + | ``` | |
| 173 | 191 | ||
| 174 | 192 | 自動的に生成されたフォームが現れます。 フォームをスクリーンの半分くらいになるように大きくして、フォームの名前とキャプションを、'TryMySQL'としてください。 | |
| 175 | 193 | ||
| 176 | 194 | コンポーネントパレットのStandardのタブから、3つのエディットボックスを、フォームの左上のほうへ置いてください。そして、それぞれのエディットボックスの真上にラベルを置いてください。 ラベルのキャプションを'Host'としてHostLabel,エディットをHostEditとしてください。 同様に、'UserName'としてUserLabel,UserEditとしてください。 同様に、'Password'としてPasswdLabel,PasswdEditとしてください。 これらのかわりに、LabeledEditコンポーネントをAdditionalタブから使うことができます。 | |
| 177 | 195 | ||
| 178 | 196 | PasswdEditを選択して、PasswordCharプロパティを見つけて、これを * か、他のキャラクタにしてください。そうすることで、画面にパスワードをキーボードから入力したときに表示されないように、かわりに、*の文字を表示するようにします。 それぞれのエディットボックスのTextプロパティが空白であることを確認してください。 | |
| 179 | 197 | ||
| 180 | 198 | ここでさらに、もうひとつエディットボックスとラベルを、フォームの右上に置いてください。 ラベルのCaptionを、'Enter SQL Command'に、NameをCommadEditにしてください。 | |
| 181 | 199 | ||
| 182 | 200 | 3つのボタンをフォームに置きます。2つは、EditBoxの下の左のほうへ、もう一つは、右のコマンドボックスの下へ置いてください。 | |
| 183 | 201 | ||
| 184 | 202 | 左のボタンは、Caption='Connect to Database'、Name='ConnectButton'、もうひとつは、Caption='Exit'、Name='ExitButton'としてください。右のボタンは Caption='Send Query'、Name='QueryButton'としてください。 | |
| 185 | 203 | ||
| 186 | 204 | 大きなメモをフォームの右下に貼り付けて、使えるだけのスペースを使って配置して、'Result'と表示してName='ResultMemo'としてください。テキストがあふれたときに自動的にスクロールバーがつくように、ScrollBars='ssAutoBoth'にしてください。また、WordWrap='True'としてください。 | |
| 187 | 205 | ||
| 188 | 206 | Commonコントロールタブから、ステータスバーをフォームの下に置き、SimpleText='TryMySQL'としてください。 | |
| 189 | 207 | ||
| 190 | 208 | このフォームのスクリーンショットを置いておきます。:[Mysql Example Screenshot](http://lazarus-ccr.sourceforge.net/kbdata/trymysqldb.png) | |
| 191 | 209 | ||
| 192 | 210 | これで、必要なイベントハンドラを書くことが出来ます。 左にある3つのエディットボックスはホスト名、ユーザ名、パスワードの入力に使います。これらの3つの入力がきちんと終わったら、Connectボタンをクリックします。このボタンのOnClickイベントハンドラは、先ほどのテキストモードのFPCプログラムの一部とほとんど同じです。 | |
| 193 | 211 | ||
| 194 | 212 | データベースからのレスポンスはPascalのwrite文やwriteln文を使って書かれてはいません。しかし、返答はstringsに変換され、Memoに表示されます。Pascalのwriteとwriteln文は沢山の型変換を実行時に行う能力がある一方、Memoを使ってテキストを出力する際に、明確なデータ型変換をstringの正しい形式にすることが必要です。なので、PChar変数はStrPasを使って変換されなければならず、Integer変数はIntToStrを使って変換されなければなりません。 | |
| 195 | 213 | ||
| 196 | 214 | (訳注:Delphiで慣れた方々には当たり前に思えるかもしれませんが、本来、Pascalでの文字列形式出力はwriteやwritelnを使うものであり、それは、実行時に変数の型を明示しなくても、自動的に適切な文字列として表示することができます。) | |
| 197 | 215 | ||
| 198 | 216 | 文字列はMemoに下記のような関数をつかって表示されます。 | |
| 199 | 217 | ||
| 200 | 218 | ``` pascal | |
| 201 | 219 | procedure ShowString (S : string); | |
| 202 | 220 | (* display a string in a Memo box *) | |
| 203 | 221 | begin | |
| 204 | 222 | trymysqlForm1.ResultsMemo.Lines.Add (S) | |
| 205 | 223 | end; | |
| 206 | 224 | ``` | |
| 207 | 225 | ||
| 208 | 226 | Connectボタンのイベントハンドラは次のようにします。 | |
| 209 | 227 | ||
| 210 | 228 | ``` pascal | |
| 211 | 229 | procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject); | |
| 212 | 230 | (* Connect to MySQL using user data from Text entry boxes on Main Form *) | |
| 213 | 231 | var strg: string; | |
| 214 | 232 | ||
| 215 | 233 | begin | |
| 216 | 234 | ||
| 217 | 235 | dummy1 := trymysqlForm1.HostEdit.text+#0; | |
| 218 | 236 | host := @dummy1[1]; | |
| 219 | 237 | dummy2 := trymysqlForm1.UserEdit.text+#0; | |
| 220 | 238 | user := @dummy2[1] ; | |
| 221 | 239 | dummy3 := trymysqlForm1.PasswdEdit.text+#0; | |
| 222 | 240 | passwd := @dummy3[1] ; | |
| 223 | 241 | ||
| 224 | 242 | alloc := mysql_init(PMYSQL(@qmysql)); | |
| 225 | 243 | sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0); | |
| 226 | 244 | if sock=Nil then | |
| 227 | 245 | begin | |
| 228 | 246 | strg :='Couldn''t connect to MySQL.'; showstring (strg); | |
| 229 | 247 | Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg); | |
| 230 | 248 | end | |
| 231 | 249 | else | |
| 232 | 250 | begin | |
| 233 | 251 | trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL'; | |
| 234 | 252 | strg := 'Now choosing database : ' + database; showstring (strg); | |
| 235 | 253 | {$ifdef Unix} | |
| 236 | 254 | strg :='Mysql_port : '+ IntToStr(mysql_port); showstring (strg); | |
| 237 | 255 | strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg); | |
| 238 | 256 | {$endif} | |
| 239 | 257 | Strg :='Host info : ' + StrPas(mysql_get_host_info(sock)); | |
| 240 | 258 | showstring (strg); | |
| 241 | 259 | Strg :='Server info : ' + StrPas(mysql_stat(sock)); showstring (strg); | |
| 242 | 260 | Strg :='Client info : ' + Strpas(mysql_get_client_info); showstring (strg); | |
| 243 | 261 | ||
| 244 | 262 | trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...'; | |
| 245 | 263 | if mysql_select_db(sock,DataBase) < 0 then | |
| 246 | 264 | begin | |
| 247 | 265 | strg :='Couldn''t select database '+ Database; ShowString (strg); | |
| 248 | 266 | Strg := mysql_error(sock); ShowString (strg); | |
| 249 | 267 | end | |
| 250 | 268 | end; | |
| 251 | 269 | end; | |
| 252 | 270 | ``` | |
| 253 | 271 | ||
| 254 | 272 | 右のテキストボックスはSQL文を入力するものです。終了のセミコロンなしで良いです。 きちんとしたSQL文を入力して、SendQueryボタンを押すとクエリが実行され、ResultMemoの中に結果が表示されます。 | |
| 255 | 273 | ||
| 256 | 274 | SendQueryのイベントハンドラもFPCのテキストモードの時とほとんど同じですが、表示の際に明示的な型変換をおこなうことを除いてという点は、先ほどの例と同じです。 | |
| 257 | 275 | ||
| 258 | 276 | テキストモードのFPCプログラムと違う点は、エラーが検出されたときにプログラムは停止せず、MySQLもクローズされないところです。そのかわり、制御がメインフォームに戻り、コマンドが再発行できるように修正する機会が与えられます。 | |
| 259 | 277 | ||
| 260 | 278 | アプリケーションは最終的に、Exitボタンがクリックされたときに、MySQLをクローズして終了します。 SendQueryは次のようになっています。 | |
| 261 | 279 | ||
| 262 | 280 | ``` pascal | |
| 263 | 281 | procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject); | |
| 264 | 282 | var | |
| 265 | 283 | dumquery, strg: string; | |
| 266 | 284 | begin | |
| 267 | 285 | dumquery := TrymysqlForm1.CommandEdit.text; | |
| 268 | 286 | dumquery := dumquery+#0; | |
| 269 | 287 | query := @dumquery[1]; | |
| 270 | 288 | trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...'; | |
| 271 | 289 | strg := 'Executing query : ' + dumQuery; showstring (strg); | |
| 272 | 290 | if (mysql_query(sock,Query) < 0) then | |
| 273 | 291 | begin | |
| 274 | 292 | Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg); | |
| 275 | 293 | end | |
| 276 | 294 | else | |
| 277 | 295 | begin | |
| 278 | 296 | recbuf := mysql_store_result(sock); | |
| 279 | 297 | if RecBuf=Nil then | |
| 280 | 298 | begin | |
| 281 | 299 | Strg :='Query returned nil result.'; showstring (strg); | |
| 282 | 300 | end | |
| 283 | 301 | else | |
| 284 | 302 | begin | |
| 285 | 303 | strg :='Number of records returned : ' + IntToStr(mysql_num_rows (recbuf)); | |
| 286 | 304 | Showstring (strg); | |
| 287 | 305 | Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf)); | |
| 288 | 306 | showstring (strg); | |
| 289 | 307 | rowbuf := mysql_fetch_row(recbuf); | |
| 290 | 308 | while (rowbuf <>nil) do | |
| 291 | 309 | begin | |
| 292 | 310 | Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' + | |
| 293 | 311 | rowbuf[2] +')'; | |
| 294 | 312 | showstring (strg); | |
| 295 | 313 | rowbuf := mysql_fetch_row(recbuf); | |
| 296 | 314 | end; | |
| 297 | 315 | end; | |
| 298 | 316 | end; | |
| 299 | 317 | end; | |
| 300 | 318 | ``` | |
| 301 | 319 | ||
| 302 | 320 | プロジェクトを保存して、メニューからRun -\> Runを選んでください。 | |
| 303 | 321 | ||
| 304 | 322 | #### MySQLのソースコードをダウンロードする | |
| 305 | 323 | ||
| 306 | 324 | 全ソースコードは次からダウンロードできます。[Sample Source Code](http://lazarus-ccr.sourceforge.net/kbdata/mysqldemo.tar.gz) | |
| 307 | 325 | ||
| 308 | 326 | ## Lazarus と PostGreSQL | |
| 309 | 327 | ||
| 310 | 328 | これは、Lazarus 0.9.12以降と、PostGresSQLデータベースを、ローカル、リモートの両方でTPQConnectionを使って接続するためのとても短いチュートリアルです。 | |
| 311 | 329 | ||
| 312 | 330 | インストールを正しくおこなったの後で、次のステップをやってみてください。 | |
| 313 | 331 | ||
| 314 | 332 | - SQLdbタブから、PQConnectionを置く | |
| 315 | 333 | - SQLdbタブから、SQLQueryを置く | |
| 316 | 334 | - SQLdbタブから、SQLTransactionを置く | |
| 317 | 335 | - DataAccessタブから、DataSourceを置く | |
| 318 | 336 | - DataControlsタブから、DBGridを置く | |
| 319 | 337 | ||
| 320 | 338 | - PQConnectionのプロパティを適切に設定してください。 | |
| 321 | 339 | - transaction propertyに、SQLTransactionオブジェクトを参照させる。 | |
| 322 | 340 | - Database name | |
| 323 | 341 | - HostName | |
| 324 | 342 | - UserName + password | |
| 325 | 343 | ||
| 326 | 344 | - SQLTransactionが自動的にPQConnectionを示すように変更されたとこに注意してください。 | |
| 327 | 345 | ||
| 328 | 346 | - SQLQueryのプロパティを適切に埋めてください。 | |
| 329 | 347 | - transaction プロパティに適切なオブジェクト | |
| 330 | 348 | - database プロパティに適切なオブジェクト | |
| 331 | 349 | - SQL (たとえば、'select * from anytable' などとしてください。) | |
| 332 | 350 | ||
| 333 | 351 | - DataSourceオブジェクトのDataSetプロパティに、SQLQueryオブジェクトを指定してください。 | |
| 334 | 352 | ||
| 335 | 353 | - DBGridオブジェクトのDataSourceプロパティにDataSourceオブジェクトを設定してください。 | |
| 336 | 354 | ||
| 337 | 355 | すべてをconnectedとactiveにすると、設計時においても、DBGridに表示がされます。 TDBTextとTDBEditは、私には、ただ値を表示するだけのように見えます。 | |
| 338 | 356 | ||
| 339 | 357 | To change contents in the database, I called the DB Engine direct with the following code: データベースの内容を更新するには、私は次のようにDBエンジンをダイレクトに呼び出します。 | |
| 340 | 358 | ||
| 341 | 359 | ``` pascal | |
| 342 | 360 | try | |
| 343 | 361 | sql:= 'UPDATE table SET setting=1'; | |
| 344 | 362 | PQDataBase.Connected:=True; | |
| 345 | 363 | PQDataBase.ExecuteDirect('Begin Work;'); | |
| 346 | 364 | PQDataBase.ExecuteDirect(sql); | |
| 347 | 365 | PQDataBase.ExecuteDirect('Commit Work;'); | |
| 348 | 366 | PQDataBase.Connected:=False; | |
| 349 | 367 | except | |
| 350 | 368 | on E : EDatabaseError do | |
| 351 | 369 | MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message); | |
| 352 | 370 | on E : Exception do | |
| 353 | 371 | MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message); | |
| 354 | 372 | end; | |
| 355 | 373 | ``` | |
| 356 | 374 | ||
| 357 | 375 | - ノート: | |
| 358 | 376 | - Lazarus 0.9.12 + PGSQL 8.3.1にて、Windowsでテストしました。 | |
| 359 | 377 | - Lazarus 0.9.12 and PGSQL 8.0.xで、Linuxでテストしました。 | |
| 360 | 378 | ||
| 361 | 379 | - インストレーションとエラー: | |
| 362 | 380 | - Lazarus 0.9.12のテストバージョン では、"text" と "numeric" の型にバグがあります。 | |
| 363 | 381 | - 固定長のキャラクタと、intとfloat8では、私は問題なく使えました。 | |
| 364 | 382 | - 時々Lazarusを再起動することでくだらないエラーを解決できた | |
| 365 | 383 | - いくつかのエラーの後で、トランザクションがアクティブのまま残り、手動でデアクティベートしなくてはならなかった。 | |
| 366 | 384 | - Lazarusによって行われた変更は、もちろん、トランザクションがコミットされるまでは見ることができません。(訳注:他のトランザクションでは、ということ) | |
| 367 | 385 | - IDEのデバッガは(少なくともWindowsにおいては)バグがあるようです。時々IDEの外で走らせるとエラーの発生を見つけるのに役立ちます。 | |
| 368 | 386 | - Linuxでは、特定のエラーメッセージがコンソールに出力されることがあります。--もし、コマンドラインで走らせているなら、時々デバッグに役立つ情報があります。 | |
| 369 | 387 | - このようなエラーが発生することがあります。: "Can not load Postgresql client. Is it installed (libpq.so) ?" | |
| 370 | 388 | - PostgreSQLをインストールした所から、libpq*を探して、パスに加えて下さい。 | |
| 371 | 389 | - Linuxでは、pathにlibpq.soファイルを、/etc/fpc.cfgの中のライブラリセクションに加えてください。たとえば、次のように:-Fl/usr/local/pgsql/lib | |
| 372 | 390 | - Windowsでは、これらのライブラリを、環境変数のパスのどこにでも追加してください。また、プロジェクトディレクトリに加えてもかまいません。 | |
| 373 | 391 | - 私は、すべてのDLLを自分のパソコンのC:\Program Files\PostgreSQL\8.1\bin などに入れて、パスを通しています。 | |
| 374 | 392 | ||
| 375 | 393 | ## Lazarus と SQLite | |
| 376 | 394 | ||
| 377 | 395 | Luiz Américo による | |
| 378 | 396 | ||
| 379 | 397 | ### イントロダクション | |
| 380 | 398 | ||
| 381 | 399 | TSQLLiteDatasetとTSQLLite3DatasetはTDatasetの派生クラスで、2.8.xと3.2.xのSQLLiteデータベースにアクセスします。下記は主な特徴と欠点です。 | |
| 382 | 400 | ||
| 383 | 401 | 特徴: | |
| 384 | 402 | ||
| 385 | 403 | - 自由度が高い: データベースはシンプルなテーブルレイアウトでも、複雑なSQLを使ってもよいので、プログラマは、SQLを使っても良いし、使わなくても良い。 | |
| 386 | 404 | - 自動データ更新: SQL文でデータベースを手動でアップデートする必要はありません。1つの命令で更新ができます。 | |
| 387 | 405 | - 高速: メモリにデータをキャッシュするため、データセットを高速にブラウズします。 | |
| 388 | 406 | - サーバーインストール、設定が不要:SQLLiteダイナミックライブラリと一緒に配布するだけです。 | |
| 389 | 407 | ||
| 390 | 408 | 欠点 | |
| 391 | 409 | ||
| 392 | 410 | - 外部ファイルを必要とします。(sqlite library) | |
| 393 | 411 | ||
| 394 | 412 | ### 要求事項 | |
| 395 | 413 | ||
| 396 | 414 | - sqlite2のためには: | |
| 397 | 415 | - fpc 2.0.0 | |
| 398 | 416 | - Lazarus 0.9.10 | |
| 399 | 417 | - sqlite runtime library 2.8.15 以上(www.sqlite.orgから) | |
| 400 | 418 | ||
| 401 | 419 | - sqlite3のためには: | |
| 402 | 420 | - fpc 2.0.2 | |
| 403 | 421 | - Lazarus 0.9.11 (svn revision 8443 以上) | |
| 404 | 422 | - sqlite runtime library 3.2.1 以上 (www.sqlite.orgから) | |
| 405 | 423 | ||
| 406 | 424 | **Lazarusのプロジェクトを作る前に、次の事を確認してください。:** | |
| 407 | 425 | ||
| 408 | 426 | - SQLLiteライブラリがシステムパスか、実行できるディレクトリにあるかどうか。 | |
| 409 | 427 | - Linuxでは、cmemを メインプログラムのusesの最初のユニットにしているかどうか | |
| 410 | 428 | ||
| 411 | 429 | ### 使い方 (基本) | |
| 412 | 430 | ||
| 413 | 431 | /components/sqlite にあるパッケージをインストールしてください。([[Install Packages|ここにその]]方法があります。) 設計時に下記のプロパティをセットして下さい。 | |
| 414 | 432 | ||
| 415 | 433 | - FileName: sqliteファイルへのパス\[必須\] | |
| 416 | 434 | - TableName: sql文で使うテーブル名\[必須\] | |
| 417 | 435 | - Sql: SQLのSELECT文 \[必要に応じて\] | |
| 418 | 436 | ||
| 419 | 437 | **テーブルを作成する(Dataset)** | |
| 420 | 438 | ||
| 421 | 439 | コンポーネントアイコンをダブルクックするか、右マウスボタンのクリックで現れるポップアップメニューで、'Create Table'を選択します。 | |
| 422 | 440 | ||
| 423 | 441 | 簡単な説明のあるテーブルエディタが表示されます。 | |
| 424 | 442 | ||
| 425 | - | ||
| 443 | + | ```text | |
| 444 | + | 下記はTSqliteDatasetとTSqlite3Datasetでサポートされているすべてのフィールドの型です。 | |
| 445 | + | ``` | |
| 426 | 446 | ||
| 427 | - | ||
| 428 | - | ||
| 429 | - | ||
| 430 | - | ||
| 431 | - | ||
| 432 | - | ||
| 433 | - | ||
| 434 | - | ||
| 435 | - | ||
| 436 | - | ||
| 437 | - | ||
| 438 | - | ||
| 439 | - | ||
| 447 | + | ```text | |
| 448 | + | Integer | |
| 449 | + | AutoInc | |
| 450 | + | String | |
| 451 | + | Memo | |
| 452 | + | Bool | |
| 453 | + | Float | |
| 454 | + | Word | |
| 455 | + | DateTime | |
| 456 | + | Date | |
| 457 | + | Time | |
| 458 | + | LargeInt | |
| 459 | + | Currency | |
| 460 | + | ``` | |
| 440 | 461 | ||
| 441 | 462 | **データを取得する** | |
| 442 | 463 | ||
| 443 | 464 | テーブルを生成した後か、以前作ったテーブルで作業する場合、Open手続きでデータセットを開いて下さい。 SQLプロパティがセットしていない場合、すべてのフィールドのすべてのレコードを取得するためには、次のような1文をSQLにセットします。: | |
| 444 | 465 | ||
| 445 | - | ||
| 466 | + | ``` pascal | |
| 467 | + | SQL:='Select * from TABLENAME'; | |
| 468 | + | ``` | |
| 446 | 469 | ||
| 447 | 470 | **データファイル上に変更を保存する** | |
| 448 | 471 | ||
| 449 | 472 | ApplyUpdates関数を使うために, データセットは主キーの条件にあうための、少なくとも1つのフィールドを持っていなければなりません。(つまり、ユニークであって、NULLではない、という条件です。) | |
| 450 | 473 | ||
| 451 | 474 | 更新をおこなうために2つの方法が可能です。 | |
| 452 | 475 | ||
| 453 | 476 | - PrimaryKeyプロパティに主キーになっているフィールド名を指定する。 | |
| 454 | 477 | - AutoIncフィールドを加える。(これはTSqliteDatasetが自動的にそれを主キーとしてみなすので簡単です。) | |
| 455 | 478 | ||
| 456 | 479 | もし、2つの条件のうち、1つをセットしたら、次のように呼び出すだけです。 | |
| 457 | 480 | ||
| 458 | - | ||
| 481 | + | ```text | |
| 482 | + | ApplyUpdates; | |
| 483 | + | ``` | |
| 459 | 484 | ||
| 460 | 485 | 追記1: もし、両方の条件がセットされたら、主キーによるフィールドが更新のために使われます。 | |
| 461 | 486 | ||
| 462 | 487 | 追記2:フィールドに主キーを設定することは、ApplyUpdateがコールされたときに、主キーによってデータをみつけられなくてはいけません。 ですから、選択されたフィールドは、 Nullを含まないことや、一意であることを確認してください。 | |
| 463 | 488 | ||
| 464 | 489 | ### 注意事項 | |
| 465 | 490 | ||
| 466 | 491 | - 10000レコードまではテストして、上手く動きますが、TSqliteDatasetはすべてのデータをメモリ上に置くため、必要なデータのみ受け取るようにしてください。(特にMemoフィールドなどに注意). | |
| 467 | 492 | - 同じデータファイルに、いくつかのテーブル、データセットを持たせることができます。 | |
| 468 | 493 | - いくつかのデータセット(違うフィールドの組み合わせの)を同じテーブルから作ることができます。 | |
| 469 | 494 | - SQLでWHERE文を使ってデータを選別することが可能です。クローズして再オープンする(あるいは、RefechDataメソッドをつかう)ことができます。この場合、並び順やフィールドの数は同じでなくてはなりません。 | |
| 470 | 495 | - 複数のテーブルからaliasesやjoin,viewsなどを使って複雑なSQL文を使うことが可能です。(しかし、これらは同じデータファイルになくてはなりません。)しかしこの場合、ApplyUpdateは動作しません。もし複雑なクエリをつかって、データファイルに更新を加えたければ私(Luiz Américo)にメールしてください。そうすれば、どういうふうにおこなうか、ヒントをお伝えすることができます。 | |
| 471 | 496 | ||
| 472 | 497 | - TSqliteDatasetで生成されていない、そして、開いていないsqlite2.xのデータファイルにファイル名を設定するとき、一部のフィールドが正しい型を検出することが、許可されていません。これらは、stringフィールドとして扱われます。 | |
| 473 | 498 | ||
| 474 | 499 | 一般的なサンプルが、fpc/fcl/db/sqlite CVSディレクトリにあります。 | |
| 475 | 500 | ||
| 476 | 501 | Luiz Américo pascalive(at)bol(dot)com(dot)br | |
| 477 | 502 | ||
| 478 | 503 | ## Lazarus と MSSQL | |
| 479 | 504 | ||
| 480 | 505 | これはZeoslib (latest cvs)でおこなっています。ページの最後のリンクを見てください。 | |
| 481 | 506 | ||
| 482 | 507 | ## Lazarus と Interbase / Firebird | |
| 483 | 508 | ||
| 484 | 509 | [[Install Packages|Install Packagesを]]見て下さい。このページにはどのようにIBやFBサーバーと接続するか、最初の小さいサンプルと説明があります。 | |
| 485 | 510 | ||
| 486 | 511 | この作業も最新のZeoslibにあります。 | |
| 487 | 512 | ||
| 488 | 513 | ### FBLib Firebird ライブラリ | |
| 489 | 514 | ||
| 490 | 515 | [1](http://fblib.altervista.org/%7CFBLib) はDelphi/Kylix、FreePascalとLazarusからFirebirdリレーショナルデータベースに直接アクセスする、(DataAwareではない)オープンソースライブラリです。 | |
| 491 | 516 | ||
| 492 | 517 | 現在、次のような特徴があります。 | |
| 493 | 518 | ||
| 494 | 519 | - Firebird 1.0.x 1.5.x Classic SuperServer に直接接続します。 | |
| 495 | 520 | - マルチプラットホームです。 \[Win32,Gnu/Linux,FreeBSD) | |
| 496 | 521 | - 自動的にクライアントライブラリを選択します。'fbclient' または 'gds32' | |
| 497 | 522 | - パラメータ型クエリのサポート | |
| 498 | 523 | - SQL Dialect 1/3をサポート | |
| 499 | 524 | - LGPL ライセンス | |
| 500 | 525 | - メタデータの抽出 | |
| 501 | 526 | - シンプルなスクリプトパーサ | |
| 502 | 527 | - 実行ファイルは100-150 KB しか増えません。 | |
| 503 | 528 | - BLOB フィールドをサポートします。 | |
| 504 | 529 | - HTML SQL Scriptへデータを出力します。 | |
| 505 | 530 | - サービスマネージャ (backup,restore,gfix...) | |
| 506 | 531 | - イベントアラータ | |
| 507 | 532 | ||
| 508 | 533 | 文書はここからダウンロードできます。[FBLibのWebサイト](http://fblib.altervista.org/). | |
| 509 | 534 | ||
| 510 | 535 | ## Lazarus と dBase | |
| 511 | 536 | ||
| 512 | 537 | Tony Maro | |
| 513 | 538 | ||
| 514 | 539 | このページも訪れるとよいでしょう。[[Lazarus Tdbf Tutorial|TDbf Tutorial page]] | |
| 515 | 540 | ||
| 516 | 541 | FPCはDelphiのTTableコンポーネントとにた機能をもつ、"TDbf"([TDbf Website](http://tdbf.sourceforge.net/))と呼ばれる、シンプルなデータベースコンポーネントを含んでいます。 これは、基本的なdBaseファイルの機能の基本的なサブセットをサポートしています。これは、デフォルトではインストールされませんので、最初にすることはLazarusパッケージを"lazarus/components/tdbf" からインストールして、Lazarus IDEをビルドすることです。そうすれば、コンポーネントパレットにTDatasourceの次に現れます。 | |
| 517 | 542 | ||
| 518 | 543 | TDbfコンポーネントは他のデータベースコンポーネントに対して、次のような利点があります。すなわち、どんな種類のランタイムデータベースエンジンも必要としないことです。しかしながら、大きいデータベースをもつアプリケーションには最適ではありません。 | |
| 519 | 544 | ||
| 520 | 545 | これを使うのは非常に簡単です。単に、フォームの上にTDbfをドロップしておいてください。ランタイムパスにデータベースファイルを置く場所を指定します。テーブル名をセットします。そして、TDatasourceコンポーネントにリンクします。 | |
| 521 | 546 | ||
| 522 | 547 | しかしながら、もうちょっと努力して本格的な機能が求められます。テーブルがすでに存在しない場合、テーブルデザイナに相当するものがなければ(私はしりませんが)、プログラムからそれをつくる必要があります。 | |
| 523 | 548 | ||
| 524 | 549 | 存在しないテーブルを開こうとすると、エラーが生成されます。テーブルはプログラムから、ランタイムパスとテーブル名をセットしたコンポーネントを通して、作ることができます。 | |
| 525 | 550 | ||
| 526 | 551 | たとえば、あなたのDVDコレクションを記録するために"dvds"というテーブルを作る場合、フォームにTDbfコンポーネントをドロップして、ランタイムパスと"dvds"と名づけたテーブル名を設定してください | |
| 527 | 552 | ||
| 528 | 553 | 結果ファイルは"dvds.dbf"となります。 | |
| 529 | 554 | ||
| 530 | 555 | コードでおこなう場合次のようなコードを入れてください。 | |
| 531 | 556 | ||
| 532 | 557 | ``` pascal | |
| 533 | 558 | Dbf1.FilePathFull := '/path/to/my/database'; | |
| 534 | 559 | Dbf1.TableName := 'dvds'; | |
| 535 | 560 | With Dbf1.FieldDefs do begin | |
| 536 | 561 | Add('Name', ftString, 80, True); | |
| 537 | 562 | Add('Description', ftMemo, 0, False); | |
| 538 | 563 | Add('Rating', ftString, 5, False); | |
| 539 | 564 | end; | |
| 540 | 565 | Dbf1.CreateTable; | |
| 541 | 566 | ``` | |
| 542 | 567 | ||
| 543 | 568 | このプログラムを走らせると、あなた用のDVDコレクションテーブルが作られます。その後、すべてのdata awareコンポーネントがTDatasourceを通してリンクされ、データに簡単にアクセスできるようになります。 | |
| 544 | 569 | ||
| 545 | 570 | インデックスを付加することは、典型的なTTableとはちょっと異なっています。データベースは開いていなくてはなりません。インデックスをリビルドするのと同じメソッドを使います。 | |
| 546 | 571 | ||
| 547 | 572 | 例えば: | |
| 548 | 573 | ||
| 549 | 574 | ``` pascal | |
| 550 | 575 | Dbf1.Exclusive := True; | |
| 551 | 576 | Dbf1.Open; | |
| 552 | 577 | Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]); | |
| 553 | 578 | Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]); | |
| 554 | 579 | Dbf1.Close; | |
| 555 | 580 | ``` | |
| 556 | 581 | ||
| 557 | 582 | 最初のインデックス(プライマリインデックス)は、"dvdname.mdx"というファイルにはいっており、2番目のインデックスは、"rating.ndx"というファイルにはいっています。複数のテーブルがあるデータベースでは、同じファイル名を使わないよう注意を払ってください。 | |
| 558 | 583 | ||
| 559 | 584 | 今後、もっと詳細な例を作りたいと思っています。願わくば、昔Delphiに馴染んだ方々に立ち上がっていただき、Lazarusでデータベースのプログラムを作るきっかけになってほしいと思っています。 | |
| 560 | 585 | ||
| 561 | 586 | ## 関連のある記事 | |
| 562 | 587 | ||
| 563 | 588 | - [[Databases/ja|Creating Databases Applications with Lazarus using the DB-unit]]\ | |
| 564 | 589 | - [[MySQLDatabases|Creating a database application using MySQL]]\ | |
| 565 | 590 | - [[Zeos tutorial|Creating a database application using the Zeos components]] | |
| 566 | 591 | - Pascal Data Objects is a database API that worked for both FPC and Delphi and utilises native MySQL libraries for version 4.1 and 5.0. It's inspired by PHP's PDO class. | |
| 567 | 592 | ||
| 568 | 593 | <https://trac.synsport.com:8000/index.php/pdo/wiki> (username/password is guest/guest) | |
| 569 | 594 | ||
| 570 | 595 | ## Contributors and Changes | |
| 571 | 596 | ||
| 572 | 597 | This page has been converted from the epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusDatabase). | |
| 573 | 598 | ||
| 574 | 599 | --- | |
| 575 | 600 | *From the Free Pascal wiki, page "Lazarus Database Tutorial/ja", as it stood on 2024-04-01 after a change by Ariben, 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).* |
