Direct Access Components リファレンス
Zen Direct Access Components の実装
以下のトピックでは、Delphi および C++Builder 開発者向けの詳細な情報を提供します。
•
•
•
•
MicroKernel エンジン コンポーネント
Btrieve コンポーネントのセットには以下のものが含まれています。
•
•
•
•
•
これらのコンポーネントはリレーショナル機能を使用しておらず、実行時に リレーショナル エンジンまたは ODBC を必要としません。
コンポーネントは、次の表に示すように Embarcadero のコンポーネントに置き換わります。
これらのコンポーネントはスタンドアロン(つまり、Borland Database Engine(BDE)なし)で使用することができます。また、単一アプリケーション内で BDE と同時に使用することもできます。コンポーネントの使用法は対応する BDE コンポーネントと同じです。例外については、適用可能な特定のコンポーネント下、および PDAC クラス、プロパティ、イベント、およびメソッドに記載されています。
TPvSession
スレッドに対する安全性とクライアント ID のサポートを提供します。この機能は、TSession VCL コンポーネントと類似しています。
関連情報
TPvSession については、本章の以下のセクションを参照してください。
•
•
•
•
TPvDatabase
ログイン コントロール、トランザクション サポート、データベース接続持続性などの、非 SQL データベースのための接続に特化した機能を提供します。この機能は、TDatabase VCL コンポーネントと類似しています。
TPvDatabase と Embarcadero のコンポーネントの機能の相違点
•
•
•
IsSQLBased は常に False を返します。
•
セキュリティで保護されたテーブル、およびユーザー名とパスワードの入力要求
セキュリティで保護されたテーブルに接続しようとすると、PDAC にユーザー名とパスワードの入力を求められます。このようなプロンプトが表示されないようにしたい場合は、次のコードを例として用いて、TPvDatabase で接続パラメーターを設定します。(TPvTable のテーブル セキュリティも参照してください。)
   PvSession.ServerName:='ServerName';
   PvSession.SessionName:='session1';
   PvSession.Active:=True;
 
   PvDatabase.AliasName:= 'DatabaseName';
   PvDatabase.DatabaseName:='DB';
   PvDatabase.SessionName:='session1';
   PvDatabase.Params.Clear();
 
// ここでユーザー名とパスワードを指定して
// データベースに接続する
 
   PvDatabase.Params.Add('User Name=UserName');
   PvDatabase.Params.Add('password=Password');
   PvDatabase.Connected:=True;
   PvTable.DatabaseName:='DB';
   PvTable.SessionName:='session1';
   PvTable.TableName:='person';
   PvTable.Active:=True;
関連情報
TPvDatabase については、本章の以下のセクションを参照してください。
•
•
•
TPvTable
シングル テーブル アクセスと操作を提供します。この機能は、TTable VCL コンポーネントと類似しています。
TPvTable と Embarcadero のコンポーネントの機能の相違点
•
•
•
•
テーブル セキュリティ
MicroKernel エンジン用の PDAC セキュリティは、個々のテーブルのオーナー ネームを使用します。このセキュリティ モデルを使用する場合は、テーブルのオーナー ネームを提供します。詳細については、『Btrieve API Guide』の 「Set Owner(29)」を参照してください。
TPvTable には Owner: string プロパティと次のメソッドがあります。
SetOwnerOnTable(AOwner: string; AccessMode: integer)
Owner プロパティを使用すれば、オーナー ネームを設定することができます。SetOwnerOnTable メソッドを使用すれば、テーブルのオーナー ネームを設定したりクリアしたりすることができます。
Btrieve テーブルにアクセスするには、有効なオーナー ネームを提供します。
テーブルの作成
実行時に CreateTable メソッドを呼び出し、このデータセットの現在の定義を使用してテーブルを作成します。
FieldDefs プロパティに値がある場合は、これらの値を使ってフィールド定義を作成します。値がない場合は、Fields プロパティを使用します。データセットを再作成するには、これらのプロパティの一方または両方に値がなければなりません。
Add メソッドを使用してフィールドのプロパティを割り当てます。
procedure Add(const Name: string; DataType: TFieldType; Size: Word; Required: Boolean);
Add メソッドは以前のバージョンとの互換性を保つために提供されます。新しいフィールド定義を Item プロパティの配列に追加する場合は、AddFieldDef メソッドを使用することをお勧めします。また、これを使って ftBCD データ型の小数位と桁数も指定します。
Add メソッドは、Name、DataType、Size および Required パラメーターに渡された値を使用し、これらを新しいフィールド定義オブジェクトの個別のプロパティに割り当てます。
メモ:フィールドがヌル値を許可する場合、Required に False を設定します。
AutoInc フィールドで autoincrement プロパティをアクティブにするには、このフィールドに固有のインデックスを作成します。
また、現在のリリースでは、PDAC は BIGIDENTITY データ型をサポートしていません。
Delphi のコード例
PvTable1.DatabaseName := 'TestData';
PvTable1.TableName := 'TestData1';
with PvTable1.FieldDefs do
begin
  Clear;
  Add('F_autoinc',  ftAutoInc, 0, True);
  Add('F_currency', ftCurrency, 0, False);
  Add('F_integer',  ftInteger, 0, False);
  Add('F_word',     ftWord, 0, False);
  Add('F_fixchar',  ftFixedchar, 30, False);
  Add('F_varbin',   tString, 25, False);
  Add('F_blob',     ftBlob, 60, False);
