ENGLISH

Microsoft Visual Basic 6 と
Pervasive.SQL 2000i を使った
アプリケーションの開発

※ Pervasive.SQL 2000i 作成資料ですが、Actian Zen の下位互換性によって、Actian Zen / PSQL 製品でも参考資料としてご利用ください。

 

1.はじめに
2.Btrieve API
3.ActiveX コントロール
4.ODBC
5.ADO 経由の OLE DB
6.結論

付録A:Btrieve API のサンプル
付録B:Btrieve API のサンプル
  :Zen Btrieve Alignment DLL(PALN32.DLL)を使用

付録C:ActiveX のサンプル
付録D:DAO のサンプル
付録E:RDO のサンプル
付録F:ODBC を使用する ADO のサンプル
付録G:OLE DB を使用するADO のサンプル

 

1.はじめに

Pervasive.SQL 2000i の目的は、主なソフトウェア開発環境におけるアプリケーション開発に必要とされるツールを提供することです。Pervasive.SQL 2000i SDK には、ODBC、ODBC 経由の ADO、OLE DB 経由の ADO、ActiveX コントロール、そしてもちろんネイティブの Btrieve API など、あらゆる主要データ アクセス インタフェースに対するアクセスを提供するコンポーネントが含まれています。

使いやすさを優先して設計されている Microsoft Visual Basic は、開発者の間でも人気を博しています。この Microsoft Visual Basic は、多様なデータベース アクセスのオプションに対応し、タイプを問わずあらゆるアプリケーションに適しています。ODBC から、ADO、RDO さらにネイティブアクセスまで、Visual Basic によって、開発者は、キラー アプリケーションの開発に必要とされる柔軟性を得ることができます。

インタフェースの選択は、開発プロセスにおけるきわめて重要な要素です。適正なデータアクセスの方法を選択できるかどうかが、「まあまあのアプリケーション」と「優秀なアプリケーション」の分かれ目になります。このようなアクセス方法の選択は、アプリケーションのニーズや展開環境のニーズ、各インタフェースの長所を比較検討して決定すべきであり、「開発の速度」「開発の容易さ」「他のアプリケーションとの互換性」のバランスが要求されます。たとえば、Btrieve API は、データ アクセスにおける最高のパフォーマンスを提供しますが、その反面、その開発には相当な労力を要します。また、ActiveX コントロールは、Btrieve API よりも速度が劣りますが、開発が容易であり、速度は他の方法よりも優れています。ODBC と OLE DB は、開発はきわめて容易ですが、余分なレイヤの存在によって速度で劣ります。ActiveX コントロール、ODBC、OLE DB はいずれも、グリッド、リスト ボックスなどの標準およびサードパーティ製データ認識コントロールを使用することができ、開発速度の向上が可能です。

本書は、開発者の皆さんが Visual Basic を使用する際に利用することのできる Pervasive.SQL 2000i のさまざまなデータ アクセス オプションについて示します。それぞれの代替アクセスの方法、また、それぞれの長所と短所に関しても検討していきます。また、適正な使い方の例としてサンプルコードも示します。

 

2.Btrieve API

Btrieve API は、あらゆるインタフェースと比較して、パフォーマンスの点で優れています。成熟度においても他を凌ぎ、以前から多くのアプリケーションに使用されてきた実績もあります。「速度」がアプリケーションにおける最も重要な要素である場合には、Btrieve API を選択すべきです。この API は、データ入力アプリケーション、大量のデータ転送、基本的なローレベルデータベース アクセスにおいてもきわめて優れています。Btrieve API では、データファイルの取り扱いにおいて DDF(Data Dictionary File データ辞書ファイル)は使用せず、また必要としません。

付録A にサンプルがあります。各機能の概要と各機能を利用する(ために必要な環境については、『Btrieve API Guide』マニュアルを参照してください。

Btrieve API 呼び出しは、基本的には次の7つのパラメータで構成されています詳細はマニュアルに示されています)。

Status = BTRCALL(Operation, PosBlk, DataBuffer, DataBufferLen, KeyBuffer, KeyBufferLen, KeyNumber)

Operation は、実行すべき Btrieve オペレーションです。
  (Open、Get First、Insert、Stopなど)

PosBlk は、ポジションブロックです。どのデータ ファイルを使用するか識別するために、Btrieve 呼び出しでかならず使用する変数です。
  Open 呼び出しの前に、128 バイト長で定義し、バイナリゼロに初期化します。
  このパラメータの直接の変更は避けてください。

DataBuffer パラメータは、アプリケーションと Btrieve エンジンの間でのデータの受け渡しに使用します。Open 呼び出しで必要に応じ、オーナー名や、Insert、Get 操作で Record イメージを受け渡しに使用されます。通常は、UDT として定義します。

