|
このセクションでは、Delphi での Btrieve API の使用について説明します。作業項目は以下のとおりです。
Btrieve ファイルを開くには、Open(0)オペレーションおよび以下の情報を指定して BTRV を呼び出します。
BTRV 呼び出しをするために、ファイル名をキー バッファーに入力し、オーナー ネームをデータ バッファーに入力します。両方のパラメーターは、「ヌルで終了」している必要があります。DataLength パラメーターには、データ バッファーの長さを入力する必要があります。
ポジション ブロックは、ファイルが開いている間、有効なスコープで宣言する必要があります。ポジション ブロックは、関数の呼び出し中のカレンシー データおよびその他の情報を保存するために使用されるため、この変数は、ファイルに関連するすべての Btrieve 呼び出しから有効かつ参照可能である必要があります。
例
var Status:smallint; PosBlock:array[1..128] of byte; DataBuffer:array[0..8] of char; KeyBuffer:array[0..254] of char; DataLength:word; KeyNumber:byte; [. . .] // オーナー ネーム(ある場合)を DataBuffer に設定し、長さも指定する fillchar(DataBuffer, sizeof(DataBuffer), #0); DataBuffer := ''; // このファイルには、オーナー ネームなし DataLength := length(DataBuffer); // KeyBuffer にファイル名を入力する fillchar(KeyBuffer, sizeof(KeyBuffer), #0); KeyBuffer := 'g:¥psql¥sdk¥pviddb¥data¥customer.mkd'; // KeyNumber を 0 に設定 KeyNumber := 0; // パラメーターを指定して Btrieve を呼び出す Status := BTRV( B_OPEN, PosBlock, DataBuffer, DataLength, KeyBuffer, KeyNumber); // 返されたステータスを確認 ShowMessage('Open returned ' + intToStr(Status)); [. . .]
Btrieve ファイルを閉じるには、Close(1)オペレーションで BTRV を呼び出し、開いているファイルのポジション ブロックを渡します。ステータスが返され、この操作が正しく完了したかどうかを確認できます。
例
[. . .] Status := BTRV( B_CLOSE, PosBlock, DataBuffer, DataLength, KeyBuffer, KeyNumber); ShowMessage('Close returned ' + intToStr(Status)); [. . .]
ファイルを作成するには、新しい Btrieve ファイルの作成に必要な情報を含む構造体を作成する必要があります。この構造体を作成する最も簡単な方法は、BTRV 呼び出しが実行される前に集計される複数の小さい構造体を作成することです。Create(14)関数呼び出しに渡される構造体についての詳細は、プログラマ用のドキュメントを参照してください。
例
{****************************************************** Stat および Create 処理用のレコードの型定義 ******************************************************} type // ファイル仕様 - ファイル 1 つにつき 1 つの構造体 FILE_SPECS = packed record recLength :smallint; pageSize :smallint; indexCount :smallint; reserved :array[0..3] of char; flags :smallint; dupPointers :byte; notUsed :byte; allocations :smallint; end; // キー仕様 - ファイル内のキー セグメント 1 つにつき 1 つの構造体 KEY_SPECS = packed record position :smallint; length :smallint; flags :smallint; reserved :array[0..3] of char; keyType :char; nullChar :char; notUsed :array[0..1] of char; manualKeyNumber :byte; acsNumber :byte; end; // 集合バッファーには、1 つの FILE_SPECS と、 // キー セグメントと同数の KEY_SPECS 構造体が入る FILE_CREATE_BUF = packed record fileSpecs :FILE_SPECS; // ここでは、拡張性を考慮して配列を使用 keySpecs :array[1..1] of KEY_SPECS; // 1 つのキー セグメント end; {****************************************************** ファイル仕様構造体を作成して値を入力 ******************************************************} var NewFileSpec :FILE_CREATE_BUF; DataLength :smallint; KeyBuffer :array[0..254] of char; KeyNumber :byte; PosBlock :array[1..128] of byte; [. . .] fillchar(NewFileSpec, sizeof(NewfileSpec), #0); With NewFileSpec.fileSpecs do begin recLength := 100; pageSize := 4096; indexCount := 3; // インデックスの数(キー セグメント数ではない) reserved := 0; flags := 0; dupPointers := 0; notUsed := 0; allocations := 0; end; With NewFileSpec.keySpecs[1] do begin position := 0; length := 4; flags := 0; // 予約済み // 必要なし - fillchar() によって NULL 化済み keyType := 1; nullChar := 0; // 使用せず // 必要なし - fillchar() によって NULL 化済み manualKeyNumber := 0; acsNumber := 0; end; {****************************************************** ファイル パスとファイル名の指定 ******************************************************} fillchar(KeyBuffer, sizeof(KeyBuffer), #0); KeyBuffer := 'c:¥test.mkd'; {****************************************************** Key Number を設定。警告せずに上書きする場合は 0、ファイルが存在する場合にエラーとする場合は -1。 ******************************************************} KeyNumber := 0; {****************************************************** Btrieve Create オペレーションを呼び出し、返されたステータスを確認 ******************************************************} Status := BTRV( B_CREATE, PosBlock, NewFileSpec, DataLength, KeyBuffer, KeyNumber); ShowMessage('Create returned ' + intToStr(Status));
例
Status := BTRV( B_INSERT, PosBlock, DataBuffer, DataLength, KeyBuffer, KeyNumber); ShowMessage('Insert returned ' + intToStr(Status));
例
Status := BTRV( B_UPDATE, PosBlock, DataBuffer, DataLength, KeyBuffer, KeyNumber); ShowMessage('Update returned ' + intToStr(Status));
例
Status := BTRV( B_DELETE, PosBlock, DataBuffer, DataLength, KeyBuffer, KeyNumber); ShowMessage('Delete returned ' + intToStr(Status));
Step オペレーションは、インデックスを使用せずにレコードを返します。
Get オペレーションは、インデックスを使用してレコードを返します。
セグメント インデックスは、セグメントを持たないインデックスと同じように使用できますが、キー バッファーに値を入力する際に注意が必要です。
キー バッファーには、キーと同じ形式で値を入力する必要があります。整数フィールドおよびその他のバイナリ フィールドでは、キー バッファーの情報は、バイナリ形式である必要があります。それ以外の文字列型では、データは、Btrieve ファイルに表示される形式とまったく同じ形式で表示される必要があります。
キー バッファーのレコードは、Variant Record(「C」では、「共用体」)として定義すると便利です。次のキー バッファーの種類は、異なる複数のセグメント キー タイプおよびセグメント化されていないキー タイプに対して使用できます。
例
type KEY_BUFFER_TYPE = packed record case integer of 1: ( IDNumber:integer; Filler1:array[1..255 - sizeof(integer)] of char; ); 2: ( LastName:array[0..23] of char; FirstName:array[0..23] of char; Filler2:array[1..255 - 24 - 24] of char; ); 3: ( ZipCode:array[0..9] of char; Filler3:array[1..255 - 10] of char ) end; [. . .] var KeyBuffer:KEY_BUFFER_TYPE; [. . .] fillchar(KeyBuffer, sizeof(KeyNumber), #0); KeyBuffer.IDNumber := 1047; Status := BTRV( B_GET_EQUAL, PosBlock, DataBuffer, DataLength, KeyBuffer, KeyNumber);
データを検索するには、キーを使用してデータベース内の行を検出します。
実際の行ではなくファイル内のキーのみを検出(存在しているものと仮定)するには、GetEqual、GetNext、GetFirst、GetLast のいずれかのオペレーション番号に +50(btrconst.pas の KEY_BIAS)を追加します。
例
// キーのみを取得 -- レコードは取得しない Status := BTRV( B_GET_EQUAL + KEY_BIAS, PosBlock, DataBuffer, DataLength, KeyBuffer, KeyNumber);
|