Sign in Join
Wiki copytemporary

SQLdb Tutorial3/ja: what changed

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

OldNewLine
11## 概要
22
33このチュートリアルでは、次の方法を学ぶ
44
55- ログインフォームの使用など、アプリケーションを複数のデータベースに適したものにする
66- データベース データを (データベース コントロールではなく) 通常のコントロールに取得する
77- コントロールからデータを取得してデータベースに戻す
88- パラメータ化されたクエリを実行する。
99
1010## マルチデータベースのサポート
1111
1212任意のデータベースとログイン フォームを使用して、SQLDB がサポートする複数の異なるデータベース サーバー/組み込みライブラリをサポートできる。
1313
1414利点:
1515
1616- ユーザー/プログラマは、任意の sqldb t*connection を動的に使用できるため、データベースを選択できる。
1717
1818短所:
1919
2020- より複雑な SQL をさらに調整する必要がある可能性がある。 各データベースには独自の方言がある。 もちろん、データベース固有の SQL を呼び出すことも可能だが、これはメンテナンスの問題に発展する可能性がある。
2121- T*connection 固有のプロパティ (Firebird 方言を設定するための *TIBConnection.Dialect* など) は使用できない。
2222
2323マルチデータベース サポートを使用するには、*TIBConnection* などの特定の T*Connection の代わりに、*TSQLConnector* (*TSQLConnection* ではない) を使用する。これにより、(プログラムの実行中に) 特定の T*Connection が動的に選択される。 *ConnectorType*プロパティに基づいてT*Connectionを使用する:
2424
2525``` pascal
2626uses
2727...
2828var
2929 Conn: TSQLConnector;
3030begin
3131 Conn:=TSQLConnector.Create(nil);
3232 try
3333 // ...実際のコネクタのタイプはこのプロパティによって決まる。
3434 // ChosenConfig.DBType 文字列が一致することを確認する
3535 // コネクタのタイプ (例:
3636 // そのコネクタの T*ConnectionDef.TypeName 。
3737 Conn.ConnectorType:=ChosenConfig.DBType;
3838 // 残りは通常通り:
3939 Conn.HostName:='DBSERVER';
4040 Conn.DatabaseName:='bigdatabase.fdb';
4141 Conn.UserName:='SYSDBA';
4242 Conn.Password:='masterkey';
4343 try
4444 Conn.Open;
4545```
4646
4747## ログインフォーム
4848
4949[[SQLdb Tutorial1/ja]] で説明したように、ユーザーはアプリケーションにハードコードされた資格情報を使用するのではなく、フォーム (または安全に保存されている構成ファイル) を使用してデータベースにログインする必要がある。 セキュリティ上の考慮事項に加えて、データベース サーバーの情報が変更されるたびにアプリケーションを再コンパイルしなければならないのは、あまり良い考えではない。
5050
5151*dbconfiggui.pas* では、ini ファイルが存在する場合はそこからデフォルト値を取得するログイン フォームをセットアップする。 これにより、エンタープライズ展開、いくつかの詳細 (データベース サーバ、データベース名) を入力してデフォルトの接続を設定できる。 このフォームでは、ユーザーは自分のユーザー名/パスワードを追加/編集し、次に進む前に接続をテストできる。
5252
53-<figure>
54-<img src="dbloginform.png" title="dbloginform.png" />
55-<figcaption>dbloginform.png</figcaption>
56-</figure>
53+![](/wiki-images/b/b2/Dbloginform.png)
5754
5855*TDBConnectionConfig* クラスを持つ別の dbconfig.pas ユニットを使用して、選択した接続の詳細を保存します。 このクラスは、ini ファイルからのデフォルト設定の読み取りをサポートしています。
5956
6057これにより、GUI ログイン フォームなしでの使用 (例: 無人/バッチ操作の実行時) が可能になり、たとえば、Web サイトでの再利用が可能になる。
6158
6259この*TDBConnectionConfig*クラスはログイン フォームに*Config*プロパティとして表示されるため、メイン プログラムは設定フォームをモーダルに表示し、ユーザーによる \[OK\] クリックを検出して、フォーム設定を閉じる前に選択した設定を取得できる。
6360
6461### 接続テストコールバック関数
6562
6663ログイン フォームを柔軟に保つために (Zeos などの他のデータベース層で使用できる)、テスト セクションをコールバック関数として実装し、メイン プログラムで処理させる。
6764
6865*dbconfiggui.pas* のログイン フォームの定義:
6966
7067``` pascal
7168type
7269 TConnectionTestFunction = function(ChosenConfig: TDBConnectionConfig): オブジェクトのブール値。
7370```
7471
7572メイン フォームは、構成フォームからのテスト リクエストを処理するために、この定義に一致する関数を実装する必要がある。
7673
7774コールバック関数は、構成フォームによって渡された構成オブジェクトを受け取り、それを使用して、選択されたデータベース タイプとの接続を構築する。 その後、単純にサーバーへの接続を試行する。 成功した場合は関数の結果を true に設定し、そうでない場合は結果は false のままとなる。
7875
7976存在しないサーバーへのデータベース接続の試行は長いタイムアウトになる可能性があるため、カーソルを砂時計アイコンに設定して待機する必要があることをユーザーに示す。
8077
8178``` pascal
8279uses
8380...
8481dbconfig, dbconfiggui
8582...
8683procedure TForm1.FormCreate(Sender: TObject);
8784 LoginForm:=TDBConfigForm.Create(self);
8885 try
8986 // dbconfigguiのテストボタンはこのプロシージャにリンクされるだろう
9087 //ここで...これが''dbconfiggui.pas''の コールバックをConnectionTest functionにリンクさせる...
9188 LoginForm.ConnectionTestCallback:=@ConnectionTest;
9289...
9390function TForm1.ConnectionTest(ChosenConfig: TDBConnectionConfig): boolean;
9491// コネクションを確かめるためにdbconfigguiの情報を使うコールバック関数
9592// 確かめるために結果をdbconfigguiへ返す
9693var
9794 // 通常のデータベース接続...
9895 Conn: TSQLConnector;
9996begin
10097 result:=false;
10198 Conn:=TSQLConnector.Create(nil);
10299 Screen.Cursor:=crHourglass;
103100 try
104101 // ...このプロパティで決定される実際の接続タイプ。
105102 // ChosenConfig.DBType文字列がマッチすることを確かめること
106103 // コネクタタイプ(例えば、このコネクタにたいする
107104 // T*ConnectionDef.TypeNameをみること
108105 Conn.ConnectorType:=ChosenConfig.DBType;
109106 Conn.HostName:=ChosenConfig.DBHost;
110107 Conn.DatabaseName:=ChosenConfig.DBPath;
111108 Conn.UserName:=ChosenConfig.DBUser;
112109 Conn.Password:=ChosenConfig.DBPassword;
113110 try
114111 Conn.Open;
115112 result:=Conn.Connected;
116113 except
117114 // 結果はすでにfalse
118115 end;
119116 Conn.Close;
120117 finally
121118 Screen.Cursor:=crDefault;
122119 Conn.Free;
123120 end;
124121end;
125122```
126123
127124最後に、実際にコールバックを呼び出す *dbconfiggui.pas* 内のコードが \[テスト\] ボタンにリンクされます。 (クラッシュを避けるために) コールバック関数が割り当てられているかどうかをテストする。完全を期すために、有効な構成オブジェクトがあるかどうかもチェックし、単純にコールバック関数を呼び出す。
128125
129126``` pascal
130127...
131128TDBConfigForm = class(TForm)
132129...
133130 private
134131 FConnectionTestFunction: TConnectionTestFunction;
135132 public
136133 property ConnectionTestCallback: TConnectionTestFunction write FConnectionTestFunction;
137134...
138135procedure TDBConfigForm.TestButtonClick(Sender: TObject);
139136begin
140137 // 設定を持つコールバックを呼び出す、接続が
141138 // 成功したことを明らかにし、テスト結果を返す
142139 if assigned(FConnectionTestFunction) and assigned(FConnectionConfig) then
143140 if FConnectionTestFunction(FConnectionConfig) then
144141 showmessage('Connection test succeeded.')
145142 else
146143 showmessage('Connection test failed.')
147144 else
148145 showmessage('Error: connection test code has not been implemented.');
149146end;
150147```
151148
152149### 追加・修正
153150
154151ログインフォームの可能な追加/変更:
155152
156153- dbconfig のコマンド ライン引数処理を追加して適切なデフォルトをプリロードし、プログラムをバッチ スクリプトやショートカットなどで使用できるようにする。
157154- ログインフォームに「プロファイルの選択」コンボボックスを追加する。 ini ファイル内でデータベースの種類と接続の詳細を指定する複数のプロファイルを使用する。
158155- 1 つのデータベース タイプのみがサポートされている場合は、データベース タイプ コンボボックスを非表示にする。
159156- 組み込みデータベースが選択されていることが確実な場合は、ユーザー名とパスワードを非表示にする。
160157- MS SQL Server コネクタを使用したポート番号またはインスタンス名の指定のサポートを追加。
161158- 信頼できる認証をサポートするデータベース (Firebird、MS SQL) にサポートを追加: ユーザー名/パスワードの制御を無効にする
162159- 組み込みデータベースを選択したがファイルが存在しない場合: 確認要求を表示し、データベースを作成する
163160- コマンドライン アプリケーション用にログイン フォームのコマンドライン/TUI バージョンを作成する(たとえば、curses ライブラリを使用)
164161
165162この記事やコードの更新は大歓迎する。
166163
167164## データベース データを通常のコントロールに取り込む
168165
169166> **Note:** このセクションを開始する前に、[[SQLdb Tutorial0/ja|チュートリアル0の必要条件]] で指定されているようにサンプル従業員データベースが設定されていることを確認されたい。
170167
171168前のチュートリアルでは、データ バインド コントロールについて説明した。[[TDBGrid]] などの特別なコントロールは、そのコンテンツを [[TDataSource]] にバインドし、そのソースから更新を取得し、ユーザーの編集内容を送り返すことができる。
172169
173170プログラム的にデータベースの内容を取得し、その内容を任意の種類のコントロール (または変数) に入力することも可能である。 例として、サンプル従業員データベース テーブルの給与明細を stringgrid に入力する方法を見ていく。
174171
175172メイン フォームで [[TStringGrid]] を追加し、(例えば、*OnCreate* イベントで呼び出されるプロシージャ *LoadSalaryGrid* 経由で)データを取得する 。
176173
177174``` pascal
178175 // データベースから取得
179176 try
180177 if not FConn.Connected then
181178 FConn.Open;
182179 if not FConn.Connected then
183180 begin
184181 ShowMessage('Error connecting to the database. Aborting data loading.');
185182 exit;
186183 end;
187184
188185 // 最低賃金
189186 // 注意: ここで1行だけ取得したいが、SQLは様々なデータベースシステムで異なる
190187 // 後にチュートリアルで、データベースに依存したSQLを扱うが、ここではMS SQL:
191188 // のMS SQL: 'select top 1 '...を用いておく
192189 FQuery.SQL.Text:='select ' +
193190 ' e.first_name, ' +
194191 ' e.last_name, ' +
195192 ' e.salary ' +
196193 'from employee e ' +
197194 'order by e.salary asc ';
198195 // ISO SQL+Firebird SQL: では
199196 //'rows 1 '; をここと以下に加えること。PostgreSQLでは動作しないが
200197 FTran.StartTransaction;
201198 FQuery.Open;
202199 SalaryGrid.Cells[1,1]:=FQuery.Fields[0].AsString; // i.e. Cells[Col,Row]
203200 SalaryGrid.Cells[2,1]:=FQuery.Fields[1].AsString;
204201 SalaryGrid.Cells[3,1]:=FQuery.Fields[2].AsString;
205202 FQuery.Close;
206203 // 読み込むときでも、常にコミット(retain)すること
207204 // これは読み直したときに他者によって更新することを可能にする
208205 FTran.Commit;
209206...
210207 end;
211208 except
212209 on D: EDatabaseError do
213210 begin
214211 FTran.Rollback;
215212 MessageDlg('Error', 'A database error has occurred. Technical error message: ' +
216213 D.Message, mtError, [mbOK], 0);
217214 end;
218215 end;
219216```
220217
221218注意すべき点: try..except を使用してデータベース エラーを検出する。 エラーが発生した場合にトランザクションをロールバックするのを忘れていることがわかるが、これは読者の演習として残されている。
222219
223220クエリ オブジェクトを *Open* し、それによって *FQuery* に *SQL* ステートメントを介してデータベースにクエリを実行するよう命ずる。 これが完了すると、データの最初の行が表示される。 私たちは単にデータが存在すると仮定する。 これは実際にはプログラミング エラーである。*FQuery.EOF* が true (または *FQuery.RecordCount* が \>0) であるかどうかを確認する方がよりまともだ。
224221
225222次に、結果の最初の行からデータを取得する。 次の行に移動したい場合は、*FQuery.Next* を使用するが、ここではその必要はない。 結果を stringgrid に入力し、リスト内の最低給与を示す。 最高の給与についても同様のアプローチがとれる。
226223
227224上で述べたように、さまざまなデータベースがさまざまなバージョンの SQL をサポートしている(公式 ISO SQL 標準に加えて、またはこれに反して)。 幸いなことに、最終的に使用する DB に基づいてアプリケーションをカスタマイズできる。これは、従業員の給与の標準偏差を取得することで示される、例えば、PostgreSQL SQL では組み込みだが、例えば、Firebirdではデフォルトで利用できない。
228225
229226この、LoadSalaryGrid プロシージャではPostgreSQLのSQLを用い、コードを他の全てのデータベースに対して構築する。初めに、どのデータベースが読み込まれたか検知する。他の行に以下を加える:
230227
231228``` pascal
232229 ...
233230 SalaryGrid.Cells[3,2]:=FQuery.Fields[2].AsString;
234231 FQuery.Close;
235232 // たとえ読み取り時でも、常にトランザクションをコミット(retain)すること
236233 FTran.Commit;
237234//存在するコードの最後
238235
239236 if FConn.ConnectorType = 'PostGreSQL' then
240237 begin
241238 // PostgreSQLに対しては、それ固有の SQL 解決策:
242239 FQuery.SQL.Text:='select stddev_pop(salary) from employee ';
243240 FTran.StartTransaction;
244241 FQuery.Open;
245242 if not FQuery.EOF then
246243 SalaryGrid.Cells[3,3]:=FQuery.Fields[0].AsString;
247244 FQuery.Close;
248245 // たとえ読み取り時でも、常にトランザクションをコミット(retain)すること
249246 FTran.Commit;
250247 end
251248 else
252249 begin
253250 // 他のデータベースでは、このコードアプローチで:
254251 ....以下参照...
255252 end;
256253```
257254
258255*ConnectorType* の使用に注目すること。 使用される文字列は正確に一致する必要がある。 また、クエリからの空の結果も適切にチェックする (従業員テーブルが空の場合に発生する可能性がある)。
259256
260257... ここで標準偏差をサポートしない他のデータベースのための、コードベースの解決策を実装する:
261258
262259``` pascal
263260 // 他のデータベースでは、コードによるアプローチを行う:
264261 // 1. 値の平均を求める
265262 FQuery.SQL.Text:='select avg(salary) from employee ';
266263 FQuery.Open;
267264 if FQuery.EOF then
268265 SalaryGrid.Cells[3,3]:='No data'
269266 else
270267 begin
271268 Average:=FQuery.Fields[0].AsFloat;
272269 FQuery.Close;
273270 // 2. それぞれの値に対し、平均値の二乗をとり、加え合わせると
274271 FQuery.SQL.Text:='select salary from employee where salary is not null ';
275272 FQuery.Open;
276273 while not FQuery.EOF do
277274 begin
278275 DifferencesSquared:=DifferencesSquared+Sqr(FQuery.Fields[0].AsFloat-Average);
279276 Count:=Count+1;
280277 FQuery.Next;
281278 end;
282279 // 3. 次に、平均「二乗差」を計算し、平方根を取得する。
283280 if Count>0 then // 0での除算を防ぐ
284281 SalaryGrid.Cells[3,3]:=FloatToStr(Sqrt(DifferencesSquared/Count))
285282 else
286283 SalaryGrid.Cells[3,3]:='No data';
287284 end;
288285 FQuery.Close;
289286```
290287
291288空のデータ(および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:
292289
293290- データベースの値を変数に代入する
294291- 次のレコードに移動するため*FQuery.Next* を実行
295292- クエリデータセットが最後のレコードに達したことを適切にチェックし、データ取得を停止する
296293
297294結果の画面は以下のようになるだろう - 十進のコンマが用いられていることに気をつけられたい - コンピューターのロケールによってはこれが現れるかもしれない:
298295
299-<figure>
300-<img src="sqldbtutorial3mainform.png" title="sqldbtutorial3mainform.png" />
301-<figcaption>sqldbtutorial3mainform.png</figcaption>
302-</figure>
296+![](/wiki-images/6/6a/Sqldbtutorial3mainform.png)
303297
304298### 最低/最高給与を取得する
305299
306300*このセクションでは、SQL についてさらに役立つ詳細を説明するが、チュートリアルの残りの部分まで作業する必要はない*
307301
308302これで、さまざまなデータベース接続の検出に対処する方法がわかったので、最低給与と最高給与を取得する SQL を調整して、データベース固有の機能を利用できるようになる。
309303
310304一例として: これは、返される行の数を最初の行のみに制限することで、MS SQL Server で機能するだろう:
311305
312306``` SQL
313307select top 1
314308e.first_name, e.last_name, e.salary
315309from employee e
316310order by e.salary asc
317311```
318312
319313最低給与を求めるために。
320314
321315これにより効率的に 1 つのレコードが返される。 他のデータベースでは、ISO ROWS 1 などの他の構文が使用される。勤勉な SQL の学習者は、その重要な部分を見逃して、必要な 1 つのレコードだけのために大きなレコードセット全体を要求しないことをすぐに気づくだろう!。
322316
323317同じことを達成するための、知っておく価値のある他の方法を簡単に検討してみよう。
324318
325319最低給与のレコードを取得する別の方法は次ようになるだろう:
326320
327321``` SQL
328322SELECT e.first_name, e.last_name, e.salary FROM employee e WHERE e.salary=(SELECT min(salary) FROM employee)
329323```
330324
331325SQL を学ぶものは、Common Table Expressionを研究することで大きな利益を得られるだろう。
332326
333327CTE を使用すると、次の式で仮想一時テーブルを使用できるようになり、他の方法では不可能な非常に複雑なクエリを明確にコーディングできるようになる。 CTE について知っていれば、それを聞いたことのない同僚よりも先を行くことができる。 たとえば、上記は次のように書き換えることができる (Microsoft SQL Server 構文の例):
334328
335329``` SQL
336330WITH TheMinimum as
337331(
338332 SELECT min(salary) as MinimumPay FROM Employee
339333)
340334SELECT e.first_name, e.last_name, e.salary FROM Employee e WHERE e.salary=(SELECT MinimumPay FROM TheMinimum)
341335```
342336
343337このような一時テーブルをいくつか連結させて、それぞれが前のテーブルの結果を使用することができる。 JOIN を使用してレコードセットをリンクすると、これらの仮想テーブルをデータベース内の実際のテーブルであるかのように扱うことができる。 また、ハードコードされたデータを使用した簡単なテストに非常に役立つ。これはデータベース接続なしで実行できる:
344338
345339``` SQL
346340WITH TestEmployee as
347341(
348342 SELECT 'Fred' as first_name, 'Bloggs' as last_name, 10500 as salary
349343 UNION
350344 SELECT 'Joe' as first_name, 'Public' as last_name, 10000 as salary
351345 UNION
352346 SELECT 'Mike' as first_name, 'Mouse' as last_name, 11000 as salary
353347),
354348 TheMinimum as
355349(
356350 SELECT min(salary) as MinimumPay FROM TestEmployee
357351)
358352SELECT e.first_name, e.last_name, e.salary FROM TestEmployee e WHERE e.salary=(SELECT MinimumPay FROM TheMinimum)
359353```
360354
361355このような SQL クエリのコードは非常に長い文字列になる可能性があるが、それは 1つのクエリにすぎず、単純な*1 つの*式に限定されているどこからでも呼び出すことができます。関数やストアドプロシージャに頼ることなく、複雑なクエリに答えるのに役立つ。
362356
363357## 通常のコントロールからデータベースへデータを取得する
364358
365359これまでに以下を見てきた:
366360
367361- データ バインド コントロールを使用して SQLDB にデータベースを更新させる方法 (以前のチュートリアル)
368362- クエリを使用してデータベースからデータを取得する方法 (上記のセクション)
369363
370364SQL を実行して、コード経由で任意のデータをデータベースに戻すこともできる。 これにより、多少のコーディングを犠牲にして、データベースに対応するスライダーやカスタム コントロールなどのデータベース対応のない変数やコントロールを使用してデータベースにデータを入力できるようになる。
371365
372366例として、ユーザーが stringgrid 内の最低給与と最高給与を変更できるようにする。
373367
374368編集を容易にするために、グリッドの *Options*/*goEditing* を true に設定する。 次に、以下のプロシージャをグリッドの OnValidate イベントに割り当てる。このイベントは、ユーザーがグリッドの更新を完了するたびに呼び出される。
375369
376370### パラメータクエリ
377371
378372次のコードは、パラメーター化されたクエリを使用して SQL インジェクション、文字列値の引用符の調整、日付の書式設定などを回避する方法も示している。
379373
380374コードにあるように、パラメーターに任意の名前を付けて、SQL 内で先頭に : を付けることができる。その値を*\<somequery\>.Params.ParamByName('\<thename\>').As'\<variabletype\>';で設定、取得できる。コードでは*.AsFloat*and*.AsString''を示す。
381375
382376パラメーター化されたクエリは、同じクエリを異なるパラメーターのみを使用してループ内で実行する場合に特に便利である (データの一括読み込みなどを考えてみてほしい)。
383377
384378例を続ける:クエリ SQL とパラメータを設定した後、通常どおりトランザクションが開始され (その後コミットされ)、その後、*ExecSQL* を呼び出してクエリが実行される (結果セットは返されない。SQL ステートメントがデータを返す SELECT または INSERT...RETURNING である場合は、上記の例のように *Open* を使用する):
385379
386380``` pascal
387381procedure TForm1.SalaryGridValidateEntry(sender: TObject; aCol, aRow: Integer;
388382 const OldValue: string; var NewValue: String);
389383begin
390384 // 最低、最高給与を持つセルのみ:
391385 if (aCol=3) and ((aRow=1) or (aRow=2)) then
392386 begin
393387 // もし正の数値データが入力された場合、最低、最高給与を更新することを可能にする
394388 if StrToFloatDef(NewValue,-1)>0 then
395389 begin
396390 // 主キーを次のように保存する。 グリッド内の非表示のセルとそれを使用します。
397391 // 更新クエリの方がクリーンだが、難しい方法でも実行できます:
398392 FQuery.SQL.Text:='update employee set salary=:newsalary '+
399393 ' where first_name=:firstname and last_name=:lastname and salary=:salary ';
400394 FQuery.Params.ParamByName('newsalary').AsFloat:=StrToFloatDef(NewValue,0);
401395 FQuery.Params.ParamByName('firstname').AsString:=SalaryGrid.Cells[1,aRow];
402396 FQuery.Params.ParamByName('lastname').AsString:=SalaryGrid.Cells[2,aRow];
403397 FQuery.Params.ParamByName('salary').AsFloat:=StrToFloatDef(OldValue,0);
404398 FTran.StartTransaction;
405399 FQuery.ExecSQL;
406400 FTran.Commit;
407401 LoadSalaryGrid; //標準偏差を再び読み込み
408402 end
409403 else
410404 begin
411405 // その入力が誤っていることを伝える... さもないと迷わせることになる:
412406 Showmessage('Invalid salary entered.');
413407 NewValue:=OldValue;
414408 end;
415409 end
416410 else
417411 begin
418412 // 他のセルの編集を隠蔽して廃棄する
419413 NewValue:=OldValue;
420414 end;
421415end;
422416```
423417
424418データベース エラーを適切に捕捉して適切なエラー メッセージを表示するために、このコードに try..except ブロックを追加するのを忘れていることに注意すること。 このチュートリアルで Firebird サンプル EMPLOYEE データベースを実行している場合は、給与を非常に低い値 (たとえば 1) に変更して、何が起こるかを確認されたい。
425419
426420最後に、この例では UPDATE SQL クエリを示したが、INSERT クエリを実行してプログラムで新しいデータを挿入することもできる。 また、テーブル/ビュー/プロシージャ名ではなく、フィールドにパラメータを使用する限り、あらゆる種類の SQL クエリ (SELECT、UPDATE など) でパラメータを使用できる。
427421
428422## まとめ
429423
430424このチュートリアルでは次のように説明した。
431425
432426- 複数のデータベースタイプをコード化する方法
433427- ログインフォームを使用してプログラムからデータベースアクセス構成を分離する方法
434428- プログラムでデータを取得および更新する方法
435429
436430## コード
437431
4384322012 年 11 月以降、コードは \$(lazarusdir)examples/database/sqldbtutorial3 にある。
439433
440434If 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/)
441435
442436## 関連情報
443437
444438- [[SQLdb Tutorial1/ja]]: DB チュートリアルの第一の部分。データベースのデータを、どのように grid に表示させるかを学びます。
445439- [[SQLdb Tutorial2/ja]]: DB チュートリアルの第二の部分。データベースのデータの挿入や編集について学びます。
446440- [[SQLdb Tutorial3/ja]]: DB チュートリアルの第三の部分。複数のデータベースについてのプログラムやログインフォームの使い方を学びます。
447441- [[SQLdb Tutorial4/ja]]: DB チュートリアルの第四の部分。どのようにデータモジュールを用いるかを学びます。
448442- [[Lazarus Database Overview/ja]]: Lazarus がサポートしているデータベースについての情報。 データベースごとの記述へのリンクを含みます。
449443- [[SQLdb Package/ja]]: SQLdb パッケージについての情報
450444- [[SQLdb Programming Reference/ja]]: SQLdb データベースコンポーネントの入出力の概要
451445- [[SqlDBHowto/ja]]: SQLdb パッケージを用いることについての情報
452446- [[Working With TSQLQuery/ja]]: TSQLQuery についての情報
453447
454448---
455449*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