ADO/OLE DB リファレンス情報
PSQL OLE DB プロバイダーを使用した一般的な操作のリファレンス
この章では、以下の項目について説明します。
OLE DB プロバイダーと Visual Basic
このセクションには、PSQL OLE DB プロバイダーを Visual Basic 開発環境に組み込むのに役立つ情報が含まれています。
非ビジュアル プログラミング
この手順は、ビジュアル コントロール オブジェクトを使用しない ADO と OLE DB でのプログラミングの方法を示しています。
►Visual Basic で OLE DB 用のプログラミングを行うには
1 VB 6 で新しいプロジェクトを開きます。
2 [プロジェクト|参照設定]のメニュー項目をクリックし、参照設定のダイアログを表示します。
3 "Microsoft ActiveX Data Objects 2.1 Library" または "Microsoft ActiveX Data Objects 2.5 Library" が選択されていることを確認して[OK]をクリックします。
4 フォームに 3 つのテキストボックスを追加します。
5 コード ウィンドウを表示し、以下のコードを使用してグローバル レコードセット オブジェクトを割り当てます(これは General::Declarations コード領域に入れる必要があります)。
Dim myData as New ADODB.Recordset
6 Form::Load 上にレコードセットを作成するには、Form_Load イベントに次のコードを記述しください(DemoData は DBNAMES エントリとして設定してあり、Person ファイルを使用します)。
myData.CursorLocation = adUseServer
myData.Open "Person", "Provider=PervasiveOLEDB;Data Source=DemoData", adOpenDynamic, adLockOptimistic, adCmdTableDirect
7 見つかったレコードを表示するために、以下のサブルーチンを作成します。
Private Sub DisplayFields()
Text1 = myData.Fields(0)
Text2 = myData.Fields(1)
Text3 = myData.Fields(2)
End Sub
8 フォームに 4 つのボタンを追加し、以下のコードを追加します。
Private Sub Command1_Click()
myData.MoveFirst
DisplayFields
End Sub
Private Sub Command2_Click()
myData.MovePrevious
DisplayFields
End Sub
Private Sub Command3_Click()
myData.MoveNext
DisplayFields
End Sub
Private Sub Command4_Click()
myData.MoveLast
DisplayFields
End Sub
9 フォームがロードされたときに最初のレコードを取得するために、Form_Load の最後に次の行を追加します。
Command1_Click
10 アプリケーションを実行すると、データ間を移動するためのボタンを使用することができるようになります。分かりやすくするためにボタンのタイトルや名前を変更することもできます。
11 更新機能を追加するためには、フォームに別のボタンを配置し、そのボタンのキャプションを "更新" に、オブジェクト名を "btnUpdate" にします。
12 以下のコードを追加すると、ユーザーは最初のフィールドを更新できなくなります。並行モードは adLockOptimistic なので、更新はカーソルが現在の行から移動したときに自動的に適用されます。また、更新はカーソルの位置に関係なく更新するのに使用することもできます。
Private Sub btnUpdate_Click()
myData.Fields(1) = Text2
myData.Fields(2) = Text3
End Sub
ビジュアル プログラミング
PSQL プロバイダーには初期化に必須のプロパティが 1 つあります。それは、DataSource プロパティです。OLE DB プロバイダーは DSN を使用しないので、DataSource プロパティにはデータベース名の値を設定する必要があります。たとえば、ADO の Connection::Open コマンドの接続文字列は、「Provider=PervasiveOLEDB;Data Source=<data store>」になります。この <data store> にはデータベース名を指定します。
►プロバイダーを使用して Visual Basic でグリッドを埋めるには
1 Visual Basic 6 を起動します。
2 標準プロジェクトを開始します。
3 [プロジェクト]、[コンポーネント]のメニュー オプションをクリックして[コンポーネント]ダイアログを表示します。
4 次のコンポーネントのチェックボックスをクリックし、[OK]をクリックします。
•Microsoft ADO Data Control 6.0 (OLEDB)
•Microsoft DataGrid Control 6.0 (OLEDB)
5 フォーム上にそれぞれのコントロールのコピーをドラッグ アンド ドロップします。
6 データ コントロール上をマウスの右ボタンでクリックし、ショートカット メニューで[ADODC のプロパティ]をクリックします。
7 [作成]をクリックし、接続文字列構築を呼び出します。
8 一覧から "Pervasive OLE DB Provider" を選び、[次へ]をクリックします。
9 DataSource プロパティのためのデータベース名エントリまたはパス名を入力します。
10 [OK]をクリックします。
11 [ADODC のプロパティ]ダイアログ ボックスの[レコード ソース]タブをクリックします。
12 ドロップダウン リストを使って、コマンド タイプを "adCmdTable" に変更します。
13 テーブル名を入力するか、ドロップダウン リストからテーブルを 1 つ選択して[OK]をクリックします。
14 グリッドを選択し、F4 キーを使ってプロパティを編集します。
15 ドロップダウン リストを使って、DataSource プロパティを "Adodc1" に変更します。
16 アプリケーションを実行します。
接続の作成
接続を作成するには、CursorLocation を設定し、ConnectionString を設定して Open を呼び出すか、または Open 呼び出しで接続文字列を指定します。
cn.ConnectionString = "Provider=PervasiveOLEDB;Data Source=Demodata"
cn.CursorLocation = adUseServer
cn.Open
または
cn.CursorLocation = adUseServer
cn.Open "Provider=PervasiveOLEDB;Data Source=Demodata"
レコードセットの作成
名前付きデータベースを使用する
PSQL Control Center で名前付きデータベースを作成することができます。
Control Center のエクスプローラー内で、データベースを作成するデータベース エンジンを右クリックし、[新規作成|データベース]を選択します。これは、アプリケーションを中断することなく必要に応じてデータを移動できるので、データ ストアを指定する好ましい方法です。アプリケーションから新しいディレクトリを指すために必要なのは、サーバーで名前付きデータベースのパス変更することだけです。それぞれのクライアント コンピューターで再設定を行うのではなく、1 つの簡単な作業で済みます。
rs.Open "Course", "Provider=PervasiveOLEDB;Data Source=Demodata", adOpenDynamic, adLockBatchOptimistic, adCmdTableDirect
パスを使用する
アプリケーションにパスをハード コーディングすることはお勧めしません。しかし、アプリケーションでレジストリ エントリまたは環境変数からパスを取得することができ、次のような文字列を作成できる場合は、パスを使用することで、名前付きデータベースを定義することなくデータ ストアに簡単にアクセスすることができます。
rs.Open "Course", "Provider=PervasiveOLEDB;Data Source=d:\mydata\mydatabase", adOpenDynamic, adLockBatchOptimistic, adCmdTableDirect
Location パラメーターを使用する
アプリケーションでパスをハード コーディングするのではなく、接続文字列内で Location パラメーターを使用してリモート データベースに接続することができます。
rs.Open "Course", "Provider=PervasiveOLEDB;Data Source=DEMODATA;Location=MyRemoteServer", adOpenDynamic, adLockBatchOptimistic, adCmdTableDirect
既存の接続を使用する
接続を作成し、その接続を使用して複数のレコードセットを作成することができます。これは、各レコードセットに個別の接続を作成するよりも効率的です。
rs.Open "Course", MyExistingConnection, adOpenDynamic, adLockBatchOptimistic, adCmdTableDirect
データ間の移動およびデータ操作
レコードセットを一度開くと、Move x、MoveFirst、MoveNext、MovePrevious および MoveLast を使用してデータ間を移動することができます。Move メソッドでは 1 つのパラメーターが必要です。このパラメーターは移動するレコード数を指します。負の数を指定すると、カーソルはレコードセットの後方に(最初のレコードに向かって)移動します。
レコードの追加
新しいレコードを追加するには、AddNew メソッドを使用します。パラメーターは必要ありませんが、呼び出しの中でフィールドと値を指定することができます。カーソルは新たに追加されるレコードを指すので、移動することなく、直ちにそのフィールドへの更新を行うことができます。
メモ: Update または UpdateBatch を呼び出す前に、ヌル値を許可しないフィールドに対しては値を入れておく必要があります。
即時更新モードでは、空のレコードがデータ ストアに書き込まれ、フィールドへの更新がそのまま保存されます。バッチ更新モードでは、空のレコードを作成しますが、そのレコードは Update または UpdateBatch が呼び出されるまで書き込まれません。
rs.Open "Course", "Provider=PervasiveOLEDB;Data Source=Demodata", adOpenDynamic, adLockBatchOptimistic, adCmdTableDirect
rs.AddNew
rs!Field1 = 0
rs!Field2 = "TextValue"
rs.UpdateBatch
rs.Close
または
rs.Open "Course", "Provider=PervasiveOLEDB;Data Source=Demodata", adOpenDynamic, adLockBatchOptimistic, adCmdTableDirect
rs.AddNew Array("Field1", "Field2"), Array(0, "TextValue")
rs.UpdateBatch
rs.Close
レコードの削除
レコードを削除するには、Delete メソッドを使用します。オプション パラメーターが 1 つあります。このパラメーターは削除するレコードを指します。現在、PSQL プロバイダーでサポートするのはデフォルトの adAffectCurrent のみです。
rs.Open "Course", "Provider=PervasiveOLEDB;Data Source=Demodata", adOpenDynamic, adLockOptimistic, adCmdTableDirect
rs.Delete adAffectCurrent
rs.Close
レコードの更新
レコードを更新するには、適切なフィールドに、希望する値を割り当てた後で Update または UpdateBatch を呼び出します。
rs.Open "Course", "Provider=PervasiveOLEDB;Data Source=Demodata", adOpenDynamic, adLockBatchOptimistic, adCmdTableDirect
rs!Field4 = "Changed text"
rs.UpdateBatch
rs.Close
レコードの検索
レコードの検索に使用するメソッドは、レコードセットの設定によって異なります。動的なレコードセットの場合、PSQL では Index プロパティと Seek メソッドをサポートします。
Sort メソッドと Find メソッド(静的なクライアント側のカーソルでのみ動作)は OLE DB プロバイダーで提供されていますが、現在はサポートされておらず、これらを使用しないことを推奨しています。すべての検索およびソートにおいて、Index メソッドと Seek メソッドの方が信頼性が高く、PSQL エンジンを直接使用します。これにより、クライアント側のレイヤーの使用に際してパフォーマンスが向上します。
メモ: Seek メソッドを使用するには、レコードセットを開くときに dCmdTableDirect を指定する必要があります。
Seek メソッドでは、検索する値を含むバリアント配列が必要です。1 つまたは複数の列で構成されるインデックスおよびその値を含む配列を、それぞれ対応する列で比較します。このため、セグメント インデックスがある場合、現在のインデックスに含まれるセグメント数と等しい要素数でバリアント配列を宣言する必要があります。
rs.Open "Person", "Provider=PervasiveOLEDB;Data Source=Demodata", adOpenDynamic, adLockBatchOptimistic, adCmdTableDirect
Dim VariantArray (1) as Variant
VariantArray(0) = "CA"
VariantArray(1) = "Sacramento"
rs.Index = "State_City"
rs.Seek VariantArray adSeekFirstEQ
rs.Close
バッチ更新または即時更新の選択
ADO のデフォルトのロック タイプは読み取り専用です。このロック タイプの変更は、レコードセットの Open 呼び出しでロック タイプ パラメーターを指定し、レコードセットにその変更を書き込むのに使用するメソッドを適用することによって変更できます。
レコードセットを更新するには、即時更新モード、単一行バッチ更新モード、または複数行バッチ更新モードのいずれかを使用するためにロック タイプを変更します。
即時更新モード
Pervasive.SQL V8 より前の OLE DB プロバイダーではロック タイプに adLockPessimistic をサポートしていませんでした。ロック タイプを指定しない場合、Update メソッドは必要なく、更新はフィールド単位でデータ ストアに書き込まれます。この方法は効率が悪いので、その他のロック タイプが特定のアプリケーションで受け入れられないことが判明している場合以外は使用しないでください。
バッチ更新モード
バッチ更新モードには、単一行と複数行があります。
単一行のバッチ更新モード
ロック タイプに adLockOptimistic を使用した場合、変更の書き込みには Update メソッドを使用し、一度に 1 つのレコードを処理するコードを記述する必要があります。ADO をレコードセット内のほかの行で動作させるオペレーション、または現在行をリフレッシュさせるオペレーションはいずれも、ADO の暗黙的な Update 呼び出しをトリガーします。ただし、これは即時更新モードよりも非常に効率的です。以下に、即時更新モードを使用してレコードセットを開く例を示します。
rs.Open "Course", "Provider=PervasiveOLEDB;Data Source=Demodata", adOpenDynamic, adLockOptimistic, adCmdTableDirect
複数行のバッチ更新モード
ロック タイプに adLockBatchOptimistic を使用した場合、変更の書き込みには UpdateBatch メソッド を使用し、一度に複数レコードの変更処理を行うコードを記述することができます。
これはパフォーマンスの点から見れば最良のロック タイプですが、アプリケーション設計で ADO が一度に複数行をキャッシュして更新できるようにする必要があります。このロック タイプが必ずしも、マルチユーザー、スループットの大きいアプリケーションに適しているとは限りません。以下に、バッチ更新モードを使用してレコードセットを開く例を示します。
rs.Open "Course", "Provider=PervasiveOLEDB;Data Source=Demodata", adOpenDynamic, adLockBatchOptimistic, adCmdTableDirect
ADO オブジェクトの使用
ADO ではオブジェクトを使ってデータにアクセスし、そのデータをユーザーに提供します。Microsoft ADO Data Control を使用している場合は、接続とレコードセット オブジェクトのインスタンスを作成する必要はありません。ただし、接続とレコードセットの作成と破棄を直ちに行うようにする場合は、インスタンスを作成してから、後でオブジェクトを破棄する必要があります。さらに、現在出荷されているバージョンの ADO Data Control では、コードからレコードセットを作成し、コード内でこのレコードセットに ADO Data Control の Recordset プロパティを設定する場合にのみ ADO 2.1 の機能(インデックス サポートなど)を使用します(また、これはデフォルトの ADO 2.0 ではなく、ADO 2.1 を含めるプロジェクト参照の変更も必要です)。
オブジェクトのインスタンスを作成する場合は、New キーワードを使用します。オブジェクトの宣言で次のように記述します。
Dim cn as New ADODB.Connection
Dim rs as New ADODB.Recordset
使用する直前で次のように記述します。
Dim cn as ADODB.Connection
Dim rs as ADODB.Recordset
Set cn = New ADODB.Connection
Set rs = New ADODB.Connection
これらのオブジェクトを破棄するには、次のように記述します。
Set rs = Nothing
Set cn = Nothing
ブックマークの使用
ADO で使用するブックマークは、文書の中で使用する通常のブックマークと同じで、後でその場所を見つけることができます。これは、データベース内を検索する場合、または複数のテーブルを使用する場合には特に便利です。バリアント変数を使用してブックマークを保存します。
rs.Open "Course", "Provider=PervasiveOLEDB;Data Source=Demodata", adOpenDynamic, adLockBatchOptimistic, adCmdTable
SaveMyPlace = rs.Bookmark
rs.Bookmark = SaveMyPlace
rs.Close
ヒント: Find メソッドの使用については、「レコードの検索」を参照してください。
イベントの使用
メモ:ADO イベントを使用する際は、1 つのイベントでほかのイベントを生成する呼び出しを行わないよう十分に注意する必要があります。これは、無限ループに陥る可能性が高くなるからです。無限ループが発生する例をより具体的に挙げると、MoveComplete イベントの代わりに、WillMove イベントを使用してファイルの最後(EOF)条件を処理する場合です。
Private Sub Adodc1_WillMove(ByVal adReason As ADODB.EventReasonEnum,
adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
If Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveLast
End Sub
このコードでは、無限ループに陥り、その結果メモリがいっぱいになってスタック領域が不足するエラーが発生します。このエラーを回避するには、Adodc1_MoveComplete イベントを使用する必要があります。
Field オブジェクトの使用
レコードセット内のフィールドに値を割り当てる場合は、レコードセット名、感嘆符(!)およびフィールドを参照するフィールド名によって指定することができます。フィールドは番号で参照することもできます。
rs.Open "Course", "Provider=PervasiveOLEDB;Data Source=Demodata", adOpenDynamic, adLockBatchOptimistic, adCmdTableDirect
rs.Fields(8).Value = "Sacramento"
rs!State = "CA"
rs.UpdateBatch
rs.Close
また、Field オブジェクトのほかのプロパティを使って、フィールドに格納されているデータの詳細情報を調べることもできます。たとえば、ActualSize ではフィールド内のデータの長さを、OriginalValue ではレコードセットのこのインスタンスで行った変更前の元の値を、そして Type ではデータ型を知ることができます(あるフィールドの値と別のフィールドの値またはメモリ内の値とを比較する方法を調べる場合に便利です)。
トランザクションの使用
トランザクションは、Connection オブジェクトを使って ADO 内に実装されています。トランザクション用に使用できるメソッドは次のとおりです。
•BeginTrans
•CommitTrans
•RollbackTrans
これらのメソッドにはパラメーターがありません。
ヒント: トランザクションを使用するためには、接続を作成し、その接続を使ってレコードセットを作成する必要があります。