end;
with PvTable1.FieldDefs.AddFieldDef do
begin
  Name := 'F_BCD';
  DataType := ftBCD;
  Size := 2;        //桁数
  Precision := 10;  //小数位
  Required := false;
end;
 
 
with PvTable1.IndexDefs do
begin
  Clear;
  Add('Index1', 'F_autoinc', [ixPrimary, ixUnique]);
  Add('Index2', 'F_integer', [ixCaseInsensitive]);
end;
PvTable1.CreateTable;
C++Builder のコード例
PvTable1->DatabaseName="TestData";
PvTable1->TableName="Test1";
PvTable1->FieldDefs->Clear();
PvTable1->FieldDefs->Add("F_autoinc", ftAutoInc, 0, True);
PvTable1->FieldDefs->Add("F_integer", ftInteger, 0, False);
PvTable1->FieldDefs->Add("F_Curr", ftCurrency, 0, False);
PvTable1->FieldDefs->Add("F_Word", ftWord, 0, False);
PvTable1->FieldDefs->Add("F_fixchar", ftFixedChar, 0, False);
PvTable1->FieldDefs->Add("F_String", ftString, 20, False);
PvTable1->FieldDefs->Add("F_blob", ftBlob, 60, False);
 
TFieldDef *FieldDef = PvTable1->FieldDefs->AddFieldDef();
FieldDef->Name="F_BCD";
FieldDef->DataType=ftBCD;
FieldDef->Size=2;
FieldDef->Precision=10;
FieldDef->Required=False;
PvTable1->IndexDefs->Clear();
PvTable1->IndexDefs-> Add("Index1","F_autoinc",TIndexOptions() <<ixPrimary << ixUnique);
PvTable1->CreateTable();
関連情報
TPvTable については、本章の以下のセクションを参照してください。
•
•
•
•
TPvBatchMove
アプリケーションの、レコードのグループあるいはテーブル全体へのデータベース オペレーションを可能にします。この機能は、TBatchMove VCL コンポーネントと類似しています。
関連情報
TPvTable については、本章の以下のセクションを参照してください。
•
TwwPvTable
InfoPower 互換性のために PDAC に含まれています。TPvTable から直接派生され、ControlType という追加のプロパティを持ちます。
リレーショナル エンジン コンポーネント
リレーショナル エンジン コンポーネントのセットには以下のものが含まれています。
•
•
•
•
•
•
•
コンポーネントは、次の表に示すように Embarcadero のコンポーネントに置き換わります。
これらのコンポーネントはスタンドアロン(つまり、Borland Database Engine(BDE)なし)で使用することができます。また、単一アプリケーション内で BDE と同時に使用することもできます。コンポーネントの使用法は対応する BDE コンポーネントと同じです。例外については、適用可能な特定のコンポーネント下、および PDAC クラス、プロパティ、イベント、およびメソッドに記載されています。
TPvSQLSession
Zen のスレッドに対する安全性とクライアント ID のサポートを提供します。この機能は、TSession VCL コンポーネントと類似しています。
TPvSQLSession と Embarcadero のコンポーネントの機能の相違点
•
•
•
•
•
•
関連情報
TPvSQLSession については、本章の以下のセクションを参照してください。
•
•
•
•
TPvSQLDatabase
ログイン コントロール、トランザクション サポート、データベース接続持続性などの、Zen データベースのための接続に特化した機能を提供します。この機能は、TDatabase VCL コンポーネントと類似しています。
TPvDatabase と Embarcadero のコンポーネントの機能の相違点
•
•
•
セキュリティで保護されたデータベース、およびユーザー名とパスワードの入力要求
セキュリティで保護されたデータベースに接続しようとすると、PDAC にユーザー名とパスワードの入力を求められます。このようなプロンプトが表示されないようにしたい場合は、次のコードを例として用いて、TPvSQLDatabase で接続パラメーターを設定します。
   PvSession.ServerName:='ServerName';
   PvSession.SessionName:='session1';
   PvSession.Active:=True;
 
   PvDatabase.AliasName:= 'DatabaseName';
   PvDatabase.DatabaseName:='DB';
   PvDatabase.SessionName:='session1';
   PvDatabase.Params.Clear();
 
