AG-TECH CORPAG-TECH CORP

ENGLISH

Supportサポート

最新の製品アップデートをはじめ、修正プログラム、
追加モジュールなどをご用意しております。

Visual Basic



AG-TECH製品ライン


ご利用いただくお客様層に合わせた AG-TECH サポートサービスをご用意しております。



製品別FAQ参考資料
サポートサービスサポートフォーム

お問い合わせはこちら

AG-TECH PSQL Library

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


1.はじめに

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

付録A:Btrieve APIのサンプル
付録B:Btrieve APIのサンプル
  :Pervasive 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にサンプルがあります。各機能の概要と各機能を利用するために必要な環境については、Pervasive.SQL 2000i SDKの『Pervasive.SQL API Programmer's Reference』マニュアルを参照してください。Pervasive SoftwareのWebサイトでもオンラインマニュアルが提供されています。

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

2) これより簡単なもう1つの方法は、Pervasive Btrieve Alignment DLL(PALN32.DLL)を使用することです。このDLLが、開発者であるあなたに代わってメモリコピーとUnicode変換を実行してくれます。この例を付録Bに添付します。このDLLは、Pervasive.SQL SDKに入っています。

『Pervasive.SQL API Programmer's Reference』には、すべてのBtrieve API関数についての詳しい説明があります。Pervasive Btrieve Alignment DLLについては、『Pervasive.SQL Programmer's Guide』に詳しく説明されています。どちらのマニュアルも、Pervasive.SQL 2000i SDKに同梱されており、また、Pervasive WebサイトのOnline Manualsセクションからダウンロードすることもできます。Btrieve API関数の説明のほかに、Pervasive.SQL 2000i SDKには、Btrieve APIおよびその他の方法によるBtrieveデータへのアクセスの実例を示すいくつかのサンプル・アプリケーションも付属しています。



3.ActiveXコントロール

Pervasive 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を必要としません。

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

各メソッドとプロパティについての説明は、Pervasive.SQL 2000i SDKの『Pervasive.SQL Visual Programmer's Reference』を参照してください。

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



4.ODBC

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

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

データベース プラットフォームの違いを克服するデータ アクセス技術のなかで最も広く使用されているのは、おそらくODBCでしょう。ODBCは、複数の異種データベース バックエンドに対応する単一の共通インタフェースとしてMicrosoftが開発したものであり、正確にはOpen DataBase Connectivityといいます。ODBCを経由することによって、Pervasive.SQLとBtrieveデータに対する、SQLクエリーによるリレーショナル アクセスが可能となります。Pervasiveの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つのステップとなっています。Pervasive ODBCインタフェースによる具体的なパフォーマンス テストは実施していませんが、処理速度の面でもADOとRDOは近似しています。ADO(for ODBC)インタフェースを使用する場合、AdCmdTableDirectメソッドによってテーブルを開くことはできません。

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

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

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



付録A:Btrieve APIのサンプル

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

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

'オペレーション コード の定義
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のサンプル :Pervasive Btrieve Alignment DLL
  (PALN32.DLL)を使用

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

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


'オペレーション コード の定義
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、Pervasive ActiveX コントロールv7.82.198.007によってテストが行われています。このサンプルは、DEMODATAデータベースを開き、Roomテーブルの最初のフィールド(Building_Name)を読み出して、デバッグ ウィンドウに表示します。追加のサンプルとActiveXの詳細な説明については、『Visual Programmer's Reference』マニュアルを参照してください。

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オペレーションの詳細な説明については、『Visual Programmer's Reference』マニュアルを参照してください。

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オペレーションの詳細な説明については、『Visual Programmer's Reference』マニュアルを参照してください。

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オペレーションの詳細な説明については、『Visual Programmer's Reference』マニュアルを参照してください。

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オペレーションの詳細な説明については、『Visual Programmer's Reference』マニュアルを参照してください。

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

サンプルここまで↑↑↑



<内容についてのお問い合わせ先>
developer@agtech.co.jp

責任の放棄: 本文章におけるパフォーマンスに関する記述は、あくまでも参考としての記述であり、類似の構成においても パフォーマンスに関する保証をするものではありません。


cCopyright 2002 Pervasive Software Inc. All rights reserved worldwide.

*Pervasive、Pervasive Software、Pervasive.SQL、BtrieveおよびPervasive Softwareのロゴは、Pervasive Software Inc.の 登録商標です。
*Microsoft および Windows は Microsoft Corp. の登録商標です。
*その他の社名、製品名はすべて所有各社の商標または登録商標です。



Contactお問い合わせ

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

お問い合わせ

Fatal error: Uncaught Error: Call to undefined function do_shortcode() in /usr/home/haw1004n20ja/html/template/footer.php:102 Stack trace: #0 /usr/home/haw1004n20ja/html/support/reference/pervasive/sup_0023.html(794): include() #1 {main} thrown in /usr/home/haw1004n20ja/html/template/footer.php on line 102