Sign in Join
Wiki copytemporary

SQLdb Tutorial3/ja: what changed

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

Title: SQLdb Tutorial3/ja

OldNewLine
1+## 概要
2+
3+このチュートリアルでは、次の方法を学ぶ
4+
5+- ログインフォームの使用など、アプリケーションを複数のデータベースに適したものにする
6+- データベース データを (データベース コントロールではなく) 通常のコントロールに取得する
7+- コントロールからデータを取得してデータベースに戻す
8+- パラメータ化されたクエリを実行する。
9+
10+## マルチデータベースのサポート
11+
12+任意のデータベースとログイン フォームを使用して、SQLDB がサポートする複数の異なるデータベース サーバー/組み込みライブラリをサポートできる。
13+
14+利点:
15+
16+- ユーザー/プログラマは、任意の sqldb t*connection を動的に使用できるため、データベースを選択できる。
17+
18+短所:
19+
20+- より複雑な SQL をさらに調整する必要がある可能性がある。 各データベースには独自の方言がある。 もちろん、データベース固有の SQL を呼び出すことも可能だが、これはメンテナンスの問題に発展する可能性がある。
21+- T*connection 固有のプロパティ (Firebird 方言を設定するための *TIBConnection.Dialect* など) は使用できない。
22+
23+マルチデータベース サポートを使用するには、*TIBConnection* などの特定の T*Connection の代わりに、*TSQLConnector* (*TSQLConnection* ではない) を使用する。これにより、(プログラムの実行中に) 特定の T*Connection が動的に選択される。 *ConnectorType*プロパティに基づいてT*Connectionを使用する:
24+
25+``` pascal
26+uses
27+...
28+var
29+ Conn: TSQLConnector;
30+begin
31+ Conn:=TSQLConnector.Create(nil);
32+ try
33+ // ...実際のコネクタのタイプはこのプロパティによって決まる。
34+ // ChosenConfig.DBType 文字列が一致することを確認する
35+ // コネクタのタイプ (例:
36+ // そのコネクタの T*ConnectionDef.TypeName 。
37+ Conn.ConnectorType:=ChosenConfig.DBType;
38+ // 残りは通常通り:
39+ Conn.HostName:='DBSERVER';
40+ Conn.DatabaseName:='bigdatabase.fdb';
41+ Conn.UserName:='SYSDBA';
42+ Conn.Password:='masterkey';
43+ try
44+ Conn.Open;
45+```
46+
47+## ログインフォーム
48+
49+[[SQLdb Tutorial1/ja]] で説明したように、ユーザーはアプリケーションにハードコードされた資格情報を使用するのではなく、フォーム (または安全に保存されている構成ファイル) を使用してデータベースにログインする必要がある。 セキュリティ上の考慮事項に加えて、データベース サーバーの情報が変更されるたびにアプリケーションを再コンパイルしなければならないのは、あまり良い考えではない。
50+
51+*dbconfiggui.pas* では、ini ファイルが存在する場合はそこからデフォルト値を取得するログイン フォームをセットアップする。 これにより、エンタープライズ展開、いくつかの詳細 (データベース サーバ、データベース名) を入力してデフォルトの接続を設定できる。 このフォームでは、ユーザーは自分のユーザー名/パスワードを追加/編集し、次に進む前に接続をテストできる。
52+
53+<figure>
54+<img src="dbloginform.png" title="dbloginform.png" />
55+<figcaption>dbloginform.png</figcaption>
56+</figure>
57+
58+*TDBConnectionConfig* クラスを持つ別の dbconfig.pas ユニットを使用して、選択した接続の詳細を保存します。 このクラスは、ini ファイルからのデフォルト設定の読み取りをサポートしています。
59+
60+これにより、GUI ログイン フォームなしでの使用 (例: 無人/バッチ操作の実行時) が可能になり、たとえば、Web サイトでの再利用が可能になる。
61+
62+この*TDBConnectionConfig*クラスはログイン フォームに*Config*プロパティとして表示されるため、メイン プログラムは設定フォームをモーダルに表示し、ユーザーによる \[OK\] クリックを検出して、フォーム設定を閉じる前に選択した設定を取得できる。
63+
64+### 接続テストコールバック関数
65+
66+ログイン フォームを柔軟に保つために (Zeos などの他のデータベース層で使用できる)、テスト セクションをコールバック関数として実装し、メイン プログラムで処理させる。
67+
68+*dbconfiggui.pas* のログイン フォームの定義:
69+
70+``` pascal
71+type
72+ TConnectionTestFunction = function(ChosenConfig: TDBConnectionConfig): オブジェクトのブール値。
73+```
74+
75+メイン フォームは、構成フォームからのテスト リクエストを処理するために、この定義に一致する関数を実装する必要がある。
76+
77+コールバック関数は、構成フォームによって渡された構成オブジェクトを受け取り、それを使用して、選択されたデータベース タイプとの接続を構築する。 その後、単純にサーバーへの接続を試行する。 成功した場合は関数の結果を true に設定し、そうでない場合は結果は false のままとなる。
78+
79+存在しないサーバーへのデータベース接続の試行は長いタイムアウトになる可能性があるため、カーソルを砂時計アイコンに設定して待機する必要があることをユーザーに示す。
80+
81+``` pascal
82+uses
83+...
84+dbconfig, dbconfiggui
85+...
86+procedure TForm1.FormCreate(Sender: TObject);
87+ LoginForm:=TDBConfigForm.Create(self);
88+ try
89+ // dbconfigguiのテストボタンはこのプロシージャにリンクされるだろう
90+ //ここで...これが''dbconfiggui.pas''の コールバックをConnectionTest functionにリンクさせる...
91+ LoginForm.ConnectionTestCallback:=@ConnectionTest;
92+...
93+function TForm1.ConnectionTest(ChosenConfig: TDBConnectionConfig): boolean;
94+// コネクションを確かめるためにdbconfigguiの情報を使うコールバック関数
95+// 確かめるために結果をdbconfigguiへ返す
96+var
97+ // 通常のデータベース接続...
98+ Conn: TSQLConnector;
99+begin
100+ result:=false;
101+ Conn:=TSQLConnector.Create(nil);
102+ Screen.Cursor:=crHourglass;
103+ try
104+ // ...このプロパティで決定される実際の接続タイプ。
105+ // ChosenConfig.DBType文字列がマッチすることを確かめること
106+ // コネクタタイプ(例えば、このコネクタにたいする
107+ // T*ConnectionDef.TypeNameをみること
108+ Conn.ConnectorType:=ChosenConfig.DBType;
109+ Conn.HostName:=ChosenConfig.DBHost;
110+ Conn.DatabaseName:=ChosenConfig.DBPath;
111+ Conn.UserName:=ChosenConfig.DBUser;
112+ Conn.Password:=ChosenConfig.DBPassword;
113+ try
114+ Conn.Open;
115+ result:=Conn.Connected;
116+ except
117+ // 結果はすでにfalse
118+ end;
119+ Conn.Close;
120+ finally
121+ Screen.Cursor:=crDefault;
122+ Conn.Free;
123+ end;
124+end;
125+```
126+
127+最後に、実際にコールバックを呼び出す *dbconfiggui.pas* 内のコードが \[テスト\] ボタンにリンクされます。 (クラッシュを避けるために) コールバック関数が割り当てられているかどうかをテストする。完全を期すために、有効な構成オブジェクトがあるかどうかもチェックし、単純にコールバック関数を呼び出す。
128+
129+``` pascal
130+...
131+TDBConfigForm = class(TForm)
132+...
133+ private
134+ FConnectionTestFunction: TConnectionTestFunction;
135+ public
136+ property ConnectionTestCallback: TConnectionTestFunction write FConnectionTestFunction;
137+...
138+procedure TDBConfigForm.TestButtonClick(Sender: TObject);
139+begin
140+ // 設定を持つコールバックを呼び出す、接続が
141+ // 成功したことを明らかにし、テスト結果を返す
142+ if assigned(FConnectionTestFunction) and assigned(FConnectionConfig) then
143+ if FConnectionTestFunction(FConnectionConfig) then
144+ showmessage('Connection test succeeded.')
145+ else
146+ showmessage('Connection test failed.')
147+ else
148+ showmessage('Error: connection test code has not been implemented.');
149+end;
150+```
151+
152+### 追加・修正
153+
154+ログインフォームの可能な追加/変更:
155+
156+- dbconfig のコマンド ライン引数処理を追加して適切なデフォルトをプリロードし、プログラムをバッチ スクリプトやショートカットなどで使用できるようにする。
157+- ログインフォームに「プロファイルの選択」コンボボックスを追加する。 ini ファイル内でデータベースの種類と接続の詳細を指定する複数のプロファイルを使用する。
158+- 1 つのデータベース タイプのみがサポートされている場合は、データベース タイプ コンボボックスを非表示にする。
159+- 組み込みデータベースが選択されていることが確実な場合は、ユーザー名とパスワードを非表示にする。
160+- MS SQL Server コネクタを使用したポート番号またはインスタンス名の指定のサポートを追加。
161+- 信頼できる認証をサポートするデータベース (Firebird、MS SQL) にサポートを追加: ユーザー名/パスワードの制御を無効にする
162+- 組み込みデータベースを選択したがファイルが存在しない場合: 確認要求を表示し、データベースを作成する
163+- コマンドライン アプリケーション用にログイン フォームのコマンドライン/TUI バージョンを作成する(たとえば、curses ライブラリを使用)
164+
165+この記事やコードの更新は大歓迎する。
166+
167+## データベース データを通常のコントロールに取り込む
168+
169+> **Note:** このセクションを開始する前に、[[SQLdb Tutorial0/ja|チュートリアル0の必要条件]] で指定されているようにサンプル従業員データベースが設定されていることを確認されたい。
170+
171+前のチュートリアルでは、データ バインド コントロールについて説明した。[[TDBGrid]] などの特別なコントロールは、そのコンテンツを [[TDataSource]] にバインドし、そのソースから更新を取得し、ユーザーの編集内容を送り返すことができる。
172+
173+プログラム的にデータベースの内容を取得し、その内容を任意の種類のコントロール (または変数) に入力することも可能である。 例として、サンプル従業員データベース テーブルの給与明細を stringgrid に入力する方法を見ていく。
174+
175+メイン フォームで [[TStringGrid]] を追加し、(例えば、*OnCreate* イベントで呼び出されるプロシージャ *LoadSalaryGrid* 経由で)データを取得する 。
176+
177+``` pascal
178+ // データベースから取得
179+ try
180+ if not FConn.Connected then
181+ FConn.Open;
182+ if not FConn.Connected then
183+ begin
184+ ShowMessage('Error connecting to the database. Aborting data loading.');
185+ exit;
186+ end;
187+
188+ // 最低賃金
189+ // 注意: ここで1行だけ取得したいが、SQLは様々なデータベースシステムで異なる
190+ // 後にチュートリアルで、データベースに依存したSQLを扱うが、ここではMS SQL:
191+ // のMS SQL: 'select top 1 '...を用いておく
192+ FQuery.SQL.Text:='select ' +
193+ ' e.first_name, ' +
194+ ' e.last_name, ' +
195+ ' e.salary ' +
196+ 'from employee e ' +
197+ 'order by e.salary asc ';
198+ // ISO SQL+Firebird SQL: では
199+ //'rows 1 '; をここと以下に加えること。PostgreSQLでは動作しないが
200+ FTran.StartTransaction;
201+ FQuery.Open;
202+ SalaryGrid.Cells[1,1]:=FQuery.Fields[0].AsString; // i.e. Cells[Col,Row]
203+ SalaryGrid.Cells[2,1]:=FQuery.Fields[1].AsString;
204+ SalaryGrid.Cells[3,1]:=FQuery.Fields[2].AsString;
205+ FQuery.Close;
206+ // 読み込むときでも、常にコミット(retain)すること
207+ // これは読み直したときに他者によって更新することを可能にする
208+ FTran.Commit;
209+...
210+ end;
211+ except
212+ on D: EDatabaseError do
213+ begin
214+ FTran.Rollback;
215+ MessageDlg('Error', 'A database error has occurred. Technical error message: ' +
216+ D.Message, mtError, [mbOK], 0);
217+ end;
218+ end;
219+```
220+
221+注意すべき点: try..except を使用してデータベース エラーを検出する。 エラーが発生した場合にトランザクションをロールバックするのを忘れていることがわかるが、これは読者の演習として残されている。
222+
223+クエリ オブジェクトを *Open* し、それによって *FQuery* に *SQL* ステートメントを介してデータベースにクエリを実行するよう命ずる。 これが完了すると、データの最初の行が表示される。 私たちは単にデータが存在すると仮定する。 これは実際にはプログラミング エラーである。*FQuery.EOF* が true (または *FQuery.RecordCount* が \>0) であるかどうかを確認する方がよりまともだ。
224+
225+次に、結果の最初の行からデータを取得する。 次の行に移動したい場合は、*FQuery.Next* を使用するが、ここではその必要はない。 結果を stringgrid に入力し、リスト内の最低給与を示す。 最高の給与についても同様のアプローチがとれる。
226+
227+上で述べたように、さまざまなデータベースがさまざまなバージョンの SQL をサポートしている(公式 ISO SQL 標準に加えて、またはこれに反して)。 幸いなことに、最終的に使用する DB に基づいてアプリケーションをカスタマイズできる。これは、従業員の給与の標準偏差を取得することで示される、例えば、PostgreSQL SQL では組み込みだが、例えば、Firebirdではデフォルトで利用できない。
228+
229+この、LoadSalaryGrid プロシージャではPostgreSQLのSQLを用い、コードを他の全てのデータベースに対して構築する。初めに、どのデータベースが読み込まれたか検知する。他の行に以下を加える:
230+
231+``` pascal
232+ ...
233+ SalaryGrid.Cells[3,2]:=FQuery.Fields[2].AsString;
234+ FQuery.Close;
235+ // たとえ読み取り時でも、常にトランザクションをコミット(retain)すること
236+ FTran.Commit;
237+//存在するコードの最後
238+
239+ if FConn.ConnectorType = 'PostGreSQL' then
240+ begin
241+ // PostgreSQLに対しては、それ固有の SQL 解決策:
242+ FQuery.SQL.Text:='select stddev_pop(salary) from employee ';
243+ FTran.StartTransaction;
244+ FQuery.Open;
245+ if not FQuery.EOF then
246+ SalaryGrid.Cells[3,3]:=FQuery.Fields[0].AsString;
247+ FQuery.Close;
248+ // たとえ読み取り時でも、常にトランザクションをコミット(retain)すること
249+ FTran.Commit;
250+ end
251+ else
252+ begin
253+ // 他のデータベースでは、このコードアプローチで:
254+ ....以下参照...
255+ end;
256+```
257+
258+*ConnectorType* の使用に注目すること。 使用される文字列は正確に一致する必要がある。 また、クエリからの空の結果も適切にチェックする (従業員テーブルが空の場合に発生する可能性がある)。
259+
260+... ここで標準偏差をサポートしない他のデータベースのための、コードベースの解決策を実装する:
261+
262+``` pascal
263+ // 他のデータベースでは、コードによるアプローチを行う:
264+ // 1. 値の平均を求める
265+ FQuery.SQL.Text:='select avg(salary) from employee ';
266+ FQuery.Open;
267+ if FQuery.EOF then
268+ SalaryGrid.Cells[3,3]:='No data'
269+ else
270+ begin
271+ Average:=FQuery.Fields[0].AsFloat;
272+ FQuery.Close;
273+ // 2. それぞれの値に対し、平均値の二乗をとり、加え合わせると
274+ FQuery.SQL.Text:='select salary from employee where salary is not null ';
275+ FQuery.Open;
276+ while not FQuery.EOF do
277+ begin
278+ DifferencesSquared:=DifferencesSquared+Sqr(FQuery.Fields[0].AsFloat-Average);
279+ Count:=Count+1;
280+ FQuery.Next;
281+ end;
282+ // 3. 次に、平均「二乗差」を計算し、平方根を取得する。
283+ if Count>0 then // 0での除算を防ぐ
284+ SalaryGrid.Cells[3,3]:=FloatToStr(Sqrt(DifferencesSquared/Count))
285+ else
286+ SalaryGrid.Cells[3,3]:='No data';
287+ end;
288+ FQuery.Close;
289+```
290+
291+空のデータ(および0での除算など)を避けるために*FQuery.EOF*を用いていることに注意すること。このループがそのやり方を示している: Note that we use *FQuery.EOF* to check for empty data (and avoid division by zero errors etc). The loop shows how to:
292+
293+- データベースの値を変数に代入する
294+- 次のレコードに移動するため*FQuery.Next* を実行
295+- クエリデータセットが最後のレコードに達したことを適切にチェックし、データ取得を停止する
296+
297+結果の画面は以下のようになるだろう - 十進のコンマが用いられていることに気をつけられたい - コンピューターのロケールによってはこれが現れるかもしれない:
298+
299+<figure>
300+<img src="sqldbtutorial3mainform.png" title="sqldbtutorial3mainform.png" />
301+<figcaption>sqldbtutorial3mainform.png</figcaption>
302+</figure>
303+
304+### 最低/最高給与を取得する
305+
306+*このセクションでは、SQL についてさらに役立つ詳細を説明するが、チュートリアルの残りの部分まで作業する必要はない*
307+
308+これで、さまざまなデータベース接続の検出に対処する方法がわかったので、最低給与と最高給与を取得する SQL を調整して、データベース固有の機能を利用できるようになる。
309+
310+一例として: これは、返される行の数を最初の行のみに制限することで、MS SQL Server で機能するだろう:
311+
312+``` SQL
313+select top 1
314+e.first_name, e.last_name, e.salary
315+from employee e
316+order by e.salary asc
317+```
318+
319+最低給与を求めるために。
320+
321+これにより効率的に 1 つのレコードが返される。 他のデータベースでは、ISO ROWS 1 などの他の構文が使用される。勤勉な SQL の学習者は、その重要な部分を見逃して、必要な 1 つのレコードだけのために大きなレコードセット全体を要求しないことをすぐに気づくだろう!。
322+
323+同じことを達成するための、知っておく価値のある他の方法を簡単に検討してみよう。
324+
325+最低給与のレコードを取得する別の方法は次ようになるだろう:
326+
327+``` SQL
328+SELECT e.first_name, e.last_name, e.salary FROM employee e WHERE e.salary=(SELECT min(salary) FROM employee)
329+```
330+
331+SQL を学ぶものは、Common Table Expressionを研究することで大きな利益を得られるだろう。
332+
333+CTE を使用すると、次の式で仮想一時テーブルを使用できるようになり、他の方法では不可能な非常に複雑なクエリを明確にコーディングできるようになる。 CTE について知っていれば、それを聞いたことのない同僚よりも先を行くことができる。 たとえば、上記は次のように書き換えることができる (Microsoft SQL Server 構文の例):
334+
335+``` SQL
336+WITH TheMinimum as
337+(
338+ SELECT min(salary) as MinimumPay FROM Employee
339+)
340+SELECT e.first_name, e.last_name, e.salary FROM Employee e WHERE e.salary=(SELECT MinimumPay FROM TheMinimum)
341+```
342+
343+このような一時テーブルをいくつか連結させて、それぞれが前のテーブルの結果を使用することができる。 JOIN を使用してレコードセットをリンクすると、これらの仮想テーブルをデータベース内の実際のテーブルであるかのように扱うことができる。 また、ハードコードされたデータを使用した簡単なテストに非常に役立つ。これはデータベース接続なしで実行できる:
344+
345+``` SQL
346+WITH TestEmployee as
347+(
348+ SELECT 'Fred' as first_name, 'Bloggs' as last_name, 10500 as salary
349+ UNION
350+ SELECT 'Joe' as first_name, 'Public' as last_name, 10000 as salary
351+ UNION
352+ SELECT 'Mike' as first_name, 'Mouse' as last_name, 11000 as salary
353+),
354+ TheMinimum as
355+(
356+ SELECT min(salary) as MinimumPay FROM TestEmployee
357+)
358+SELECT e.first_name, e.last_name, e.salary FROM TestEmployee e WHERE e.salary=(SELECT MinimumPay FROM TheMinimum)
359+```
360+
361+このような SQL クエリのコードは非常に長い文字列になる可能性があるが、それは 1つのクエリにすぎず、単純な*1 つの*式に限定されているどこからでも呼び出すことができます。関数やストアドプロシージャに頼ることなく、複雑なクエリに答えるのに役立つ。
362+
363+## 通常のコントロールからデータベースへデータを取得する
364+
365+これまでに以下を見てきた:
366+
367+- データ バインド コントロールを使用して SQLDB にデータベースを更新させる方法 (以前のチュートリアル)
368+- クエリを使用してデータベースからデータを取得する方法 (上記のセクション)
369+
370+SQL を実行して、コード経由で任意のデータをデータベースに戻すこともできる。 これにより、多少のコーディングを犠牲にして、データベースに対応するスライダーやカスタム コントロールなどのデータベース対応のない変数やコントロールを使用してデータベースにデータを入力できるようになる。
371+
372+例として、ユーザーが stringgrid 内の最低給与と最高給与を変更できるようにする。
373+
374+編集を容易にするために、グリッドの *Options*/*goEditing* を true に設定する。 次に、以下のプロシージャをグリッドの OnValidate イベントに割り当てる。このイベントは、ユーザーがグリッドの更新を完了するたびに呼び出される。
375+
376+### パラメータクエリ
377+
378+次のコードは、パラメーター化されたクエリを使用して SQL インジェクション、文字列値の引用符の調整、日付の書式設定などを回避する方法も示している。
379+
380+コードにあるように、パラメーターに任意の名前を付けて、SQL 内で先頭に : を付けることができる。その値を*\<somequery\>.Params.ParamByName('\<thename\>').As'\<variabletype\>';で設定、取得できる。コードでは*.AsFloat*and*.AsString''を示す。
381+
382+パラメーター化されたクエリは、同じクエリを異なるパラメーターのみを使用してループ内で実行する場合に特に便利である (データの一括読み込みなどを考えてみてほしい)。
383+
384+例を続ける:クエリ SQL とパラメータを設定した後、通常どおりトランザクションが開始され (その後コミットされ)、その後、*ExecSQL* を呼び出してクエリが実行される (結果セットは返されない。SQL ステートメントがデータを返す SELECT または INSERT...RETURNING である場合は、上記の例のように *Open* を使用する):
385+
386+``` pascal
387+procedure TForm1.SalaryGridValidateEntry(sender: TObject; aCol, aRow: Integer;
388+ const OldValue: string; var NewValue: String);
389+begin
390+ // 最低、最高給与を持つセルのみ:
391+ if (aCol=3) and ((aRow=1) or (aRow=2)) then
392+ begin
393+ // もし正の数値データが入力された場合、最低、最高給与を更新することを可能にする
394+ if StrToFloatDef(NewValue,-1)>0 then
395+ begin
396+ // 主キーを次のように保存する。 グリッド内の非表示のセルとそれを使用します。
397+ // 更新クエリの方がクリーンだが、難しい方法でも実行できます:
398+ FQuery.SQL.Text:='update employee set salary=:newsalary '+
399+ ' where first_name=:firstname and last_name=:lastname and salary=:salary ';
400+ FQuery.Params.ParamByName('newsalary').AsFloat:=StrToFloatDef(NewValue,0);
401+ FQuery.Params.ParamByName('firstname').AsString:=SalaryGrid.Cells[1,aRow];
402+ FQuery.Params.ParamByName('lastname').AsString:=SalaryGrid.Cells[2,aRow];
403+ FQuery.Params.ParamByName('salary').AsFloat:=StrToFloatDef(OldValue,0);
404+ FTran.StartTransaction;
405+ FQuery.ExecSQL;
406+ FTran.Commit;
407+ LoadSalaryGrid; //標準偏差を再び読み込み
408+ end
409+ else
410+ begin
411+ // その入力が誤っていることを伝える... さもないと迷わせることになる:
412+ Showmessage('Invalid salary entered.');
413+ NewValue:=OldValue;
414+ end;
415+ end
416+ else
417+ begin
418+ // 他のセルの編集を隠蔽して廃棄する
419+ NewValue:=OldValue;
420+ end;
421+end;
422+```
423+
424+データベース エラーを適切に捕捉して適切なエラー メッセージを表示するために、このコードに try..except ブロックを追加するのを忘れていることに注意すること。 このチュートリアルで Firebird サンプル EMPLOYEE データベースを実行している場合は、給与を非常に低い値 (たとえば 1) に変更して、何が起こるかを確認されたい。
425+
426+最後に、この例では UPDATE SQL クエリを示したが、INSERT クエリを実行してプログラムで新しいデータを挿入することもできる。 また、テーブル/ビュー/プロシージャ名ではなく、フィールドにパラメータを使用する限り、あらゆる種類の SQL クエリ (SELECT、UPDATE など) でパラメータを使用できる。
427+
428+## まとめ
429+
430+このチュートリアルでは次のように説明した。
431+
432+- 複数のデータベースタイプをコード化する方法
433+- ログインフォームを使用してプログラムからデータベースアクセス構成を分離する方法
434+- プログラムでデータを取得および更新する方法
435+
436+## コード
437+
438+2012 年 11 月以降、コードは \$(lazarusdir)examples/database/sqldbtutorial3 にある。
439+
440+If you have an older version (e.g. Lazarus 1.0.2), you can also download the code via [the Lazarus SVN website](http://svn.freepascal.org/svn/lazarus/trunk/examples/database/sqldbtutorial3/)
441+
442+## 関連情報
443+
444+- [[SQLdb Tutorial1/ja]]: DB チュートリアルの第一の部分。データベースのデータを、どのように grid に表示させるかを学びます。
445+- [[SQLdb Tutorial2/ja]]: DB チュートリアルの第二の部分。データベースのデータの挿入や編集について学びます。
446+- [[SQLdb Tutorial3/ja]]: DB チュートリアルの第三の部分。複数のデータベースについてのプログラムやログインフォームの使い方を学びます。
447+- [[SQLdb Tutorial4/ja]]: DB チュートリアルの第四の部分。どのようにデータモジュールを用いるかを学びます。
448+- [[Lazarus Database Overview/ja]]: Lazarus がサポートしているデータベースについての情報。 データベースごとの記述へのリンクを含みます。
449+- [[SQLdb Package/ja]]: SQLdb パッケージについての情報
450+- [[SQLdb Programming Reference/ja]]: SQLdb データベースコンポーネントの入出力の概要
451+- [[SqlDBHowto/ja]]: SQLdb パッケージを用いることについての情報
452+- [[Working With TSQLQuery/ja]]: TSQLQuery についての情報
453+
454+---
455+*From the Free Pascal wiki, page "SQLdb Tutorial3/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).*

Back to history