// ここでユーザー名とパスワードを指定して
// データベースに接続する
 
   PvDatabase.Params.Add('User Name=UserName');
   PvDatabase.Params.Add('password=Password');
   PvDatabase.Connected:=True;
   PvTable.DatabaseName:='DB';
   PvTable.SessionName:='session1';
   PvTable.TableName:='person';
   PvTable.Active:=True;
クライアントからの、DSN を使用しない接続
PDAC のリレーショナル コンポーネントは、DSN または 名前付きデータベースなしでも、クライアント コンピューターからリモート サーバー データベースへ接続できます。サーバーにはデータベースの DSN がなければなりません。
この機能は、TPvSqlDatabase コンポートネントで入手できる AliasNameIsConnectionString プロパティを使用することで動作します。詳細については、VCL と異なる特定のクラスを参照してください。
1
2
3
プロパティ AliasNameIsConnectionString を True に設定します。
4
AliasName プロパティ(または AliasName は空のままで DatabaseName)に「接続文字列」を設定します。
「接続文字列」とは、次の例に示すように、サーバー上の DSN やサーバーの名前などを含む、ODBC への完全な接続文字列です。
DRIVER={Pervasive ODBC Client Interface};ServerName=DSLINUX2; ServerDSN=DEMODATA; UID=myuserid;PWD=mypassword
メモ:接続文字列には引用符や改行はありません。お使いのエディターで行を折り返している場合、プロパティ エディターでは単一行にしてください。
ユーザー名とパスワードが必要な場合、接続文字列の一部としてこれらを含めることができます。接続文字列にユーザー名とパスワードが含まれない場合、LoginPrompt プロパティが True であれば、標準のデータベース ログイン ダイアログが表示されます。
5
これらの手順はすべて設計時、または実行時にコードから実行することができます。
関連情報
TPvSQLDatabase については、本章の以下のセクションを参照してください。
•
•
TPvQuery
SQL ステートメントに基づいて行セットをカプセル化します。これは、複数のテーブルに対する結合やキャッシュされた更新を含む、完全なリレーショナル アクセスを提供します。この機能は、TQuery VCL コンポーネントと類似しています。
TPvQuery と Embarcadero のコンポーネントの機能の相違点
•
•
•
•
•
•
•
•
BookMarksEnabled プロパティ
TPvQuery には BookmarksEnabled というブール型の新しいプロパティが追加されました。アプリケーションでブックマークを使用しない場合は、このプロパティを False に設定すると TPvQuery のパフォーマンスが向上します。デフォルト値は True です。
PvQuery.BookmarksEnabled := False
カーソル管理
TPvQuery には CursorType プロパティがあり、ctCached または ctDynamic を設定できます。次の表では、このプロパティの動作を詳しく説明します。
メモ:動的カーソルでは、自身またはその他のクライアントによる挿入/更新/削除を見ることができます。
このプロパティを変更することによって PvQuery の CursorType を変更することはできますが、Active が False になっている場合は実行時のみに限ります。デザイン モードでこれを変更し、クエリが Active である場合は、そのクエリを非アクティブにしてからカーソルの種類を変更しますが、再アクティブ化はしません。実行時、Active が True になっている場合に PvQuery の CursorType を変更すると、"開いたデータセットでこのオペレーションを実行できません" という例外が生じる結果となります。
動的カーソルが静的カーソルに変わる状況
動的カーソル(ctDynamic)を要求したとしても、SQL ステートメントに動的カーソルを処理できない構文が含まれている場合、エンジンは接続してデータを返しますが、静的カーソルを使用します。たとえば、次のような構文が挙げられます。
•
•
•
カーソルが静的カーソルに変わる場合、この静的カーソルはエンジン ベースのカーソルで、ほかのクライアントによる挿入、更新または削除を見ることができません。以前のリリースの静的カーソル(カーソルの種類に ctCached を使用する)よりも正しく動作します。
カーソルが動的から静的に変わる場合は、そのことがデータベース エンジンから PDAC コンポーネントに通知され、EngineCursor という名前の読み取り専用のパブリック プロパティが設定されます。
EngineCursor プロパティは公開されていないので、設計時に[オブジェクト インスペクター]には表示されません。このプロパティには 2 つの値があります
•
•
このプロパティは変更できませんが、クエリを開いた後にその値を確認することができます。ほかのクライアントによって行われた更新がカーソルに含まれるかどうかをアプリケーション側で認識することが重要な場合などは、このプロパティを確認してください。
関連情報
TPvQuery については、以下の項目を参照してください。
•
•
•
TPvUpdateSQL
マルチテーブル結合などのほかの方法で更新できない SQL 行セットの(キャッシュ後の更新を含んだ)透過的な更新を可能にします。この機能は、TUpdateSQL VCL コンポーネントと類似しています。
関連情報
TPvTable については、以下の項目を参照してください。
•
TPvStoredProc
Zen ストアド プロシージャへのアクセスを提供します。TpvQuery コンポーネントと同様に、パラメーター化し、行セットを返すことができます。この機能は、TStoredProc VCL コンポーネントと類似しています。
関連情報
TPvQuery については、以下の項目を参照してください。
•
•
•
TwwPvQuery
InfoPower 互換性のために PDAC に含まれています。TPvQuery から直接派生され、ControlType という追加のプロパティを持ちます。
TwwPvStoredProc
InfoPower 互換性のために PDAC に含まれています。TPvStoredProc から直接派生され、ControlType という追加のプロパティを持ちます。
ODBC と SQL のデータベース セキュリティ
ODBC および SQL のセキュリティは DDF レベルのデータベース セキュリティです。PDAC には SQL セキュリティをセットアップする特別な方法はありません。Zen Control Center または ODBC ツールなどの外部プログラムを使用する必要があります。
データベースがセキュリティで保護されている場合は、テーブルを開くとき、または TpvDatabase コンポーネントにアクセスするときに、毎回ユーザー名とパスワードを入力するダイアログが表示されます。データベースにセキュリティが設定されているかどうかを調べるには、パブリック プロパティの TPvDatabase.IsSecured で確認することができます。セキュリティで保護されたテーブル、およびユーザー名とパスワードの入力要求も参照してください。
メモ:MicroKernel エンジン セキュリティはオーナー ネームを使用します(テーブル セキュリティを参照してください)。データベースで SQL セキュリティが有効になっている場合、オーナー ネーム セキュリティは無視されます。
PDAC と Embarcadero のコンポーネントの相違点
次の表では、Zen と Embarcadero のコンポーネントの機能の違いについてまとめています。
IsSQLBased は常に False を返します。
TransIsolation プロパティの相違点
PDAC の TransIsolation プロパティの動作は、相当する Embarcadero の動きとは違います。
トランザクションの分離レベルでは、同じテーブルで動作するとき、トランザクションがほかで同時に動作しているトランザクションと対話する方法と、ほかのトランザクションによって実行されるオペレーションをトランザクションで監視する程度を決定します。
データベースのトランザクション分離レベルを指定するには、TPvDatabase.TransIsolation プロパティを使用します。
PDAC では tiReadCommitted モードのみをサポートします。これは、トランザクションが終了するまで、ファイルへの変更をほかのユーザーが見ることができないという意味です。これは、データベース エンジンでサポートされる唯一の設定です。
PDAC クラス、プロパティ、イベント、およびメソッド
このトピックでは、PDAC のすべてのクラス、プロパティ、イベント、およびメソッドの一覧を示します。Pascal 表記法で記載し、対応する Embarcadero のコンポーネントとの相違点も示しています。
•
•
•
•
•
•
例外クラス
EpvDatabaseError クラス
このクラスは PDAC のすべての例外クラスの上位クラスです。これには例外を生成するクラスへの参照が含まれる Owner プロパティがあります。
EPvDBEngineError クラス
これは、クラスに関連するすべての DB エンジン エラーの抽象ベースのクラスです。Errors プロパティでは(TPvDBError クラスから派生するクラスの)エラーを一覧表示し、ErrorCount プロパティは Errors プロパティに含まれるエラーの総数を示します。
TPvDBError クラス
TPvDBError は、EPvDBEngineError 例外クラスのデータベース エンジン エラーを表すすべてのクラスに関する抽象ベースのクラスです。以下のプロパティがあります。
•
Message プロパティは、エラー メッセージのテキストを指定します。
•
NativeError プロパティは、エンジンから返されるステータス コード(Btrieve ステータス コード)を示します。
EpvDrmEngineError クラス
このクラスの例外は PDAC の Btrieve サブセットによって発生します。ErrorCode プロパティは DRM エラー コードです。EPvDrmEngineError の Errors プロパティの配列には TpvDrmError タイプのオブジェクトが含まれます。
TpvDrmError クラス
TPvDrmError クラスは DRM エラーを示します。ErrorCode には DRM エラー コードが含まれ、NativeError には Btrieve ステータス コードが含まれます。
EpvSqlEngineError クラス
このクラスの例外は PDAC の SQL(リレーショナル)サブセットによって発生します。ErrorCode プロパティは最後の ODBC 呼び出しの戻り値です。EPvSqlEngineError の Errors プロパティの配列には TPvSqlError タイプのオブジェクトが含まれます。
TpvSqlError クラス
TPvSqlError クラスは ODBC エラーを示します。
EpvDbAdminEngineError クラス
このクラスの例外は、ローカル サーバーおよびリモート サーバー上で、TPvSqlSession.AddAlias などのデータベース名や DSN 管理関数の実行中に発生します。追加のプロパティ ErrorType: TpvDbAdminEngineErrorTypes があります。ErrorType = dbmeDTI の場合、NativeError には DTI(Distributed Tuning Interface)エラー コードが含まれます。それ以外の場合、NativeError にはデータベース名および DSN 関連の関数のローカル エラー コードが含まれます(EPvSqlInstallerEngineError および EpvOwnSqlInstallerEngineError を参照)。
EpvSqlInstallerEngineError クラス
このクラスの例外は、ローカル サーバー上で、TPvSqlSession.AddAlias などの DSN 管理関数の実行中(TPvSqlSession.ServerName プロパティが空またはローカル サーバーの名前が設定されていた場合)に発生します。Errors には、SQLInstallerError() 関数で返される値が含まれます。
EpvOwnSqlInstallerEngineError クラス
DSN 管理関数では適切なエラーがない場合があるので、このクラスの例外を発生して新しいタイプのエラーを示すことができます。NativeError の可能な値は以下のとおりです。
•
•
•
•
サポート クラス
サポート クラスは、高レベルのコンポーネントとカプセル化した BDE 固有の機能で必要となります。これらのクラスは、可能な限り少ない変更で PDAC に 複製されています。
TPvSessionList/TpvSqlSessionList クラス
TPvSessionList および TPvSqlSessionList クラスは、複数のセッションを提供するアプリケーション内のセッション コンポーネントを管理します。このクラスでは、含まれるオブジェクトのタイプのみ(TSession に対応する TPvSession または TPvSqlSession)が変更されています。
TPvBlobStream/TPvSQLBlobStream クラス
TPvBlobStream および TPvSQLBlobStream クラスは、BLOB(バイナリ ラージ オブジェクト)フィールドを示すフィールド オブジェクトをアプリケーションで読み書きできるようにするストリーム オブジェクトです。これらは TBlobStream VCL クラスと同様に機能します。
TParam/TParams クラス
TParam クラスはフィールド パラメータを表します。TParam のプロパティはフィールドの値を示すパラメーターの値を設定するのに使用します。TParams は TParam オブジェクトのリストです。PDAC の TParam と TParams ではそれぞれのインターフェイス セクションの変更はありません。これらは新しいファイルに移動するだけです。
TMasterDataLink クラス
メモ:Delphi/C++Builder 3 および 4 用のみです。
TMasterDataLink を使用すれば、データセットでマスター/詳細関係を設定することができます。このインターフェイス セクションでの変更はありません。新しいファイルに移動するだけです。
VCL との全般的な違い
PDAC コンポーネントで公開するインターフェイスは、BDE で動作する適切な VCL コンポーネントとほぼ一致しています。VCL コンポーネントに関する詳細情報は、Delphi/C++Builder ヘルプ システム(del?vcl.hlp または bcbvcl?.hlp ファイル。「?」は 3、4、または 5 を示します)を参照してください。ただし、BDE のいくつかの機能は Zen に存在せず、また Zen のいくつかの機能は BDE に存在しないので、Zen ではこれらのインターフェイス(削除または追加プロパティ/メソッド/イベント)を修正しました。これらの変更されたインターフェイスのみを以下に列挙します。その他すべてのインターフェイスは同一です。
グローバル変数
BDE の Session および Sessions グローバル変数の代わりに、PDAC では独自のグローバル変数があります。Btrieve サブセット用に BtvSession: TPvSession と BtvSessions: TPvSessionList があり、リレーショナル サブセット用に PvSqlSession: TPvSqlSession と PvSqlSessions: TPvSqlSessionList があります。これらは、Session や Sessions 変数と同様に動作し、アプリケーションの開始時に自動的に作成され、終了時に自動的に破棄されます。
Btrieve サブセット
トランザクショナル サブセットの場合、PDAC では Zen の名前付きデータベースをエイリアスとして使用します。
SQL サブセット
リレーショナル サブセットの場合、PDAC ではデータ ソース名(DSN)をエイリアスとして使用します。
VCL と異なる特定のクラス
以下のセクションでは、Embarcadero VCL とは異なるクラスを個別に説明します。
•
•
•
•
•
•
•
•
•
•
•
•
TPvSession と TPvSqlSession
•
•
•
•
•
•
•
•
•
ヒント: 詳細については、DTI のドキュメントを参照してください。
•
ヒント: DTI は Pervasive.SQL 2000 以降でのみサポートされます。
•
TPvSession に関する注記
•
•
•
•
•
•
•
•
•
var MyList: TStringList;
begin
  MyList := TStringList.Create;
  try
    with MyList do
    begin
      Add('DDF_PATH=D:\MyDemoData');
      Add('PATH=D:\MyDemodata');
      Add('BOUND=False');
      Add('INTEGRITY=False');
      Add('Create_DDF=False');
    end;
    PvSession1.AddAlias('TestAlias', MyList);
  finally
    MyList.Free;
