SQLdb Tutorial1/ja

From Free Pascal wiki
Jump to navigationJump to search

Deutsch (de) English (en) español (es) français (fr) 日本語 (ja) 中文(中国大陆)‎ (zh_CN)

データベースのポータル

参照:

チュートリアル/練習となる記事:

各種データベース

Advantage - MySQL - MSSQL - Postgres - Interbase - Firebird - Oracle - ODBC - Paradox - SQLite - dBASE - MS Access - Zeos

概要

このチュートリアルでは、SQLdb Package に基づいた実用的なコード例を使用してデータベースをプログラミングする方法を示す。 主に初心者を対象としている。データベースと SQL の基本を探している人は、関連する書籍やドキュメントを読む必要がある。 このチュートリアルでは、サンプル データベースemployee.fdbとともにFirebirdを使用する。他のデータベースも使用できる。本文に記載されているように、いくつかの調整を行う必要がある。

このチュートリアルは長く見えるかもしれないが、ほとんどの場合、入力する内容を入力する必要がある理由を説明する大量のテキストだけである。最後に見られるように、アプリケーションを動作させるために必要な実際のコードの量はそれほど多くはない。経験豊富な開発者であれば、説明をざっと読んで、何が起こっているのかをすぐに理解できるだろう。 また、Basic example章の最後で停止して、動作するプログラムを作成することもできる。

このチュートリアルは、Swen による ドイツ語チュートリアル に基づいているが、特に Basic example 以降は拡張されている。Swen はドイツ語版を現状のままにしておきたいと考えている。これが問題となる場合は、このバージョンの名前を変更し、それに基づいて新しいドイツ語訳を作成することができる。

スウェンより: JoostとMichaelに感謝。 彼らの助けがなければ、このチュートリアルはおそらく決して実現しなかっただろう。

必要事項

このチュートリアルは、最近の Lazarus(Laz 1.0) を使い作成されている; また、より古いバージョンの Lazarus 0.9.30 でも動くだろう。

また、事前に SQLdb_Tutorial0 を読み、サンプルのデータベースを生成のこと。

Basic example

プロジェクトとコンポーネント

TSQLTransaction、および 1 つの TSQLQuery コンポーネントが必要である。

sqldbcomponents-n.png

TIBConnection は、Interbase/Firebird 固有の接続コンポーネントである。 別のデータベースを使用している場合は、SQLdb tub の適切なコンポーネントを置き換える。 SQLite データベースの場合は 'TSQLite3Connection/ja'、PostgreSQL データベースの場合は TPQConnection。 データベース アクセス ライブラリのセットアップに関する説明は、このチュートリアルの範囲外である。そのためにDatabases/jaを参照のこと。 。

フォーム上の TIBConnection/ja (または同等の接続コンポーネント) をクリックし、オブジェクトインスペクタで名前を DBConnection に変更する。 これにより、別のデータベースを使用する場合のチュートリアルの残りの部分がを簡素にできる。 また、一般に、コンポーネントにプログラム内で役立つ名前 (MainframeDBConnection など) を付けて、それが何を表しているのかわかるようにすることを勧める。

他の2つのコンポーネント TSQLTransaction/jaTSQLQuery/ja は、SQLdb でサポートされるすべてのデータベースに使用できる。

データを表示するには、TDBGrid/ja コンポーネントを使用する。このコンポーネントは、'Data Controls' タブにある。このコンポーネントをデータベースコンポーネントに接続するには、'Data Access tab' の TDataSource/ja コンポーネントが必要である。

これで、最初の例に必要なデータベース コンポーネントがすべて揃った。TDBGrid を拡大して、すべてのデータを表示するのに十分なスペースを確保できる。

コンポーネントをリンクする

次に、コンポーネントを接続する必要があります。 非常に簡単な方法はオブジェクトインスペクタを使用することだが、これをソースコード内で実行することもできる。

DBConnection の Transaction プロパティを 'SQLTransaction1' に変更する。 これにより、SQLTransaction1 の Database プロパティが自動的に 'DBConnection' に変更される。

次に、SQLQuery1 の Database プロパティを 'DBConnection' に変更する。Lazarus は、「トランザクション」プロパティの値を自動的に追加する。

次に、Datasource1 の Dataset プロパティを 'SQLQuery1' に変更する。

最後に、DBGrid1 の Datasource プロパティを 'Datasource1' に変更する。

