Sign in Join
Wiki copytemporary

SQLdb Tutorial1/ja: what changed

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

OldNewLine
11## 概要
22
33このチュートリアルでは、[[SQLdb Package]] に基づいた実用的なコード例を使用してデータベースをプログラミングする方法を示す。 主に初心者を対象としている。データベースと SQL の基本を探している人は、関連する書籍やドキュメントを読む必要がある。 このチュートリアルでは、サンプル データベースemployee.fdbとともにFirebirdを使用する。他のデータベースも使用できる。本文に記載されているように、いくつかの調整を行う必要がある。
44
55このチュートリアルは長く見えるかもしれないが、ほとんどの場合、入力する内容を入力する必要がある理由を説明する大量のテキストだけである。最後に見られるように、アプリケーションを動作させるために必要な実際のコードの量はそれほど多くはない。経験豊富な開発者であれば、説明をざっと読んで、何が起こっているのかをすぐに理解できるだろう。 また、Basic example章の最後で停止して、動作するプログラムを作成することもできる。
66
77このチュートリアルは、Swen による [[SQLdb Tutorial1/de|ドイツ語チュートリアル]] に基づいているが、特に Basic example 以降は拡張されている。Swen はドイツ語版を現状のままにしておきたいと考えている。これが問題となる場合は、このバージョンの名前を変更し、それに基づいて新しいドイツ語訳を作成することができる。
88
99スウェンより: JoostとMichaelに感謝。 彼らの助けがなければ、このチュートリアルはおそらく決して実現しなかっただろう。
1010
1111## 必要事項
1212
1313このチュートリアルは、最近の Lazarus(Laz 1.0) を使い作成されている; また、より古いバージョンの Lazarus 0.9.30 でも動くだろう。
1414
1515また、事前に [[SQLdb Tutorial0]] を読み、サンプルのデータベースを生成のこと。
1616
1717## Basic example
1818
1919### プロジェクトとコンポーネント
2020
2121[[TSQLTransaction]]、および 1 つの [[TSQLQuery]] コンポーネントが必要である。
2222
23-<figure>
24-<img src="sqldbcomponents-n.png" title="sqldbcomponents-n.png" />
25-<figcaption>sqldbcomponents-n.png</figcaption>
26-</figure>
23+![](/wiki-images/c/c1/Sqldbcomponents-n.png)
2724
2825[[TIBConnection]] は、Interbase/Firebird 固有の接続コンポーネントである。 別のデータベースを使用している場合は、[[SQLdb tub]] の適切なコンポーネントを置き換える。 SQLite データベースの場合は '[[TSQLite3Connection/ja]]'、PostgreSQL データベースの場合は [[TPQConnection]]。 データベース アクセス ライブラリのセットアップに関する説明は、このチュートリアルの範囲外である。そのために[[Databases/ja|Databases/jaを]]参照のこと。 。
2926
3027フォーム上の [[TIBConnection/ja]] (または同等の接続コンポーネント) をクリックし、オブジェクトインスペクタで名前を *DBConnection* に変更する。 これにより、別のデータベースを使用する場合のチュートリアルの残りの部分がを簡素にできる。 また、一般に、コンポーネントにプログラム内で役立つ名前 (MainframeDBConnection など) を付けて、それが何を表しているのかわかるようにすることを勧める。
3128
3229他の2つのコンポーネント [[TSQLTransaction/ja]] と [[TSQLQuery/ja]] は、SQLdb でサポートされるすべてのデータベースに使用できる。
3330
3431データを表示するには、[[TDBGrid/ja]] コンポーネントを使用する。このコンポーネントは、'Data Controls' タブにある。このコンポーネントをデータベースコンポーネントに接続するには、'[[Data Access tab]]' の [[TDataSource/ja]] コンポーネントが必要である。
3532
3633これで、最初の例に必要なデータベース コンポーネントがすべて揃った。TDBGrid を拡大して、すべてのデータを表示するのに十分なスペースを確保できる。
3734
3835### コンポーネントをリンクする
3936
4037次に、コンポーネントを接続する必要があります。 非常に簡単な方法はオブジェクトインスペクタを使用することだが、これをソースコード内で実行することもできる。
4138
4239DBConnection の *Transaction* プロパティを 'SQLTransaction1' に変更する。 これにより、SQLTransaction1 の *Database* プロパティが自動的に 'DBConnection' に変更される。
4340
4441次に、SQLQuery1 の *Database* プロパティを 'DBConnection' に変更する。Lazarus は、「トランザクション」プロパティの値を自動的に追加する。
4542
4643次に、Datasource1 の *Dataset* プロパティを 'SQLQuery1' に変更する。
4744
4845最後に、DBGrid1 の *Datasource* プロパティを 'Datasource1' に変更する。
4946
5047これで、デフォルトのトランザクションをトランザクション コンポーネントにリンクする接続が完成した。 トランザクションコンポーネントは、そのデータベース プロパティを接続オブジェクトにリンクする。 これら 2 つのコンポーネントは、接続して命令を実行するには十分ですが、クエリを表示するには十分ではない。 このために、データベースを指す(およびそのデフォルトのトランザクションにリンクする) SQLQuery コンポーネントが使用される。SQLQuery を使用して、後でデータを取得し、データベースにポストバックする。
5148
5249最後に、クエリコンポーネントにリンクされているデータソースコンポーネントは、一種のプレースホルダーです。 クエリデータセット内のどこにいるかを追跡し、GUI コンポーネントがそれにリンクされているため、すべてが同じレコードを表示する。
5350
5451これが意味不明であっても、絶望しないこと。もう少し作業を加えるだけで、最初のデータを表示できるようになる。
5552
5653### データベースに接続する
5754
5855データベースのデータを画面に表示するにはどうするか?
5956
6057まず、DBConnection に、employee.fdb データベースがどこにあるかを伝える必要がある。そのデータベースの場所はオペレーティング システムによって異なる。次のような場所である:
6158
6259- .../examples/empbuild/ Linux 上の Firebird インストールのサブディレクトリ
6360- Windows マシンの場合は C:\Program Files\Firebird\Firebird_2_5\examples\empbuild\EMPLOYEE.FDB
6461- Firebird 埋め込みを使用する場合、ファイルはプロジェクト ディレクトリにある必要がある
6562
6663ここでも選択が可能だ: オブジェクトインスペクタを使用してパスを割り当てるか、ソースコードで直接行うことができる。
6764
6865オブジェクトインスペクタを使用することを選択する。DBConnection の「HostName」プロパティを Firebird サーバ名または IP アドレスに設定する。 Firebird サーバが開発マシンで実行されている場合は、localhost を使用します。 埋め込み Firebird クライアントを使用する場合は、空白の値を使用する。 DBConnection の *DatabaseName* プロパティを、データベース サーバ上のemployee.fdb ファイルへのパスに変更します。埋め込み Firebird を使用する場合、パス部分は空にし、ファイル名のみを指定する必要がある。
6966
7067データベースサーバはデータへのアクセスを許可する前に、ユーザー名とパスワードによる承認をチェックします。本格的なデータベース アプリケーションは、アプリケーションの起動時に両方の値をユーザーに要求し、接続時にこれらをサーバに送信する。これを行う可能な方法は [[SQLdb Tutorial3]] に示されている。
7168
7269ただし、今のところ、問題を単純化するために、オブジェクトインスペクタを再度使用してこれらをハードコーディングします。「UserName」プロパティを「SYSDBA」に変更し、「Password」を「masterkey」に変更する(もちろん、データベースのインストールに別のユーザー名/パスワードがある場合は調整のこと)。
7370
7471ここで、これまでの設定がすべて正しいかどうかを確認する。「Connected」プロパティを「True」に設定します。 データベースのパスが正しくない場合、またはユーザー名またはパスワードが間違っている場合は、エラーメッセージが表示される。接続が成功した場合は、ここで切断する必要があります (「Connected」を「False」に設定する)。
7572
7673#### PostgreSQL
7774
7875PostgreSQL の状況は Firebird の状況と非常に似ている。データベース名にはパスがない。名前の部分 (例: 「employee」) を指定するだけである。 PostgreSQL には埋め込みモードがないため、接続テストを機能させるには「HostName」プロパティを入力する必要がある。
7976
8077#### SQLite
8178
8279SQLite の場合、「HostName」、「UserName」、および「Password」プロパティを空のままにすることができます。 「DatabaseName」を SQLite ファイルの名前に設定します。従業員.sqlite。注: sqlite は、指定されたデータベースが存在しない場合にそれを作成するため、ここでは注意のこと。
8380
8481次のスクリーンショットのようなものが表示されるはずだ - todo: このスクリーンショットは実際にはさらに進んでおり、現在はボタンだけがある。 [framed|center|Form and components set up](/wiki-images/b/b2/SQLTut1ComponentsSetUp.png)
8582
8683DBGrid のプロパティ「Options」→「dgDisplayMemoText」を「(True)」に変更する。 それ以外の場合は、すべてのデータ フィールドに (MEMO) が表示される。
8784
8885### 表示するデータの選択
8986
9087接続は成功したが、データが表示されなかった。 理由は簡単である。 どのデータを返すかをデータベース サーバに伝えていない。employee.fdb データベースにはいくつかのテーブルが含まれており、確認したいテーブルを Firebird に伝えていない。 データベースの構造がわからない場合は、[FlameRobin](http://www.flamerobin.org/index.php) などのツールを使用して内容を表示できる。 Lazarus はそのようなツール、[[DataDesktop]] も提供する。 これは、Lazarus の /tools/lazdatadesktop/ サブディレクトリにある。 プロジェクトを保存し、プロジェクト lazdatadesktop.lpi を開いてコンパイルする。
9188
9289[framed|center|DataDesktopが起動したときの様子](/wiki-images/d/da/DataDictonary1.png)
9390
9491例に戻る。
9592
9693テーブル「CUSTOMER」のすべてのデータを表示したいと考えている。 そのための SQL 命令は次のとおりである。
9794
9895``` sql
9996select * from CUSTOMER
10097```
10198
10299このコマンドを SQLQuery1 の 'SQL' プロパティに割り当てる必要がある。 私たちのプロジェクトのソースコードでは、これは次のようになる。
103100
104101``` pascal
105102SQLQuery1.SQL.Text := 'select * from CUSTOMER';
106103```
107104
108105SQL 命令は一重引用符で囲む必要がある。 別のコンポーネント (Edit1.Text など) のコンテンツを割り当てることもできる。 これは必ずしも良い考えとは限らない。 SQL インジェクションの詳細については、[[Secure programming]] (より高度なテキスト) を参照のこと。
109106
110107フォームの「標準」タブから「TButton」を追加する。 ユーザーがボタンをクリックすると、データの取得が開始される。 *Caption* プロパティを「Button1」から「Show data」に変更する。
111108
112109これにはコードが必要になる。 Button1 をダブルクリックする。 次に、Lazarusは必要な手順の骨格を作成する。 ソースコードには次の行があるはずだ。
113110
114111``` pascal
115112procedure TForm1.Button1Click(Sender: TObject);
116113begin
117114
118115end;
119116```
120117
121118「begin」と「end」の間に、データを表示するために必要な命令を入力する必要がある。明らかに、これは SQLQuery1 と関係がある。
122119
123120SQLQuery1 の 'SQL' プロパティは、SQLQuery1 がアクティブでない場合にのみ変更できる。 そのため、最初にコンポーネントを閉じる。
124121
125122``` pascal
126123SQLQuery1.Close;
127124```
128125
129126次に、SQL 命令を「SQL」プロパティに割り当て、以前の SQL コマンドを上書きする。
130127
131128``` pascal
132129SQLQuery1.SQL.Text := 'select * from CUSTOMER';
133130```
134131
135132次に、データベースへの接続を確立し、トランザクションをアクティブにしてクエリを開く必要がある。
136133
137134``` pascal
138135DBConnection.Connected := True;
139136SQLTransaction1.Active := True;
140137SQLQuery1.Open;
141138```
142139
143140最初の 2 つの命令は 3 番目の命令によって自動的に実行されるため、省略できる。 この時点でプロジェクトをコンパイルすると、CUSTOMER」テーブルのデータがすでに表示されているはずだ。
144141
145142ただし、本格的なアプリケーションでは、開いているすべてのデータベース接続が不要になったときに適切に閉じられるようにする必要がある。 そうでなければ、2次的な影響は予測できない。そこで、フォームの OnClose イベントを使用する (オブジェクトインスペクタでダブルクリックして作成する)。
146143
147144``` pascal
148145procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
149146begin
150147
151148end;
152149```
153150
154151接続を閉じるには、開始コードとは逆の順序を使用する。
155152
156153``` pascal
157154SQLQuery1.Close;
158155SQLTransaction1.Active := False;
159156DBConnection.Connected := False;
160157```
161158
162159DBConnection.Connected を False に設定すると、トランザクションとクエリは自動的に閉じられるため、手動で閉じる必要はない。
163160
164161## 要約
165162
166163ここまで、SQLdb パッケージを使用してデータベースに接続する方法と、テーブルの内容を画面に表示する方法を学習した。 編集などの機能をさらに追加したい場合は、SQLdb チュートリアル 2 に進まれたい。
167164
168165前の手順に従った場合、コードは次のようになる:
169166
170167``` pascal
171168unit Unit1;
172169
173170{$mode objfpc}{$H+}
174171
175172interface
176173
177174uses
178175 Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,
179176 Graphics, Dialogs, DBGrids, StdCtrls;
180177
181178type
182179
183180 { TForm1 }
184181
185182 TForm1 = class(TForm)
186183 Button1: TButton;
187184 Datasource1: TDatasource;
188185 DBGrid1: TDBGrid;
189186 DBConnection: TIBConnection;
190187 SQLQuery1: TSQLQuery;
191188 SQLTransaction1: TSQLTransaction;
192189 procedure Button1Click(Sender: TObject);
193190 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
194191 private
195192 { private declarations }
196193 public
197194 { public declarations }
198195 end;
199196
200197var
201198 Form1: TForm1;
202199
203200implementation
204201
205202{$R *.lfm}
206203
207204{ TForm1 }
208205
209206procedure TForm1.Button1Click(Sender: TObject);
210207begin
211208 SQLQuery1.Close;
212209 SQLQuery1.SQL.Text:= 'select * from CUSTOMER';
213210 DBConnection.Connected:= True;
214211 SQLTransaction1.Active:= True;
215212 SQLQuery1.Open;
216213end;
217214
218215procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
219216begin
220217 SQLQuery1.Close;
221218 SQLTransaction1.Active:= False;
222219 DBConnection.Connected:= False;
223220end;
224221
225222end.
226223```
227224
228225## 関連情報
229226
230227- [[SQLdb Tutorial0/ja]]: チュートリアルに用いるサンプルの表/データを設定する方法を説明します。
231228- [[SQLdb Tutorial1/ja]]: DB チュートリアルの第一の部分。データベースのデータを、どのように grid に表示させるかを学びます。
232229- [[SQLdb Tutorial2/ja]]: DB チュートリアルの第二の部分。データベースのデータの挿入や編集について学びます。
233230- [[SQLdb Tutorial3/ja]]: DB チュートリアルの第三の部分。複数のデータベースについてのプログラムやログインフォームの使い方を学びます。
234231- [[SQLdb Tutorial4/ja]]: DB チュートリアルの第四の部分。どのようにデータモジュールを用いるかを学びます。
235232- [[Lazarus Database Overview/ja]]: Lazarus がサポートしているデータベースについての情報。 データベースごとの記述へのリンクを含みます。
236233- [[SQLdb Package/ja]]: SQLdb パッケージについての情報
237234- [[SQLdb Programming Reference/ja]]: SQLdb データベースコンポーネントの入出力の概要
238235- [[SqlDBHowto/ja]]: SQLdb パッケージを用いることについての情報
239236- [[Working With TSQLQuery/ja]]: TSQLQuery についての情報
240237
241238---
242239*From the Free Pascal wiki, page "SQLdb Tutorial1/ja", as it stood on 2024-03-31 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).*

Back to history