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