これで、デフォルトのトランザクションをトランザクション コンポーネントにリンクする接続が完成した。 トランザクションコンポーネントは、そのデータベース プロパティを接続オブジェクトにリンクする。 これら 2 つのコンポーネントは、接続して命令を実行するには十分ですが、クエリを表示するには十分ではない。 このために、データベースを指す(およびそのデフォルトのトランザクションにリンクする) SQLQuery コンポーネントが使用される。SQLQuery を使用して、後でデータを取得し、データベースにポストバックする。

最後に、クエリコンポーネントにリンクされているデータソースコンポーネントは、一種のプレースホルダーです。 クエリデータセット内のどこにいるかを追跡し、GUI コンポーネントがそれにリンクされているため、すべてが同じレコードを表示する。

これが意味不明であっても、絶望しないこと。もう少し作業を加えるだけで、最初のデータを表示できるようになる。

データベースに接続する

データベースのデータを画面に表示するにはどうするか?

まず、DBConnection に、employee.fdb データベースがどこにあるかを伝える必要がある。そのデータベースの場所はオペレーティング システムによって異なる。次のような場所である:

  • .../examples/empbuild/ Linux 上の Firebird インストールのサブディレクトリ
  • Windows マシンの場合は C:\Program Files\Firebird\Firebird_2_5\examples\empbuild\EMPLOYEE.FDB
  • Firebird 埋め込みを使用する場合、ファイルはプロジェクト ディレクトリにある必要がある

ここでも選択が可能だ: オブジェクトインスペクタを使用してパスを割り当てるか、ソースコードで直接行うことができる。

オブジェクトインスペクタを使用することを選択する。DBConnection の「HostName」プロパティを Firebird サーバ名または IP アドレスに設定する。 Firebird サーバが開発マシンで実行されている場合は、localhost を使用します。 埋め込み Firebird クライアントを使用する場合は、空白の値を使用する。 DBConnection の DatabaseName プロパティを、データベース サーバ上のemployee.fdb ファイルへのパスに変更します。埋め込み Firebird を使用する場合、パス部分は空にし、ファイル名のみを指定する必要がある。

データベースサーバはデータへのアクセスを許可する前に、ユーザー名とパスワードによる承認をチェックします。本格的なデータベース アプリケーションは、アプリケーションの起動時に両方の値をユーザーに要求し、接続時にこれらをサーバに送信する。これを行う可能な方法は SQLdb Tutorial3 に示されている。

ただし、今のところ、問題を単純化するために、オブジェクトインスペクタを再度使用してこれらをハードコーディングします。「UserName」プロパティを「SYSDBA」に変更し、「Password」を「masterkey」に変更する(もちろん、データベースのインストールに別のユーザー名/パスワードがある場合は調整のこと)。

ここで、これまでの設定がすべて正しいかどうかを確認する。「Connected」プロパティを「True」に設定します。 データベースのパスが正しくない場合、またはユーザー名またはパスワードが間違っている場合は、エラーメッセージが表示される。接続が成功した場合は、ここで切断する必要があります (「Connected」を「False」に設定する)。

PostgreSQL

PostgreSQL の状況は Firebird の状況と非常に似ている。データベース名にはパスがない。名前の部分 (例: 「employee」) を指定するだけである。 PostgreSQL には埋め込みモードがないため、接続テストを機能させるには「HostName」プロパティを入力する必要がある。

SQLite

SQLite の場合、「HostName」、「UserName」、および「Password」プロパティを空のままにすることができます。 「DatabaseName」を SQLite ファイルの名前に設定します。従業員.sqlite。注: sqlite は、指定されたデータベースが存在しない場合にそれを作成するため、ここでは注意のこと。

次のスクリーンショットのようなものが表示されるはずだ - todo: このスクリーンショットは実際にはさらに進んでおり、現在はボタンだけがある。

Form and components set up

DBGrid のプロパティ「Options」→「dgDisplayMemoText」を「(True)」に変更する。 それ以外の場合は、すべてのデータ フィールドに (MEMO) が表示される。

表示するデータの選択

接続は成功したが、データが表示されなかった。 理由は簡単である。 どのデータを返すかをデータベース サーバに伝えていない。employee.fdb データベースにはいくつかのテーブルが含まれており、確認したいテーブルを Firebird に伝えていない。 データベースの構造がわからない場合は、FlameRobin などのツールを使用して内容を表示できる。 Lazarus はそのようなツール、DataDesktop も提供する。 これは、Lazarus の /tools/lazdatadesktop/ サブディレクトリにある。 プロジェクトを保存し、プロジェクト lazdatadesktop.lpi を開いてコンパイルする。

DataDesktopが起動したときの様子

例に戻る。

テーブル「CUSTOMER」のすべてのデータを表示したいと考えている。 そのための SQL 命令は次のとおりである。