DataBufferLen は、DataBuffer パラメータのデータ長です。

KeyBuffer は、データのサーチ、取り出し用のインデックス値を格納します。Open 呼び出しでファイル名を渡す場合にも使用します。

KeyBufferLen は、KeyBuffer パラメータの長さです。

KeyNumber パラメータは、特定の呼び出しで使用するインデックスを指定します。 Version 呼び出しなどの各種呼び出しで返されるデータのバリエーションも指定します。

Visual Basic での Btrieve API の使用は、きわめて簡単です。Btrieve ファイルに対するオペレーションを行うには、その前にまず「開く(Open)」か「新規作成(Create)」によってファイルを開きます。ファイルを開いた後にデータを取り出すには、インデックスを使用する Get First、Get Next、Get Last、Get Previous を実行するか、または、インデックスを使用しない「Step」を実行するだけです。この他にも、目的のレコードまで直接移動する「Get」オペレーション、条件を満たすレコードを検索する「Get」オペレーションもあります。最適なパフォーマンスを得るには、Extended オペレーション(GetNextExtended と StepNextExtended)を使って、1回の関数呼び出しで複数のレコードを取り出すことができます。レコードの挿入、削除、更新には、それぞれ Insert、Delete、Update 関数を使用します。

Btrieve API の呼び出しはきわめて高速であり、広く使用されていますが、開発者が注意すべき点がいくつかあります。Visual Basic の最初の 32 ビット バージョンである v4.0 以降、Btrieve API と Visual Basic に関する 2 つの大きな問題点があり、解消されていません。そのうちの1つの問題は一般に、「アライメントの問題」と呼ばれています。Visual Basic v4.0(とそれ以降のすべて)のリリースで、Visual Basic は、ワード境界でユーザー定義データ型(UDT)のメンバのアライメントを合わせます。これは何を意味するのでしょうか。これは、あるレコードを定義する UDT に Long、Integer、Single、Double その他の 4 もしくは 8 バイト数値データ型が含まれている場合に、その変数は、このアライメントを合わせるため数バイトがプッシュアウト(棄却)される、ということです。残念ながら、これを無効にする手だてはありません。

もう 1 つの問題は、日本語など 2 バイト OS を使用するときに発生する問題です。Type String として定義されている変数が、(Btrieve API などの)DLL に渡されるときに、Unicode からシステムのデフォルトのコードページに変換される(逆も同様)問題です。この問題についても、残念ながらこの変換を無効にする方法はありません。つまり、これは、Btrieve API に渡される文字列でないパラメータを Type String として定義してはいけない、ということです。

上記の問題に対処する最も安全な方法は、Btrieve API の Data Buffer、Key Buffer、Position Block パラメータに、バイト配列またはバイト配列の UDT を使用することです。そのあと UDT 内の数値および文字列データをプログラムの内部でバイト配列へ/からコピーすることができます。

これには、基本的に 2 つの方法があります。

1) 1 つの方法は、Windows API の RTLMoveMemory などのメモリコピー機能を使用することです。また、文字列データが Zen データベースに Unicode で格納されていない場合には、(VB 文字列ではUnicode で格納されているため)Visual Basic の StrConv 関数を使ってデータベースで使用されているエンコーディングから Unicode に変換する必要があります。この例を付録A に添付します。

2) これより簡単なもう 1 つの方法は、Zen Btrieve Alignment DLL(PALN32.DLL)を使用することです。この DLL が、開発者であるあなたに代わってメモリコピーと Unicode 変換を実行してくれます。この例を付録B に添付します。この DLL と関連する資料・サンプルコードは、こちらにある paln32.exe に含まれています。

『Pervasive.SQL API Programmer’s Reference(Btrieve API Guide)』には、すべての Btrieve API 関数についての詳しい説明があります。Zen Btrieve Alignment DLL については、『Zen Programmer’s Guide』に詳しく説明されています。Btrieve API 関数の説明のほかに、Btrieve SDK(index)には、Btrieve API およびその他の方法による Btrieve データへのアクセスの実例を示すいくつかのサンプル・アプリケーションも付属しています。

 

3.ActiveX コントロール

ActiveX コントロールは、Pervasive.SQL v7.0 SDK からその提供が開始され、Pervasive.SQL 2000i エンジンとの併用のためのアップデートが行われています。ActiveX コントロールは、もともとは Smithware のコンポーネントでしたが、現在では大幅に変更されています。ActiveX コントロールの性質、ActiveX コントロールとビジュアル開発環境の間で利用可能なインテグレーションによって、ActiveX コントロールを使った開発は、多くの場合、よりローレベルな Btrieve API を使ったコーディングよりも高速です。また、ActiveX コントロールは、Visual Basic 内部のネイティブデータ認識コントロールにバインドすることができます。ActiveX コントロールは、設計時に DDF(Data Dictionary Files)を必要としますが、設計時に取得したフィールド情報を維持するため、配布時には DDF を必要としません。