end;
TPvSqlSession に関する注記
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
var MyStringList: TStringList;
begin
  MyStringList := TStringList.Create;
  try
    MyStringList.Clear();
    MyStringList.Add('IS_ENGINE_DSN=False');
    MyStringList.Add('IS_SYSTEM_DSN=True');
    MyStringList.Add('SERVER_NAME=ServerName');
    MyStringList.Add('SERVER_DSN=DEMO1');
         // サーバーの DSN
    PvSqlSession1.AddAlias('ATest', MyStringList);
  finally
    MyStringList.Free;
end;
TPvDatabase と TPvSqlDatabase
•
ヒント: SQLSetConnectAttr() の詳細については、『Microsoft ODBC Programmer's Reference』を参照してください。
•
•
•
•
•
•
•
•
•
•
•
TPvDatabase に関する注記
•
•
•
•
•
•
•
•
このプロパティは、データベースに格納されている文字は OEM(DOS)コード ページによってエンコードされているため、データベースを使用する前にこれらの文字を ANSI(Windows)コード ページに変換する必要があることを示します。データベースは OEM コード ページのままですが、文字データのすべての読み書きは PDAC で変換されます。
この変換では Windows の OemToCharBuff および CharToOemBuff 関数で提供されるマッピングを使用します。すべての文字が往復変換できるわけではないことに注意することが重要です。OEM と ANSI コード ページの両方に存在する文字のみが更新で保持されます。大まかに言うと、ほとんどのアルファベット文字は保持されますが、ボックス描画文字などその他の種類の文字は保持されません。正確に保持できない文字については、最も類似する文字が選択されます。たとえば、ボックス描画文字はプラス(+)、マイナス(-)、およびパイプ(|)文字に置き換えられます。
現在のところ、ユーザー テーブルに保存されている文字のみが変換されます。テーブル、列、およびファイルの名前などの(DDF ファイルに保存されている)メタデータは変換されません。
TPvSqlDatabase に関する注記
•
•
•
•
•
•
•
•
TPvTable、TPvQuery および TPvStoredProc
•
•
•
•
•
•
•
•
•
•
•
TPvTable に関する注記
•
•
•
•
•
•
•
•
CurFilter - Extended オペレーション用の入力データ バッファー構造体へのポインター(『Btrieve API Guide』の GetNextExtended を参照)。また、このバッファーには現在のフィルターも格納されます。
•
•
•
Op - Btrieve オペレーション。『Btrieve API Guide』を参照してください。
•
•
•
•
•
DirectBtrCall は Btrieve ステータス コードを返します。pKeyBuf、KeyLen、および KeyNum パラメーターは PvTable.BtrHandle プロパティから取得する必要があります。
以下に、Btrieve の直接呼び出しによって現在のレコードをロックおよびロック解除する方法を示す小さなサンプルを提供します。
procedure TForm1.Lock(Sender: TObject);
var    b: TBookmark;
       DataLen: word;
       Res: integer;
