ウィキのコピーミラー

これは pascal.chat のウィキのミラーです。編集、履歴、ログインはそちらで行います。

Databases/ja

Deutsch · English · Español · Français · Italiano · Português · Русский · 中文(中国) · 日本語

日本語版メニュー

メインページ - Lazarus Documentation日本語版 - 翻訳ノート - 日本語障害情報

データベースのポータル
参照: · Databases 概要 · ライブラリ · フィールドの型 · コントロール · FAQ · SqlDBHowto/ja · TSQLQuery の利用 · メモリ上で動作するデータベースの作り方 · チュートリアル/練習となる記事: · 概要 · 0 - データベースのセットアップ · 1 - 開始 · 2 - 編集 · 3 - クエリ · 4 - データモジュール · SQLdb Programming Reference/ja · 各種データベース · Advantage - MySQL - MSSQL - Postgres - Interbase - Firebird - Oracle - ODBC - Paradox - SQLite - dBASE - MS Access - Zeos

このページは「Lazarusとデータベース 」の概要である。以下の表にはサポートされているデータベースが載せられている。

クライアントライブラリがインストールされているデータベースコンポーネント(もしデータベースがクライアントライブラリを必要とするなら)に限る、さもないとLazarusはファイルがないために起動ができない可能性がある。そのコンポーネントのアンインストールが不可能なら、Lazarusを再インストールする必要がある。

サポートされるデータベース

データベース パッケージ名 クライアントライブラリが必要か サーバが必要か サポートされるバージョン サポートされるプラットフォーム
Advantage TAdsDataSet はい いいえ 10.1以降 i386: Linux, Win32
DTurboPower FlashFiler FlashFiler いいえ いいえ - Win 32, (win64?)
In memory memds いいえ いいえ - すべて
In memory bufdataset いいえ いいえ - すべて
Firebird SQLdb はい 場合による1 1 - 2.5 i386: Linux, Win32
(Visual) FoxPro DBFLaz いいえ いいえ 2.0, 2.5, 3.0 (完全ではない) すべて
Interbase SQLdb はい はい 4 - 6 i386: Linux, Win32
Microsoft SQL Server SQLdb はい はい 6- FPC 2.6.2+. Linux, macOS, Win32, おそらく*BSD、おそらくSolaris2
MySQL SQLdb はい はい 4.0 - 8.0 i386: Linux, Win32
ODBC SQLdb はい 場合による 3.x 3 i386: Linux, Win32
Oracle SQLdb はい はい - -
Paradox TParadoxDataSet いいえ いいえ レベル 7まで(より上も ??) すべて
Paradox TParadox はい いいえ Win32
PostgreSQL SQLdb はい はい 6.6 - 8 i386: Linux, Win32
Sybase Adaptive Server Enterprise (ASE) SQLdb はい はい いずれも Linux, macOS, Win32, おそらく*BSD、おそらくSolaris2)
SQLite SQLdb はい いいえ sqlite3 すべて
SQLite SQLite(3)Laz はい いいえ sqlite2,sqlite3 すべて
Text files sdf いいえ いいえ - すべて
ZMSQL zmsql いいえ いいえ ? ?

注意 (1): WindowsとLinux(おそらくmacOSも)では組み込みバージョンのFirebirdが利用可能、またはWindows/Unix/macOS/FreeBSD/他のFirebirdがサポートするプラットフォームで稼働するFirebirdサーバに接続可能