一般に、ActiveX コントロールの速度は Btrieve API に劣らず、高速です。これは、直接 Btrieve API を呼び出し、ODBC、OLE DB を使用しないことに理由があります(設計時にはファイル、フィールド、インデックス情報の取得用に DDF を使用します)。ActiveX コントロールの使い方はいたって簡単であり、各 Btrieve オペレーションがそのまま ActiveX コントロールのメソッドに対応します(たとえば、Get First オペレーションは Vaccess1.GetFirst となります)。

各メソッドとプロパティについての説明は、『ActiveX Controls Guide』を参照してください。

サンプルは付録C にあります。

 

4.ODBC

Btrieve API と ActiveX コントロールは、ともにトランザクショナル データ アクセスの方法です。これは、きわめてローレベルなモデルであり、個々のトランザクションの速度を目的とする場合には、最適のパフォーマンスを提供します。これに対して、データベースにクエリーをかけて特定の結果セットとデータ列を返す場合には、SQL 構文を使用するリレーショナル データ アクセスがより適したインタフェースとなります。

トランザクショナルとリレーショナルの両方のデータ アクセス方法をミックスし、マッチさせる機能が、Pervasive.SQL 2000i の特長のひとつです。適正なオペレーションに適正な API を使用することによって、開発者はタスクに合わせた最適のツールを活用するための柔軟性を得ることができます。

データベース プラットフォームの違いを克服するデータ アクセス技術のなかで最も広く使用されているのは、おそらく ODBC でしょう。ODBC は、複数の異種データベース バックエンドに対応する単一の共通インタフェースとして Microsoft が開発したものであり、正確には Open DataBase Connectivity といいます。ODBC を経由することによって、Zen と Btrieve データに対する、SQL クエリーによるリレーショナル アクセスが可能となります。Zen の ODBC ドライバは、他の ODBC ドライバと同様、DDF が下層の Btrieve データ ファイルに関して正確で完全な記述を示すことを求めます。ODBC で最適なパフォーマンスを得るには、正確な DDF が必須です。DDF と下層のデータ ファイルがマッチしない場合、パフォーマンスが低下したり、不正確な結果セットが返されることになります。

ODBC と Btrieve API はまったく別の物です。同じような動作が可能ですが、それぞれのフォーマットには大きな違いがあります。ODBC は、構造化問い合わせ言語(Structured Query Language; SQL)を使ってデータに対するアクセスを行い、Btrieve API は、各種読み出しオペレーションによってフラット ファイルとしてのレコードにアクセスを行います。SQL では、Btrieve のアクセス方法とは対照的に、ステートメントを最適化して特定のフィールドだけを返すようにエンジンに指示することができ、これによって帯域幅要求を減らし、特定のオペレーションの高速化を行うことができます。これに対して、レコードを読み出す Btrieve API 呼び出しでは、レコード全体が返されるため、特定のフィールドへのアクセスには、アプリケーション側におけるレコード解析が必要となります。

つい見逃されがちなことですが、SQL ステートメント自体も、パフォーマンスの最適化に関わるもうひとつの要素です。拙い構造の SQL ステートメントが、パフォーマンスを大きく劣化させる場合があります。

Visual Basic からの ODBC の呼び出しにはいくつかの方法があり、コーディングのしやすさ、標準データ認識コントロールの使用など、それぞれに長所と短所があります。ODBC インタフェースを使用する方法としては、Data Access Object(DAO)、Remote Data Objects(RDO)、ActiveX Data Objects(ADO)、ODBC API があります。

DAO(Data Access Objects)は、ODBC データソースへの標準アクセスであり、Visual Basic v2.0 以降で提供されています。DAO は、JET データベースエンジンを使って ODBC ドライバにアクセスするため、パフォーマンスの面において他の方法には及びません。DAO にアクセスするにはコードを使うか、標準データコントロールを使います。DAO を使った接続のサンプルを付録D に記載します。

RDO(Remote Data Objects)は、ODBC データソースに対する最も速いアクセスの方法として、Visual Basic v4.0 で追加されました。RDO は、DAO よりも高い柔軟性を持ち、データ認識コントロールへの接続機能を維持しています。SQL ステートメントへの対応の面でも、RDO は DAO と遜色ありません。RDO の DAO との違いは、それ自身のクエリープロセッサーを内蔵していない点です。RDO は ODBC ドライバにクエリーを送りますが、これは通常、DAO よりも優れたパフォーマンスをもたらします。接続の構文も若干異なります。このサンプルは付録E にあります。