begin
b := PvTable1.GetBookmark();
try
  DataLen := 4;
  Res := PvTable1.DirectBtrCall(B_GET_DIRECT + 300, b, DataLen, PvTable1.BtrHandle.pKeyBuf, PvTable1.BtrHandle.KeyLen, PvTable1.BtrHandle.KeyNum);
  finally
    PvTable1.FreeBookmark(b);
  end;
end
 
procedure TForm1.Unlock(Sender: TObject);
var   Res: integer;
      vr: Word;
begin
  vr := 0;
  Res := PvTable1.DirectBtrCall(B_UNLOCK, @vr, vr, @vr, vr, -2);
end
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
TPvQuery および TPvStoredProc に関する注記
•
•
•
•
•
•
TPvQuery に関する注記
以下のプロパティが追加されました。
•
LoadBlobOnOpen が True のときは、クエリ オープンですべての BLOB がメモリにキャッシュされます。LoadBlobOnOpen が False のときは、BLOB は必要に応じて読み取られます。
•
このプロパティを True に設定すると、PDAC では SQL テキストを事前解析(通常、パラメーターをバインドするために行う)しないで直接エンジンに渡します。これは、パラメーターを使ってストアド プロシージャを作成する場合などで必要となります。このプロパティは次のように使用します。
procedure TForm1.Button1Click(Sender: TObject);
begin
  PvQuery1.SQL.Clear;
 
  PvQuery1.SQL.Add('CREATE PROCEDURE TestPr(IN :A INTEGER) AS');
  PvQuery1.SQL.Add('BEGIN');
  PvQuery1.SQL.Add('PRINT :A;');
  PvQuery1.SQL.Add('END');
  PvQuery1.PassThrough := True;
  PvQuery1.ExecSQL;
  PvQuery1.PassThrough := False;
