Visual C++ Extensions for ADO の使用

IADORecordBinding インターフェイス

Microsoft Visual C++ Extensions for ADO では、Recordset オブジェクトのフィールドを C/C++ 変数に割り当て (またはバインドし) ます。バインドされた Recordset の現在の行が変更されると、Recordset 内のバインドされたすべてのフィールドが C/C++ 変数にコピーされます。必要に応じて、コピーされたデータは C/C++ 変数の宣言データ型に変換されます。

IADORecordBinding インターフェイスの BindToRecordset メソッドは、フィールドを C/C++ 変数にバインドします。AddNew メソッドは、バインドされた Recordset に新規行を追加します。Update メソッドは、C/C++ 変数の値で Recordset の新規行のフィールドに値を入力したり、既存の行のフィールドの値を更新します。

IADORecordBinding インターフェイスは Recordset オブジェクトによって実装されます。この実装はユーザーが行う必要はありません。

バインディング エントリ

Microsoft Visual C++ Extensions for ADO は Recordset オブジェクトのフィールドを C/C++ 変数にマップします。フィールドと変数のマップの定義を、"バインディング エントリ" と呼びます。マクロでは数値、固定長、および可変長データ用にバインディング エントリを用意しています。バインディング エントリと C/C++ 変数は、Visual C++ Extensions クラス CADORecordBinding から派生したクラスで宣言します。CADORecordBinding クラスは、バインディング エントリ マクロで内部的に定義します。

ADO では、これらのマクロのパラメータを OLE DB DBBINDING 構造体に内部的にマップし、OLE DB Accessor オブジェクトを作成して、フィールドまたは変数間のデータの移動と変換を管理します。OLE DB は 3 つの要素でデータを定義します。3 つの要素とは、データを保存する Buffer、バッファにフィールドが正しく保存されたかどうか、または変数をフィールドに復元する方法を示す Status、およびデータの Length です。(詳細については、「OLE DB Programmer's Reference」の「Chapter 6: Getting and Setting Data」を参照してください。

ヘッダー ファイル

Visual C++ Extensions for ADO を使うには、アプリケーションに次のファイルを含めてください。

#include <icrsint.h>

Recordset フィールドのバインド

Recordset フィールドを C/C++ 変数にバインドするには

  1. CADORecordsetBinding クラスから派生したクラスを作成します。

  2. バインディング エントリおよび対応する C/C++ 変数を派生クラスに指定します。バインディング エントリを BEGIN_ADO_BINDING マクロと END_ADO_BINDING マクロで囲みます。マクロの末尾にカンマまたはセミコロンを使わないでください。区切り文字がマクロによって自動的に指定されます。

    各フィールドにバインディング エントリを 1 つ指定して、C/C++ 変数にマップします。ADO_FIXED_LENGTH_ENTRYADO_NUMERIC_ENTRY、または ADO_VARIABLE_LENGTH_ENTRY マクロ ファミリからメンバを選択して使います。

  3. CADORecordsetBinding から派生したクラスのインスタンスをアプリケーション内で作成します。Recordset から IADORecordBinding インターフェイスを呼び出します。BindToRecordset メソッドを呼び出して、Recordset のフィールドを C/C++ 変数にバインドします。

詳細については、「Visual C++ Extensions での ADO の例」を参照してください。

インターフェイス メソッド

IADORecordBinding インターフェイスには、3 つのメソッド、BindToRecordsetAddNew、および Update があります。CADORecordBinding から派生したクラスのインスタンスへのポインタが、これらメソッドの唯一の引数です。そのため、AddNew メソッドおよび Update メソッドでは、ADO メソッド等価のパラメータは指定できません。

構文

BindToRecordset メソッドは、Record フィールドを C/C++ 変数に関連付けます。

BindToRecordset(CADORecordBinding *binding)

AddNew メソッドは等価の ADO AddNew メソッドを呼び出して、Recordset に新規行を追加します。

AddNew(CADORecordBinding *binding)

Update メソッドは等価の ADO Update メソッドを呼び出して、Recordset を更新します。

Update(CADORecordBinding *binding)

バインディング エントリ マクロ

バインディング エントリ マクロは、Recordset フィールドおよび変数の関連付けを定義します。先頭および末尾のマクロでバインディング エントリのセットが区切られます。

adDateadBoolean などの固定長データ、adTinyIntadInteger、または adDouble などの数値データ、adCharadVarChar、または adVarBinary などの可変長データにはマクロ ファミリが用意されています。adVarNumeric を除くすべての数値型も固定長型です。各マクロ ファミリは、それぞれ異なるパラメータ セットを持っており、必要なバインディング情報のみを使うことができます。

(詳細については、「OLE DB Programmer's Reference」の「Appendix A: Data Types」を参照してください。

バインディング エントリの先頭

BEGIN_ADO_BINDING(Class)

固定長データ

ADO_FIXED_LENGTH_ENTRY(Ordinal, DataType, Buffer, Status, Modify)
ADO_FIXED_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Modify)

数値データ

ADO_NUMERIC_ENTRY(Ordinal, DataType, Buffer, Precision, Scale, Status,
                                   Modify)

ADO_NUMERIC_ENTRY2(Ordinal, DataType, Buffer, Precision, Scale, Modify)

可変長データ

ADO_VARIABLE_LENGTH_ENTRY(Ordinal, DataType, Buffer, Size, Status,
                                                       Length, Modify)

ADO_VARIABLE_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Size, Status,
                                                       Modify)