ADO(for ODBC)インタフェースは、RDO ときわめてよく似ています。ADO は、Visual Basic v6.0 から広く用いられるようになり、OLE DB を使用するまでの 1 つのステップとなっています。Zen ODBC インタフェースによる具体的なパフォーマンス テストは実施していませんが、処理速度の面でも ADO と RDO は近似しています。ADO(for ODBC)インタフェースを使用する場合、AdCmdTableDirect メソッドによってテーブルを開くことはできません。

ODBC API は、ODBC に対する最も速いアクセスの方法です。同時に、使い方が最も複雑な方法でもあります。この API に関するよい参考文献は、『Microsoft ODBC Programmer’s Reference』です。ここには API の詳細が記述されており、このインタフェースに関心のあるすべての開発者に一読をお薦めします。

Zen ODBCインタフェースで使用されるSQL構文については、『SQL Engine Reference』マニュアルが参考になります。DAO、RDO、ADOの詳細は関しては、Microsoftにお問い合わせください。

ADO、DAO、RDOがデータ認識コントロールを使用するのに対して、ODBC APIはデータ認識コントロールを使用することができません。大半の開発者は、ODBC経由のデータアクセスにADOを用います。ADOは、最も柔軟なアクセスの方法であり、APIコードの記述を行わずに最適なパフォーマンスを得ることができます。RDOはDAOよりも高速であり、使いやすさでも劣らないため、ADOの代替となる優れた方法です。

 

5.ADO経由のOLE DB

Pervasive.SQL 2000のリリースに伴い、開発者の選択肢にOLE DBプロバイダという新しいインタフェースが加わりました。Pervasive.SQL 2000 SP2a以前は、プロバイダがサポートするのはiRowsetのみであり、SQL構文のサポートは提供されていませんでした。Pervasive.SQL 2000i(Service Pack 3)のリリースによって、iRowsetとiCommandのフルサポートが提供されるようになりました。OLE DBプロバイダは、ODBCインタフェースと同様にフィールドとインデックスの情報にDDFを使用しますが、ODBCと違い、リレーショナルとトランザクショナルの両方のインタフェースに対するアクセスが可能です(注:Pervasive.SQL 2000i SP3 OLE DBプロバイダを使うことで、はじめてリレーショナルアクセスが可能となりました。それ以前のバージョンはリレーショナルアクセスには対応していませんでした)。これにより、SeekメソッドとSQLステートメント送信機能の使用が可能となりました。

一般に、OLE DBプロバイダは、ADOとODBCドライバを使用するよりも高速であり、また、アプリケーション開発において、データアクセスにadCmdTableメソッドを使用することができます。このメソッドは、直接マイクロカーネルに行き、リレーショナルエンジンをバイパスします。これは、ビジュアルデータ認識コントロールの使用に対応しながら、さらにパフォーマンスを向上させることになります。OLE DBプロバイダではまた、アプリケーション開発にAdCmdTableDirectを使用することができます。これは、ODBCドライバではできません。

 

6.結論

Visual Basicを使ってデータにアクセスする方法として、Zenにはいくつかのオプションが提供されています。Btrieve APIからADOコントロール、さらにODBCインタフェースまでの各オプションには、開発が容易なオプション、柔軟性に優れたオプションなど、それぞれの特長があります。

開発者の皆さんには、アプリケーションやタスクにおいて達成すべきゴールに照らして、各インタフェースをひとつずつ慎重に比較検討することを求められます。しかし、Pervasive.SQL 2000iは、ただひとつのアクセス方法を選択するよう強制したり、制約を課したりすることはありません。開発者は、アプリケーション全体を通して複数のアクセス方法をミックスしてマッチさせ、適正なタスクに適正なツールを使用することができます。

 

付録A:Btrieve APIのサンプル

以下は、サンプル アプリケーションのサブセットです。こちらからダウンロード可能です。(「AppendixA.exe」をお選びください)

このサンプルでは、ファイルを開き、その後、ファイルにあるデータを Visual Basic Form で表示し、更新を可能にしています。Visual Basic v6.0 SP5によってテストが行われています。追加のサンプルとBtrieveオペレーションの詳細な説明については、『Btrieve API Guide』マニュアルを参照してください。