end;
PassThrough プロパティは IDE 内で設計時にも使用できます。
TPvStoredProc に関する注記
•
TPvUpdateSQL
•
TPvBatchMove
•
•
Zen および Embarcadero のデータ型
以下のトピックでは、データ型のマッピングについて詳しく説明します。
•
•
Zen および Embarcadero のデータ型のマッピング
次の表は、Zen の列のデータ型から Delphi のデータ型へのマッピングを示しています。Zen データベースに格納されている左側のデータ型は、PDAC コンポーネントにより、右側に記載されているデータ型で表されます。
メモ:現在のリリースでは、PDAC は BIGIDENTITY データ型をサポートしていません。
次の表は、Delphi データ型から Zen データ型へのマッピングを示しています。PDAC を使って新しいデータベース テーブルが作成されると、左側の列に示されるフィールドのデータ型として定義された列が、Zen によって、右側に示されるデータ型で保存されます。
Btrieve および Embarcadero のデータ型のマッピング
次の表は、Btrieve から VCLへのデータ型のマッピングを示しています。
メモ:バイナリ フラグは X$Fields.Xe$Flags のフラグを指します。
 
次の表は、VCL から Btrieve へのデータ型のマッピングを示しています。
メモ:バイナリ フラグは X$Fields.Xe$Flags のフラグを指します。
フィールド タイプの追加情報
Zen 固有のテーブル作成メソッド(TPvTable.PvCreateTable)があります。これを使えば、フィールド タイプに関する追加パラメーターを調整することができます。以下の定義があります。
Procedure PvCreateTable(PvFieldDefs: TPvFieldDefs)
PvFieldDefs でいくつかのパラメーターを調整することができます。
TPvFieldDef = class(TCollectionItem)
public
  FieldNum: integer;
  BtrType: integer;
  DrmType: word;
  ColumnSize: integer;
  DefaultValue: string;
  IsColumnCaseInsensitive: boolean;
  ACS_FileName: string;
  ACS_Name: string;
  ACS_ID: string;