ADO_VARIABLE_LENGTH_ENTRY3(Ordinal, DataType, Buffer, Size, Length,
                                                       Modify)
ADO_VARIABLE_LENGTH_ENTRY4(Ordinal, DataType, Buffer, Size, Modify)

バインディング エントリの末尾

END_ADO_BINDING()

パラメータ 説明
Class バインディング エントリおよび C/C++ 変数が定義されるクラス。
Ordinal C/C++ 変数に対応する Recordset フィールドのインデックス。1 から始まります。
Data Type C/C++ 変数の等価 ADO (有効なデータ型については、「DataTypeEnum」参照)。Recordset フィールドの値は、必要に応じてこのデータ型に変更されます。
Buffer Recordset フィールドを格納する C/C++ 変数の名前。
Size バイト数で示す Buffer の最大サイズ。Buffer に可変長文字列を格納する場合、末尾のゼロにスペースが用意されます。
Status Buffer の内容が有効かどうか、および DataType のフィールドの変換が成功したかどうかを示す変数の名前。

この変数で最も重要な 2 つの値は、変換の成功を示す adFldOK と、フィールドが Null であり、単に空ではないことを示す adFldNull です。

Status に指定される値については、次の表の「Status 値」を参照してください。

Modify ブール フラグ。TRUE の場合、対応する Recordset フィールドを Buffer の値で更新できることを示します。

バインドされたフィールドを更新できるようにするには、ブール型 (Boolean) の modify パラメータを TRUE に設定します。確認だけでフィールドを変更しない場合は FALSE に設定します。

Precision 数値変数で表すことのできる桁数。
Scale 数値変数での小数点以下の桁数。
Length Buffer 内のデータの実際の長さを格納する 4 バイト変数の名前。

Status 値

Status 変数の値は、フィールドが変数に正常にコピーされたかどうかを示します。

データを設定するとき、Recordset フィールドを Null に設定することを示すために、StatusadFldNull に設定します。

定数 説明
adFldOK 0 Null ではないフィールド値が返されました。
adFldBadAccessor 1 バインディングが無効です。
adFldCantConvertValue 2 記号の不一致、またはデータのオーバーフロー以外の理由で値を変換できません。
adFldNull 3 フィールドを呼び出すときに、Null 値が返されたことを示します。

フィールドに NULL そのものをコーディングできない場合 (文字配列または整数など)、フィールドの設定時に、フィールドを NULL に設定することを示します。

adFldTruncated 4 可変長データまたは数値が切り捨てられました。
adFldSignMismatch 5 値は符号付きですが、変数のデータ型は符号なしです。
adFldDataOverFlow 6 変数のデータ型に格納できる値を超えています。
adFldCantCreate 7 未知の列の型であり、フィールドが既に開かれています。
adFldUnavailable 8 フィールド値が確認できませんでした。たとえば、新規フィールドで、既定値がフィールドに割り当てられていません。
adFldPermissionDenied 9 更新時に、データの書き込み権限が与えられていませんでした。
adFldIntegrityViolation 10 更新時に、フィールド値が列の整合性に違反していました。
adFldSchemaViolation 11 更新時に、フィールド値が列のスキーマに違反していました。
adFldBadStatus 12 更新時に、無効なステータス パラメータがありました。
adFldDefault 13 更新時に、既定値が使われました。