オペレーション コード の定義
Global Const BOPEN = 0
Global Const BCLOSE = 1
Global Const BINSERT = 2
Global Const BUPDATE = 3
Global Const BDELETE = 4
Global Const BGETEQUAL = 5
Global Const BGETNEXT = 6
Global Const BGETPREVIOUS = 7
Global Const BGETGREATEROREQUAL = 9
Global Const BGETFIRST = 12
Global Const BGETLAST = 13
Global Const BCREATE = 14
Global Const BSTAT = 15
Global Const BBEGINTRANS = 19
Global Const BTRANSSEND = 20
Global Const BABORTTRANS = 21
Global Const BGETPOSITION = 22
Global Const BGETRECORD = 23
Global Const BSTOP = 25
Global Const BVERSION = 26
Global Const BRESET = 28
Global Const BGETNEXTEXTENDED = 36
Global Const BGETKEY = 50
’ステータス コード の定義
Global Const B_NO_ERROR = 0
Global Const B_END_OF_FILE = 9

Global Const KEY_BUF_LEN = 255     ’キーバッファ長(バイト)
’キーの最大長は 255 なので、常に 255 バイトのキー バッファにすることをお勧めします。

Global Const POS_BLOCK_LEN = 128   ’ポジションブロック パラメータ長(バイト)

Type posblk                   ’ポジションブロックの構造の定義
   pbelements(0 To POS_BLOCK_LEN – 1) As Byte
End Type
’Btrieveエントリポイントの定義
Declare Function BTRCALL Lib “w3btrv7.dll” (ByVal OP As Integer, PB As Any, _
   Db As Any, DL As Integer, Kb As Any, ByVal Kl As Integer, _
   ByVal Kn As Integer) As Integer
Declare Sub CopyMemory Lib “Kernel32” Alias “RtlMoveMemory” _
   (Destination As Any, Source As Any, ByVal NumBytestoCopy As Long)

Global Const MachineRowSize = 45     ’レコード長

Type rec_tmp                   ’レコードの構造定義
   maker As Byte               ’string メーカID
   m_id(1 To 2) As Byte           ’integer マシンID
   m_no(1 To 4) As Byte           ’long マシンNo
   m_name(1 To 30) As Byte        ’string * 30 マシン名
   teika(1 To 4) As Byte           ’long 定価
   nebiki(1 To 4) As Byte          ’float 値引き率
End Type
Global rec_buff As rec_tmp           ’レコードバッファの定義
Type wrec_tmp                   ’作業用レコードの構造定義
   maker As String
   m_id As Integer
   m_no As Long
   m_name As String * 30
   teika As Long
   nebiki As Single
End Type
Global wrec_buff As wrec_tmp         ’作業用レコードバッファの定義
Global posblock As posblk           ’ポジションブロックの定義
Global buflen As Integer            ’バッファレンクス
Type kb_tmpb                   ’キーバッファ構造の定義
   keybuff(1 To 255) As Byte
End Type
Global kb_datb As kb_tmpb           ’キーバッファの定義
Global intw As Integer              ’定数設定用ワーク変数
Global longw As Long              ’定数設定用ワーク変数
Global floatw As Single             ’定数設定用ワーク変数
Global tmpb() As Byte              ’UniCode→AnsiCode変換用
Global dmy(1 To 10) As Byte          ’ダミーデータバッファ
Sub main()                     ’メイン処理(BtrieveファイルのOPEN)
  Dim m_no As Long
  Dim fname As String
  Dim fnlen As Integer
  fname = App.Path & “¥machine.btr”       ’┐
  fnlen = LenB(StrConv(fname, vbFromUnicode))’│
  tmpb = StrConv(fname, vbFromUnicode)    ’│UniCodeからAnsiCodeに
  For i = 1 To fnlen                   ’│変換しByte型の変数に
     kb_datb.keybuff(i) = tmpb(i – 1)        ’│ 代入する
  Next i                          ’┘
  kb_datb.keybuff(fnlen + 1) = 0       ’終端にNULLターミネータを付加する
’*********** Btrieveファイルのオープン
  buflen = 0
  stat% = BTRCALL(BOPEN, posblock, dmy(1), buflen, kb_datb, KEY_BUF_LEN, 0)
  If stat <> B_NO_ERROR Then
    MsgBox “ファイルのOpenに失敗しました。ステータス コード = ” + CStr(stat%)
  Else
    MsgBox “ファイルのOpenに成功しました。”
  End If
’*********** Btrieveファイルの1レコード目を読み込む
  buflen = MachineRowSize
  stat% = BTRCALL(BGETFIRST, posblock, rec_buff, buflen, kb_datb, KEY_BUF_LEN, 0)
 If stat <> B_NO_ERROR Then
    MsgBox “Get Firstに失敗しました。ステータス コード =” + CStr(stat%)
  End If
’*********** データの表示
  Call set_form
  Form1.Show
End Sub

