Contactお問い合わせ
お気軽にお問い合わせください。
VB(32bit) から Pervasive.SQL の Btrieve API を直接呼びたい場合、数値型変数の Byte Alignment の問題を回避するために、基本的に三つの方法があります。
1)Btrieveとの受け渡しに、ユーザ定義型を使わない。
2)データバッファに使うユーザ定義型の中で、数値変数のかわりにバイト型配列を使う。VB内ではバイト型配列を数値変数に変換してから使用する。変換する方法は様々あります。
3)もう一つの方法が弊社のPervasive.SQL SDK製品に同梱されているPervasive Btrieve Alignment DLL (PALN32.DLL)を使う方法です。プログラムの初めに、DDFからBtrieveファイル構造をPALN32.DLLに読み込めば、あとはVBのプログラムに一行追加するだけで、レコード内容の正しい読み書きが可能になります。
Visual Basic では、32 ビット・アプリケーションをコンパイルするときに、UDT (ユーザ定義データ型) のメンバーの配置を、その個別のメンバーのサイズに応じて、8 ビット、16 ビット、または 32 ビット境界に合わせます。構造体とは異なり、データベース行はパックされます。つまり、フィールドとフィールドの間に未使用領域はありません。アライメントをオフにする手段はないため、Visual Basic アプリケーションがデータベースにアクセスできるように構造体のパック、アンパックを行うための方法が必要です。Pervasive Btrieve Alignment DLL (PALN32.DLL) はこのようなアライメント問題に対処するために作られています。
Visual Basic の場合、いろいろな変数のビット境界で要素のアライメントが行われます。次の表はさまざまなデータ型をまとめたもので、Visual Basic の処理の仕方を示しています。
Visual Basicの型 | 型定数 | 標準サイズ(バイト数) | 境界 |
---|---|---|---|
Byte | FLD_BYTE | 任意 | 1 バイト(なし) |
String | FLD_STRING | 任意 | 1 バイト(なし) |
Boolean | FLD_LOGICAL | 2 | 2 バイト |
Integer | FLD_INTEGER | 2 | 2 バイト |
Currency | FLD_MONEY | 4 | 4 バイト |
Long | FLD_INTEGER | 4 | 4 バイト |
Single | FLD_IEEE | 4 | 4 バイト |
Double | FLD_IEEE | 8 | 4 バイト |
プログラムからは、BTRCALL 関数を呼び出してVisual Basic の Btrieve 呼出しを利用します。この関数を利用するには、プロジェクトにBTRAPI.BASモジュールを含めます。
その他の必要な関数はPALN32.DLL の中にあります。
PALN32.DLL をプロジェクトに含める方法
[プロジェクト]->[参照設定] の順にクリックし、Pervasive Btrieve Alignment Library モジュールをチェックします。
表示されない場合には、[参照] をクリックしてファイルを指定し、リストに追加します。
次の表は、各関数およびその関数が必要とする特定のモジュールの一覧です。
関数 | 目的 | 場所 | パラメータ | 戻り値 |
---|---|---|---|---|
RowToStruct | 1 行分のByte 型データを VisualBase UDT に変換します。 | PALN32.DLL |
≫ row (1 to n) As Byte パックされたデータを取得するための入力配列。 ≫ fld (1 to n) As FieldMap 個々のフィールドのデータ型を決定するために使用する FieldMap 配列。 ≫udt As Any データを格納するためのUDT。 ≫ udtSize As Long UDT のサイズ。LenB( )を使用してこの値を生成します。 |
≫ Integer OK であれば 0。そうでない場合には、エラーが発生しています。 |
SetFieldMap | FieldMap 要素のメンバーを設定します。 | PALN32.DLL |
≫ map As FieldMap FieldMap 配列の要素。 ≫ dataType As Integer フィールドの種別で、次の定数上で渡されます。 – FLD_STRING – FLD_INTEGER – FLD_IEEE – FLD_MONEY – FLD_LOGICAL – FLD_BYTE – FLD_UNICODE ≫ size As Long データベースに格納されるフィールドのサイズ(バイト数)。 |
≫ Nothing |
SetFieldMap FromDDF | FieldMap 型の配列の、すべてのメンバーを設定します。 | PALN32.DLL |
≫ path As String データ・ソースに渡す完全なパス名。 ≫ table As String テーブルの名前。 ≫ userName As String 予約済み。ヌル文字列を渡します(たとえば、””)。 ≫ passwd As String 予約済み。ヌル文字列を渡します(たとえば、””)。 ≫ map (1 to n) As FieldMap 書込み先のFieldMap 配列。レコードの中のフィールド数に従い、それぞれ正確な要素数が入っていなければなりません。 ≫ unicode As Integer 文字列がASCII 文字としてレコードの中に保存されている場合には 0。そうでない場合には、Unicode として格納されます。 |
≫ Integer OK であれば0。そうでない場合には、エラーが発生しています。 |
StructToRow | Visual Base UDT を 1 行分の数の Byte 型データに変換します。 | PALN32.DLL |
≫ row (1 to n) As Byte パックされたデータを格納するための出力配列。 ≫ fld (1 to n) As FieldMap 個々のフィールドのデータ型を決定するために使用する FieldMap 配列。 ≫ udt As Any データが取得されるUDT。 ≫ udtSize As Long UDT のサイズ。LenB( )を使用してこの値を生成します。 |
≫ Integer OK であれば 0。そうでない場合には、エラーが発生しています。 |