注意 (2): これらの接続にはドライバとしてFreeTDSライブラリが用いられる。FreeTDSドキュメンテーションはドライバが少なくともこれらのプラットフォームで構築されるはずであるとしている。Windows x86およびx64バージョンは例えば1(ftp://ftp.freepascal.org/fpc/contrib/windows/dblib_x32.zip)および2(ftp://ftp.freepascal.org/fpc/contrib/windows/dblib_x64.zip)からダウンロードできる

注意 (3): このバージョン番号はODBCドライバ標準ものであり、ドライバまたはドライバマネージャのバージョン番号ではない。ほとんどのDBMSに対してODBC 3.x ドライバがある。

データベースクライアントへのバインディング

もしクライアントライブラリを必要とするデータベースを用いたいときは、そのライブラリをインストールしなければならない。今プログラミングを行っているコンピュータのみならず、アプリケーションを動作させるコンピュータにおいてもである。あるデータベース(特にMySQL)はそのバインディングが、インストールされたライブラリと同じバージョンからアプリケーションでコンパイルされた場合でのみ動作することに注意されたい。 データベース開発元のウェブサイトでこれらのライブラリ(*nixシステムでは .so、Windowsでは .dllsファイル)のインストールの仕方を見つけることができる。バインディングユニットはFPCソースのpackages/baseディレクトリで見つけることができる。それらはmysql_connectのように基本的にそれぞれのデータベースで完全に異なるクライアントAPIからなっている。これらのユニットを用いてデータベースアプリケーションを書くことができるが、Lazarus DB-unitを用いるより通常工数が必要であり、バグに対して敏感である。

これらのバインディングライブラリのほとんどはクライアントライブラリにハードリンクされている。アプリケーションがこれらのユニットを1つとコンパイルされるとクライアントライブラリがそのワークステーションで利用できないとアプリケーション全体がリンクされないことを意味する。これは、もし、-例えばコンピュータのMySQLクライアント、がインストールされていない状態で、プログラムの中でmysql4.ppユニットが使われているとそのプログラム実行ファイルは生成されないであろうことを示す。 もし、MySQLライブラリがインストールされたコンピュータでプログラムをコンパイルすることに成功したなら(したとしても-Evenを補った場合)、そのプログラムは相応のMySQLクライアントライブラリがインストールされていない他のどのコンピュータでも依然として動かないだろう(原文が悪いと思います"EVEN"が必要、EVEN If you succeed in compiling the program on a computer which has the MySQL client libraries installed, it still won't start on any other machine without the appropriate MySQL client libraries.)。言い換えれば: これらのデータベースにとって、開発機にクライアントライブラリをインストールする必要があり、また、アプリケーションとともに(運用機にも)クライアントライブラリをインストールする必要がある。

そのような問題を避けるため、いくつかのパッケージはまた、ライブラリに動的にリンクできるようになっている。それらのライブラリに対するどのような呼び出しの前にも、そのユニットは「初期化」されなければならない。データベースクライアントがインストールされていないコンピュータではこの初期化が失敗する。プロクラムがクライアントライブラリを使う用意ができると、そのユニットは「解放」されなければならない。

データセット

データセットとデータベースの区別

多くのデータベースプログラミングの初心者はデータセットとデータベースの区別をしない。Firebird、Interbase、Oracle、Sybase、Microsoft Accessなどの多くのデータベースがある。

もっとも単純に概念化すればLazarusのデータセット(TDatasetの派生、例えば、TSQLQueryなど)をデータベースから選んだレコードのコピーの一部と考えることである。以下のSQL文を用いてクエリを行ったとき:

pascal
SQLQuery1.SQL.Text:= 'select * from table1 where id <=100';

SQLQuery1をデータベース中のtable1を開き100と100に満たないid値をSQLQuery1にコピーする。

このデータセット内容はTDatasetに順々に取得されたTDatasourceを介してTDBGrid、TDBEdiなどのデータベースコントロールを用いて視覚化される。 以下で説明されるinsert、edit、postなどのようなコマンドを用いてこのデータセットの内容を変更できるが、基本的にこれらの操作はデータセットに対してであり、データベーステーブル自身に対して行われるわけではない。

変更をデータベースに対して永続的に行うには、TDataSet.ApplyUpdatesを呼ぶまたは、SQL構文insert、update(これらはTDataset.insert、TDataset.updateとは異なる)を実行するなど、もう一手間必要である。

データベースのトランザクションのプロパティを通してデータセットを閉じるときに自動的に保存(もしくは破棄)する変更を行う多くのやり方がある。

データセットの基本

Lazarus(もしくはFree Pascal)で用いられるデータベースは基本的にTDataSet/jaクラスに基づいている。 これがアプリケーションに対しテーブルやクエリをもたらす。しかし、他の基底クラスのようにTDatasetは自身は用いず、その派生を用いることになる。これには多くがある。それらは、例えばローカルデータベース、テキストファイル、あるいはPostgreSQL、Firebird、MySQLなどといった異なるバックエンドデータベースへのアクセスをもたらす。いくつかのデータセットの派生はデータベーステーブルに直にリンクされていることもあるが、リンクをもたらすために他の追加のコンポーネントや、ライブラリを用いるものもある。

不可視のコンポーネントであるデータセットの派生物は、普通はLazarus Component Library(LCL)というよりはFree Component Library(FCL)である。

データセットはプログラム的、視覚的コントロールの双方で用いることができる。典型的なLazarusデータベースアプリケーションにはしばしば双方のメソッドを用いられるだろう。双方の場合で最初の一歩はTDatasetの派生を作成し、望むテーブルかクエリに接続し、開くことである。これは実行時にコードの中で、あるいは作成時にフォームへコンポーネントを配置し、そのプロパティを設定することのいずれでもなされる。 この詳細はTDatasetの派生により大きく異なっており、使っているデータベース応じて何をするべきなのかはDatabases/ja以下の様々なガイドを参照のこと。

データセットが開かれると、開かれたテーブルもしくはクエリのそれぞれのフィールドまたはカラム1つに対し、フィールドコンポーネントが生成される。それぞれのフィールドコンポーネントはフィールドの特定のデータ型、即ち、TStringField、に対する派生である。

コードからデータセットを用いる

プログラムによるアクセスはデータセットとフィールドコンポーネントを使うで詳述するが、簡単な例として:

フィールドの型についてはデータベースフィールド型の一覧を参照のこと。

視覚的(データ感知型の)コントロールを用いる

「RAD」スタイルのLazarusアプリケーションで簡単にデータベースを用いるために、通常はデザインの時にデータセット派生を設定しデータ感知型コントロールを用いる。これを行うためには:

コントロールの詳細は以下の #データコントロールを見ること

データセット状態

データセットには多くの状態がある。非常に多くの状態があるが(ソースのTDataSetStateを見ること)。最初に注意すべきおもなものは

状態 機能
dsInactive データセットは閉じている
dsBrowse データセットを閲覧、値を見ることができる
dsEdit 現在の行の値を編集できる。Postが実行されるまで値は保存されない
dsInsert 新しい行が挿入されている。これに値をセットすることができる。Postが実行されるまでレコードは保存されない

他の状態はかなり一時的で通常「自動的に」扱われる。それらは内部的に用いられ、より複雑なコードである。もしデータベースがデータだけを見ており、設計時にデータセットを開くのであれば、この状態は、データセットはほとんどdsBrowseにあるため、たいていは無視できる。しかし、ほとんどのアプリケーションはいずれかの段階でデータを変更する必要がある。もし、データ感知型コントロールを用いている場合、それらはこの多くを自動的に行うだろう。例えば、TDBEdit/jaコントロールでテキストを変更すると、すでにdsEdit、あるいはdsInsert状態にいなければ、それはデータセットをdsEdit状態にする。現在の状態がdsEditもしくはdsInsertの時に他のレコードに「スクロール」するとそのレコードは「post」され、データセットはdsBrowseに戻るだろう。しかし、データセットをコードからアクセスしていると、たいてい同様にコードの中から状態を変更する必要が生じるだろう。TDBNavigator/jaコントロール(以下参照)は明示的に状態を変えることができる。

データセット更新状態

更新状態は、アップデートがいまだにデータベースに対して行われていなければ、レコードバッファの現在の状態を決定する。 例 ApplyUpdatesがデータを挿入(Insert)、更新(Update)もしくは削除(Delete)するときに検出する方法:

pascal
procedure QueryAfterPost(DataSet: TDataSet);
    begin
      case DataSet.UpdateStatus of
        usUnmodified : ShowMessage('Unmodified');
        usModified   : ShowMessage('Modified');
        usInserted   : ShowMessage('Inserted');
        usDeleted    : ShowMessage('Deleted');
      end;
    end;

値の説明

データセット更新状態

更新状態は、アップデートがいまだにデータベースに対して行われていなければ、レコードバッファの現在の状態を決定する。 例 ApplyUpdatesがデータを挿入(Insert)、更新(Update)もしくは削除(Delete)するときに検出する方法:

pascal
procedure QueryAfterPost(DataSet: TDataSet);
    begin
      case DataSet.UpdateStatus of
        usUnmodified : ShowMessage('Unmodified');
        usModified   : ShowMessage('Modified');
        usInserted   : ShowMessage('Inserted');
        usDeleted    : ShowMessage('Deleted');
      end;
    end;

値の説明

ポストとキャンセル

もしレコードを編集、挿入すると新しい値がバッファに保持される。

あるデータセット派生ではデータは直ちにデータベースに書き込まれるのに対し、別のデータベースではすべての変更がさらに保存されるまで、アップデートリストにおかれるだろう。最後にデータが書き込まれても、それらが永続的にデータベースに書き込ませるために「commit」を呼ぶことがあるかもしれない。これらのすべてはまた、データセット派生で異なっているため、使っているものの子細を調べること。

新しいレコードを挿入する

TDataSet派生にデータを挿入するためにはInsertメソッドを用いるべきである。その後、フィールドに値をセットし、最後には新しいレコードを書き込むために、以下の例のようにPostを呼ぶことができる。この例ではまた、ファイルからBLOBデータを挿入する仕方を示している。ストリームデータからデータを取り込むためにLoadFromStreamを用いることもできる。

pascal
MyDataset.Insert;
      MyDataset.Fields[0].AsInteger := 4; //整数値フィールド
      MyDataset.Fields[1].AsString := 'First Name'; //文字列フィールド
      (MyDataset.Fields[2] as TBlobField).LoadFromFile('SomeBlobfile.bin'); //BLOB(バイナリ)フィールド
      MyDataset.Post;

テーブルの中の1つの特定のレコードにジャンプする仕方

テーブルのすべてのレコードを選択した後

テーブルのすべてのレコードを選択し、素早くその中に飛び込む欲求でSELECT * FROMを使うと、インデクスを作成し、それを探さなければならないかもしれない。これは望むレコードのみを選択するよりもより効果的である。

望むレコードのみを選択すること

特定のレコードにジャンプし、それのみを選択する1つの早い解決法は例えばこのようなものである:

pascal
var
      MyDataset: TSQLQuery;
    begin
      //...
      MyDataset.FieldDefs.Add('SessionId', ftLargeint);
      MyDataset.FieldDefs.Add('GameEvent', ftLargeint);
      MyDataset.FieldDefs.Add('TableId', ftInteger);
      MyDataset.FieldDefs.Add('LoggedIn', ftBoolean);
      MyDataset.FieldDefs.Add('PlayerId', ftInteger);
      MyDataset.Active := False;
      { パラメータ化されていないフォーマット 'を含むテキストや日付では問題に出くわすかもしれない
      SQLText := Format('select * from "GameSession" WHERE "SessionId"=%d', [ASessionId]);
      }
      // 解決法: パラメータ化されたクエリ:
      // 実際, これがループの中で行われると、1回だけSQL.Textをセットするだけでよい
      // そしてパラメタ値だけ変更する
      MyDataset.SQL.Text := 'select * from "GameSession" WHERE "SessionID"=:SessionID');
      MyDataSet.ParamByName('SessionID').AsLargeInt := ASessionID;
      try
        MyDataset.Active := True;
      except
        //...
      end;

そして、このようなことで情報を読むことができる:

pascal
lPlayerId := MyDataset.Fields[4].AsInteger;

フィルタリング

望むサブセットにレコードを限定することでデータセットをフィルタリングできる(例えば、Smithで始まるすべての姓)。

ロケート/ルックアップ

Non-SQLデータセットでより頻繁に用いられるが(例えば、TParadoxDataSet、TDbf)、locate/lookupを用いることでレコード間をジャンプできる。.

TSQLQueryを用いる

TSQLQueryに関する詳細な情報はWorking With TSQLQuery/jaを見ること

エクスポート

FPC/Lazarusはデータセットを様々な形式で出力する機能を持っている。例えば、以下を参照のこと

もちろん、これを手動的に行うこともできる(例えば、fpspreadsheetを用いてExcel形式で出力するにはFPSpreadsheet#Converting_a_database_to_a_spreadsheetを参照)

データコントロール

DataControl.png

これらのコントロールのいずれを用いるときにも、そのコントロールをフォームに加え、少なくともデータソースプロパティを設定すること。他のプロパティはのちに述べる。

データソースコントロール

tdatasource 150.png

このコントロールは現在リンクされたどのコントロールが有効なのかを見ている。データソースコントロールはデータセット(例えば、TSQLQuery)にリンクされなければならない。

単一フィールドコントロール

これらのコントロールは単一のフィールドに付随する。データソース同様にフィールド名を設定する。これらのコントロールに含まれるのは:

DBGrid コントロール

tdbgrid 150.png

このコントロールは数多いフィールドを行/列形式で表現する - 実際デフォルトではそれらすべてを表示する。しかし、特定のフィールドに制限する、およびそれぞれのカラムの幅とタイトルを設定するためにcolumns collection に見出しを設定することができる。

これに言及したドキュメンテーションとは別に, さらなる細目がここで見られるGrids Reference Page#TCustomDBGrid

Navigator コントロール

tdbnavigator 150.png

このコントロールはデータセットに直接のコントロールを提供する。これにより:

鍵となるプロパティ:

FPCデータベース稼働テスト

Free Pascalデータベースコンポーネントにはfpcunitベースのテストフレームワークである、機能を確認するために用いられるdbtestframeworkが含まれている。FPCソースツリーのsource\packages\fcl-db\tests\ディレクトリを見てほしい。そこに含まれているのは、いくつかのほかのテスト同様に、様々なデータベーステスト(例えば、データベースエクスポートのテスト)と、コンポーネントで実行されるテストフレームワークである。

あるデータベースのテストフレームワークを実行するには:

1. 保存 source\packages\fcl-db\tests\database.ini.txtをsource\packages\fcl-db\tests\database.iniに。

2. 変更 source\packages\fcl-db\tests\database.iniの中にあるうちの使うデータベースを選ぶ。

Interbase/Firebirdの例は:

pascal
[Database]
    type=interbase

3. 同じファイルで使うデータベースに対する設定を状況に合わせて調整する。例えば、先にInterbaseを選んだなら:

pascal
[interbase]
    connector=sql
    connectorparams=interbase
    ; ???????????????????????????/?????? (??????: ????????????????????????????????????????????????????????????)
    ; ?????????????????????????????????????????????(Firebird?????????????????????????????????aliases.conf?????????)
    name=testdb
    user=sysdba
    password=masterkey
    ; ??????????????????????????????:
    ; ???????????????Firebird?????????????????????????????????????????????????????????????????????
    hostname=192.168.0.42

4. source\packages\fcl-db\tests\dbtestframework.pasをコンパイルして実行する(またLazarusを用いてGUIバージョンのdbtestframework_guiをコンパイル、実行もできる)もしWindowsで組み込みのデータベース(例えば、Firebird 組み込み あるいは sqlite)を用いている場合、事前に必要とされるDLLファイルをそのディレクトリにコピーしておくこと。出力はXMLフォーマット(もしくは、dbtestframework_guiを用いた場合ディスプレイへ)である。

詳細はsource\packages\fcl-db\tests\README.txtを参照されたい。

Lazarusに含まれるデータベースパッケージ

sqldblaz.lpk

sqldb.png

このパッケージは異なるデータベースへのアクセスを提供する。これらに含まれるものに:

これらのコンポーネント(TSQLQuery, TSQLTransaction, TIBConnection, TODBCConnection, TOracleConnection, TMSSQLConnection, TMySQL40Connection, TMySQL41Connection, TMySQL50Connection, TPQConnection, TSybaseConnection) はコンポーネントパレットの「SQLdb」にある

dbflaz.lpk

このパッケージはdBaseとFoxProデータベースへのアクセスを提供する。Lazarus Tdbf Tutorialでさらなる情報が得られる。TDbfコンポーネントはコンポーネントパレットのData Access tabにある。

sqlitelaz.lpk

このパッケージはSQLiteデータベースに対するアクセスを提供する。さらなる情報はLazarus Database Overview/jaで得られる。

sdflaz.lpk

コンポーネントTSdfDataSetはコンポーネントパレットのData Access tabにある。

lazreport.lpk

レポートジェネレータのホームページは http://lazreport.sourceforge.net/である。 さらなる情報はここにある。LazReportはPrinter4Lazarusパッケージに依存する。リビジョン11950 LazReportはLazarus SVN レポジトリに含まれる。

lazdbexport.lpk

lazdbexport参照。

外部パッケージ / ライブラリ

Zeosデータベースオブジェクト

これらのコンポーネントは異なるデータベースに対するアクセスを提供する。さらなる情報はここで得られる。このwikiにはまたZeos tutorialがある。

Pascalデータオブジェクト

現在ある別の選択肢である。

サポート:

PHPデータオブジェクトに触発されたPascalデータオブジェクトというデータベース APIによって、ステートメント、バインディング、ストアドプロシージャがサポートされる。 この新しいAPIを用いるために必要なすべてのコードとドキュメンテーションはSourceforgeにある:

http://pdo.sourceforge.net

TPSQL

これらのコンポーネントはPostgreSQLに対するTCP/IP経由のアクセスを提供する。さらなる情報はこのページで得られる。

FIBL

これらのコンポーネントはInterbaseとFirebirdデータベースに対するアクセスを提供する。ホームページは3(http://sourceforge.net/projects/fiblhttp://sourceforge.net/projects/fibl)。

IBX

IBX For LazarusはFirebirdデータベースに対するアクセスを提供するIBX参照。

FBLib Firebird ライブラリ

FBLibはFirebirdリレーショナルデータベースに対するBorland Delphi/Kylix、Free Pascal、Lazarusへの直接アクセスのためのオープンソースのデータ非感知型ライブラリである。

現在の特色には以下が含まれる:

FBLibのウェブサイトでドキュメンテーションをダウンロードできる。

Unified Interbase

UIB はInterbase、Firebird、YAFFILデータベースにに対するアクセスを提供する。ホームページは[www.progdigy.com](http://www.progdigy.com)。 SVNレポジトリはhttps://uib.svn.sourceforge.net/svnroot/uib以下で得られる。

TechInsite Object Persistence Framework (tiOPF)

tiOPFに対するさらなる情報はpageで得られる。

Advantage TDataSet Descendant

The Advantage TDataSet DescendantはAdvantage Database Serverに接続し(そしてテーブルを開く)手段を提供する。Advantageは柔軟で管理不要のデータベースで Clipper、FoxPro、Visual FoxPro 9 DBFファイルフォーマットに対するクライアント/サーバ、Peer-to-peerファイルフォーマット、 同様に新しい特徴を持つ独自ファイルフォーマットへの移行パスを提供する。

Key Features:

さらなる情報はAdvantage Database Server参照。

ZMSQL、sql強化されたインメモリデータベース

さらなる情報はZMSQL wikiページを参照。

ZMSQLはオープンソースのセミコロンをデリミタとする値のテーブルで操作されるFree Pascal(FPC)に向けられたインメモリメータベースである。 完全にPascalで書かれており、外部ライブラリの依存性がない。SQL実装にはJanSQLエンジンを用いている。

これにより:

ダウンロードにはソースコード、いくつかのデモアプリケーション、コンポーネントの特徴、readmeが含まれる。

以下も参照のこと


From the Free Pascal wiki, page "Databases/ja", as the Internet Archive kept it on 2025-01-17, last changed on 2024-09-28. 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.

第3版、最終更新:WikiArchive 。