end;
上記の要素は次のような意味があります。
•
•
•
•
•
•
•
•
•
特定のフィールドを設定しない場合は、0(DrmType、ColumnSize の場合)、-1(BtrType の場合)、False(IsColumnCaseInsensitive の場合)、または ''(すべての文字列フィールド)を設定することができます。この場合、デフォルト値を使用します。FieldNum フィールドは必須です。
IsColumnCaseInsensitive、ACS_FileName、ACS_Name、および ACS_ID フィールドは互いに排他的になっています。つまり、これらのうち 1 つのみ設定することができます。
Btrieve 動作と一致させるために、インデックス オプションの ixCaseInsensitive は無視されます。
次に PvCreateTable メソッドの使用例を示します。
with PvTable1.FieldDefs do
begin
  Clear;
  Add('F_AutoInc', ftAutoInc, 0, true);
  Add('F_Bytes', ftBytes, 10, False);
end;
 
PvFieldDefs := TPvFieldDefs.Create(TPvFieldDef);
try
  PvFieldDef := PvFieldDefs.Add();
  PvFieldDef.FieldNum := 1; // F_Bytes
  PvFieldDef.BtrType := 10;
  PvFieldDef.DrmType := DRM_coltypVarText;
  PvFieldDef.ColumnSize := 20;
  PvFieldDef.IsColumnCaseInsensitive := true;
 
  PvTable1.PvCreateTable(PvFieldDefs);
finally
  PvFieldDefs.Free();
end;