Sub set_form()
’*********** 読み込んだデータを作業用レコードバッファにセットする
  wrec_buff.maker = Chr$(rec_buff.maker)
  Call CopyMemory(wrec_buff.m_id, rec_buff.m_id(1), 2)
  Call CopyMemory(wrec_buff.m_no, rec_buff.m_no(1), 4)
  wrec_buff.m_name = StrConv(rec_buff.m_name, vbUnicode)
  Call CopyMemory(wrec_buff.teika, rec_buff.teika(1), 4)
  Call CopyMemory(wrec_buff.nebiki, rec_buff.nebiki(1), 4)
’*********** 読み込んだデータを表示
  Form1.Text1 = wrec_buff.maker
  Form1.Text2 = CStr(wrec_buff.m_id)
  Form1.Text3 = CStr(wrec_buff.m_no)
  Form1.Text4 = wrec_buff.m_name
  Form1.Text5 = CStr(wrec_buff.teika)
  Form1.Text6 = CStr(wrec_buff.nebiki)
End Sub

 

付録B:Btrieve APIのサンプル :Zen Btrieve Alignment DLL
  (PALN32.DLL)を使用

以下は、サンプル アプリケーションのサブセットです。こちらからダウンロード可能です。(「AppendixB.exe」をお選びください)

このサンプルでは、ファイルを開き、その後、ファイルにあるデータを Visual Basic Form で表示し、更新を可能にしています。Visual Basic v6.0 SP5によってテストが行われています。追加のサンプルとBtrieveオペレーションの詳細な説明については、『Btrieve API Guide』を参照してください。

 

’オペレーション コード の定義
Global Const BOPEN = 0
Global Const BCLOSE = 1
Global Const BINSERT = 2
Global Const BUPDATE = 3
Global Const BDELETE = 4
Global Const BGETEQUAL = 5
Global Const BGETNEXT = 6
Global Const BGETPREVIOUS = 7
Global Const BGETGREATEROREQUAL = 9
Global Const BGETFIRST = 12
Global Const BGETLAST = 13
Global Const BCREATE = 14
Global Const BSTAT = 15
Global Const BBEGINTRANS = 19
Global Const BTRANSSEND = 20
Global Const BABORTTRANS = 21
Global Const BGETPOSITION = 22
Global Const BGETRECORD = 23
Global Const BSTOP = 25
Global Const BVERSION = 26
Global Const BRESET = 28
Global Const BGETNEXTEXTENDED = 36
Global Const BGETKEY = 50
’ステータス コード の定義
Global Const B_NO_ERROR = 0
Global Const B_END_OF_FILE = 9

Global Const KEY_BUF_LEN = 255     ’キーバッファ長(バイト)
’キーの最大長は 255 なので、常に 255 バイトのキー バッファにすることをお勧めします。

Global Const POS_BLOCK_LEN = 128   ’ポジション ブロック パラメータ長(バイト)

Type posblk                   ’ポジションブロックの構造の定義
    pbelements(0 To POS_BLOCK_LEN – 1) As Byte
End Type
’Btrieveエントリポイントの定義
Declare Function BTRCALL Lib “w3btrv7.dll” (ByVal OP As Integer, PB As Any, _
   Db As Any, DL As Integer, Kb As Any, ByVal Kl As Integer, _
   ByVal Kn As Integer) As Integer

Public Type KeyBufferString
   FilePath As String * KEY_BUF_LEN    ’作業用キーバッファの構造定義
End Type

Global OpenFileKeyBuffer As KeyBufferString  ’作業用キーバッファの定義

Global Const MachineRowSize = 45        ’レコード長

Type rec_tmp                      ’レコードの構造定義
   buf(1 To MachineRowSize) As Byte
End Type
Global rec_buff As rec_tmp             ’レコードバッファの定義
Type wrec_tmp                     ’作業用レコードの構造定義
   maker As String * 1
   m_id As Integer
   m_no As Long
   m_name As String * 30
   teika As Long
   nebiki As Single
End Type
Global wrec_buff As wrec_tmp           ’作業用レコードバッファの定義
Global posblock As posblk             ’ポジションブロックの定義
Global buflen As Integer               ’バッファレンクス
Type kb_tmpb                      ’キーバッファ構造の定義
   keybuff(1 To KEY_BUF_LEN) As Byte
End Type
Global kb_datb As kb_tmpb             ’キーバッファの定義

Global dmy(1 To 10) As Byte           ’ダミーデータバッファ

Global OpenFileKeyBufferFldMap (0 To 0) As FieldMap
Global MachineFldMap(0 To 5) As FieldMap

Sub main()                  ’メイン処理(BtrieveファイルのOPEN)
  Dim m_no As Long
  Dim fname As String
  Dim fnlen As Integer
  Dim stat As Integer

  InitFieldMaps

  OpenFileKeyBuffer.FilePath = App.Path & “¥machine.btr”
  StructToRow kb_datb.keybuff, OpenFileKeyBufferFldMap, OpenFileKeyBuffer, _