select * from CUSTOMER

このコマンドを SQLQuery1 の 'SQL' プロパティに割り当てる必要がある。 私たちのプロジェクトのソースコードでは、これは次のようになる。

SQLQuery1.SQL.Text := 'select * from CUSTOMER';

SQL 命令は一重引用符で囲む必要がある。 別のコンポーネント (Edit1.Text など) のコンテンツを割り当てることもできる。 これは必ずしも良い考えとは限らない。 SQL インジェクションの詳細については、Secure programming (より高度なテキスト) を参照のこと。

フォームの「標準」タブから「TButton」を追加する。 ユーザーがボタンをクリックすると、データの取得が開始される。 Caption プロパティを「Button1」から「Show data」に変更する。

これにはコードが必要になる。 Button1 をダブルクリックする。 次に、Lazarusは必要な手順の骨格を作成する。 ソースコードには次の行があるはずだ。

procedure TForm1.Button1Click(Sender: TObject);
begin

end;

「begin」と「end」の間に、データを表示するために必要な命令を入力する必要がある。明らかに、これは SQLQuery1 と関係がある。

SQLQuery1 の 'SQL' プロパティは、SQLQuery1 がアクティブでない場合にのみ変更できる。 そのため、最初にコンポーネントを閉じる。

SQLQuery1.Close;

次に、SQL 命令を「SQL」プロパティに割り当て、以前の SQL コマンドを上書きする。

SQLQuery1.SQL.Text := 'select * from CUSTOMER';

次に、データベースへの接続を確立し、トランザクションをアクティブにしてクエリを開く必要がある。

DBConnection.Connected := True;
SQLTransaction1.Active := True;
SQLQuery1.Open;

最初の 2 つの命令は 3 番目の命令によって自動的に実行されるため、省略できる。 この時点でプロジェクトをコンパイルすると、CUSTOMER」テーブルのデータがすでに表示されているはずだ。

ただし、本格的なアプリケーションでは、開いているすべてのデータベース接続が不要になったときに適切に閉じられるようにする必要がある。 そうでなければ、2次的な影響は予測できない。そこで、フォームの OnClose イベントを使用する (オブジェクトインスペクタでダブルクリックして作成する)。

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin

end;

接続を閉じるには、開始コードとは逆の順序を使用する。

SQLQuery1.Close;
SQLTransaction1.Active := False;
DBConnection.Connected := False;

DBConnection.Connected を False に設定すると、トランザクションとクエリは自動的に閉じられるため、手動で閉じる必要はない。

要約

ここまで、SQLdb パッケージを使用してデータベースに接続する方法と、テーブルの内容を画面に表示する方法を学習した。 編集などの機能をさらに追加したい場合は、SQLdb チュートリアル 2 に進まれたい。

前の手順に従った場合、コードは次のようになる:

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,
  Graphics, Dialogs, DBGrids, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Datasource1: TDatasource;
    DBGrid1: TDBGrid;
    DBConnection: TIBConnection;
    SQLQuery1: TSQLQuery;
    SQLTransaction1: TSQLTransaction;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  SQLQuery1.Close;
  SQLQuery1.SQL.Text:= 'select * from CUSTOMER';
  DBConnection.Connected:= True;
  SQLTransaction1.Active:= True;
  SQLQuery1.Open;
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  SQLQuery1.Close;
  SQLTransaction1.Active:= False;
  DBConnection.Connected:= False;
end;

end.

関連情報

  • SQLdb Tutorial0/ja: チュートリアルに用いるサンプルの表/データを設定する方法を説明します。
  • SQLdb Tutorial1/ja: DB チュートリアルの第一の部分。データベースのデータを、どのように grid に表示させるかを学びます。
  • SQLdb Tutorial2/ja: DB チュートリアルの第二の部分。データベースのデータの挿入や編集について学びます。
  • SQLdb Tutorial3/ja: DB チュートリアルの第三の部分。複数のデータベースについてのプログラムやログインフォームの使い方を学びます。
  • SQLdb Tutorial4/ja: DB チュートリアルの第四の部分。どのようにデータモジュールを用いるかを学びます。
  • Lazarus Database Overview/ja: Lazarus がサポートしているデータベースについての情報。 データベースごとの記述へのリンクを含みます。
  • SQLdb Package/ja: SQLdb パッケージについての情報
  • SQLdb Programming Reference/ja: SQLdb データベースコンポーネントの入出力の概要
  • SqlDBHowto/ja: SQLdb パッケージを用いることについての情報
  • Working With TSQLQuery/ja: TSQLQuery についての情報