LenB(OpenFileKeyBuffer)
’*********** Btrieveファイルのオープン
  buflen = 0
  stat = BTRCALL(BOPEN, posblock, dmy(1), buflen, kb_datb, KEY_BUF_LEN, 0)
  If stat <> 0 Then
    MsgBox “ファイルのOpenに失敗しました。ステータス コード = ” + CStr(stat%)
  Else
    MsgBox “ファイルのOpenに成功しました。”
  End If
’*********** Btrieveファイルの1レコード目を読み込む
  buflen = MachineRowSize
  stat = BTRCALL(BGETFIRST, posblock, rec_buff, buflen, kb_datb, KEY_BUF_LEN, 0)
  If stat <> B_NO_ERROR Then
    MsgBox “Get Firstに失敗しました。ステータス コード =” + CStr(stat%)
  End If
’*********** データの表示
  Call set_form
  Form1.Show
End Sub

Sub set_form()
’*********** 読み込んだデータを作業用レコードバッファにセットする
  RowToStruct rec_buff.buf, MachineFldMap, wrec_buff, LenB(wrec_buff)
’*********** 読み込んだデータを表示
  Form1.Text1 = wrec_buff.maker
  Form1.Text2 = CStr(wrec_buff.m_id)
  Form1.Text3 = CStr(wrec_buff.m_no)
  Form1.Text4 = wrec_buff.m_name
  Form1.Text5 = CStr(wrec_buff.teika)
  Form1.Text6 = CStr(wrec_buff.nebiki)
End Sub

Sub InitFieldMaps()
’FieldMapsの初期設定

  SetField OpenFileKeyBufferFldMap(0), FLD_STRING, KEY_BUF_LEN

  ’DDF ファイルが存在しない場合

  ’SetField MachineFldMap(0), FLD_STRING, 1     ’メーカID
  ’SetField MachineFldMap(1), FLD_INTEGER, 2    ’マシンID
  ’SetField MachineFldMap(2), FLD_INTEGER, 4    ’マシンNo.
  ’SetField MachineFldMap(3), FLD_STRING, 30    ’マシン名
  ’SetField MachineFldMap(4), FLD_INTEGER, 4    ’定価
  ’SetField MachineFldMap(5), FLD_IEEE, 4       ’割引率

  ’DDF ファイルが存在する場合:

  SetFieldMapFromDDF App.Path, “マシン”, “”, “”, _
              MachineFldMap, False

End Sub

 

付録C:ActiveXのサンプル

次のサンプルは、Pervasive.SQL 2000i SP3、Visual Basic v6.0 SP5、ActiveX コントロールv7.82.198.007によってテストが行われています。このサンプルは、DEMODATAデータベースを開き、Roomテーブルの最初のフィールド(Building_Name)を読み出して、デバッグ ウィンドウに表示します。追加のサンプルとActiveXの詳細な説明については、『ActiveX Controls Guide』マニュアルを参照してください。

Dim Status As Integer
With VAccess1
   .DdfPath = “c:¥pvsw¥demodata”
   .TableName = “Room”
   .Refresh
   Status = .GetFirst
   If Status = 0 Then
    Do
     Debug.Print .FieldValue(0)
     Status = .GetNext
     If Status = 9 Then
      Exit Do
     End If
    Loop Until Status <> 0
   End If
End With

 

付録D:DAOのサンプル

次のサンプルは、Pervasive.SQL 2000i SP3とVisual Basic v6.0 SP5によってテストが行われています。ODBCデータソース(このサンプルではDEMODATA)に接続する方法を示し、フィールドの値(RoomテーブルのBuilding_Name)を出力します。追加のサンプルとBtrieveオペレーションの詳細な説明については、『Btrieve API Guide』を参照してください。

Pervasive.SQL 2000i SDKの一部としてDemoDataデータベースがインストールされていることに注意してください。

  Dim wrkodbc As Workspace
  Dim dbsNorthwind As Database
  Dim dbsDemodata As Database
  Dim dbsLoop As Database
  Dim rsClass As Recordset
  Dim prpLoop As Property

  Set wrkodbc = CreateWorkspace(“”, “”, “”, dbUseODBC)
  Set dbsDemodata = wrkodbc.OpenDatabase_
    (“ODBC;DSN=DEMODATA”,dbDriverNoPrompt, True ,_
     “ODBC;DSN=DEMODATA”)
  Set rsClass = dbsDemodata.OpenRecordset_
     (“select * from room”,dbOpenForwardOnly)
  If rsClass.EOF = True And rsClass.BOF = True Then
    ’No records.
    Debug.Print “No Records”
  Else
    Debug.Print rsClass(0).Name
    Do
     Debug.Print rsClass(0).Value
     rsClass.MoveNext
    Loop Until rsClass.EOF
  End If
  rsClass.Close
  dbsDemodata.Close
  wrkodbc.Close

 

付録E:RDOのサンプル

このサンプルは付録Dと同じデータを出力しますが、DAOの代わりにRDOを使用しています。

Pervasive.SQL 2000i SP3とVisual Basic v6.0 SP5によってテストが行われています。追加のサンプルとBtrieveオペレーションの詳細な説明については、『Btrieve API Guide』を参照してください。

Dim er As rdoError
Dim cn As New rdoConnection
Dim qy As New rdoQuery
Dim rs As rdoResultset
Dim col As rdoColumn
Dim SQL As String
cn.CursorDriver = rdUseOdbc
cn.Connect = “DSN=DEMODATA;”
cn.EstablishConnection
With qy
  .Name = “Room”
  .SQL = “Select * from Room”
  Set .ActiveConnection = cn
End With
SQL = “Select * from ROOM”
cn.Execute SQL
Set rs = qy.OpenResultset(rdOpenForwardOnly)
Do
  Debug.Print rs!Building_Name
  rs.MoveNext
Loop Until rs.EOF


 

付録F:ODBCを使用するADOのサンプル

このサンプルは付録Dと同じデータを出力しますが、ADOを使用しています。Pervasive.SQL 2000i SP3とVisual Basic v6.0 SP5によってテストが行われています。追加のサンプルとBtrieveオペレーションの詳細な説明については、『Btrieve API Guide』を参照してください。

Dim con As New ADODB.Connection
Dim rstH As New ADODB.Recordset
Dim sConStr As String
con.Open “PROVIDER=MSDASQL;DSN=DEMODATA”
  If con.State <> adStateOpen Then
   Set con = Nothing
   Set rstH = Nothing
   MsgBox “could not connect”
   End
  End If
rstH.Open “select * from room”, con, , , adCmdText
rstH.MoveFirst
Do
  Debug.Print rstH!Building_Name
  rstH.MoveNext
Loop Until rstH.EOF
rstH.Close
con.Close
Set rstH = Nothing
Set con = Nothing
MsgBox “Done”

 

付録G:OLE DBを使用するADOのサンプル

このサンプルは、付録Fと同じデータを使用していますが、ADO経由の接続にODBCではなくOLE DBを使っています。Pervasive.SQL 2000i SP3とVisual Basic v6.0 SP5によってテストが行われています。

次のサンプルは、データベースに接続後、SQLステートメントを使ってデータを取り出す方法を示しています。これは、Pervasive.SQL 2000i SP3 OLE DBプロバイダを使用するときにのみサポートされ、旧バージョンではサポートされません。追加のサンプルとBtrieveオペレーションの詳細な説明については、『Btrieve API Guide』を参照してください。

Dim con As New ADODB.Connection
Dim rstH As New ADODB.Recordset
Dim sConStr As String
con.Open “Provider=PervasiveOLEDB;Data Source=demodata”
  If con.State <> adStateOpen Then
   Set con = Nothing
   Set rstH = Nothing
   MsgBox “could not connect”
   End
  End If
rstH.Open “select * from room”, con, , , adCmdText
rstH.MoveFirst
Do
  Debug.Print rstH!Building_Name
  rstH.MoveNext
Loop Until rstH.EOF
rstH.Close
con.Close
Set rstH = Nothing
Set con = Nothing
MsgBox “Done”

次のサンプルは、SQLステートメントではなくテーブル名を使って、接続後にデータを取り出す方法を 示しています。

Dim con As New ADODB.Connection
Dim rstH As New ADODB.Recordset
Dim sConStr As String
con.Open “Provider=PervasiveOLEDB;Data Source=demodata”
  If con.State <> adStateOpen Then
   Set con = Nothing
   Set rstH = Nothing
   MsgBox “could not connect”
   End
  End If
rstH.Open “room”, con, , , adCmdTable
rstH.MoveFirst
Do
  Debug.Print rstH!Building_Name
  rstH.MoveNext
Loop Until rstH.EOF
rstH.Close
con.Close
Set rstH = Nothing
Set con = Nothing
MsgBox “Done”

Exit Sub

Contactお問い合わせ

お気軽にお問い合わせください。

お問い合わせ

    必須会社名

    個人のお客様は「個人」と入力してください。

    必須お名前
    必須メールアドレス
    必須メールアドレス(確認)
    必須ライセンス ありなし
    ダウンロード目的