Visual C++ での ADO プログラミングVisual C++ ADO Programming

ADO の API リファレンスには、ADO アプリケーション プログラミング インターフェイス (API)、Microsoft Visual Basic に似た構文を使用しての機能について説明します。The ADO API Reference describes the functionality of the ADO application programming interface (API) using a syntax similar to Microsoft Visual Basic. ADO のプログラマが Visual Basic、Visual C などのさまざまな言語を使用する対象とするユーザーには、すべてのユーザーが、(としない場合、 #importディレクティブ)、および Visual j (ADO と WFC クラス パッケージ) にします。Though the intended audience is all users, ADO programmers employ diverse languages such as Visual Basic, Visual C++ (with and without the #import directive), and Visual J++ (with the ADO/WFC class package).

注意

Microsoft では、2004 年 Visual j のサポートが終了しました。Microsoft ended support for Visual J++ in 2004.

このような多様性に対応するために、 Visual C++ 構文のインデックス用の ADO機能、パラメーター、例外的な動作、およびでは、API での一般的な説明へのリンクに Visual C の言語固有の構文を提供参照。To accommodate this diversity, the ADO for Visual C++ Syntax Indexes provide Visual C++ language-specific syntax with links to common descriptions of functionality, parameters, exceptional behaviors, and so on, in the API Reference.

ADO は COM (コンポーネント オブジェクト モデル) インターフェイスで実装されます。ADO is implemented with COM (Component Object Model) interfaces. ただし、他よりも、特定のプログラミング言語で COM を使用するプログラマにとって容易になります。However, it is easier for programmers to work with COM in certain programming languages than others. たとえば、自体、詳細な情報を Visual C プログラマに参加する必要がありますが、Visual Basic プログラマにとっての COM の使用のほぼすべての詳細は暗黙的に処理されます。For example, nearly all the details of using COM are handled implicitly for Visual Basic programmers, whereas Visual C++ programmers must attend to those details themselves.

次のセクションでは、ADO を使用して、C および C++ のプログラマのための詳細を集計して、 #importディレクティブ。The following sections summarize details for C and C++ programmers using ADO and the #import directive. COM に固有のデータ型に焦点を当てます (バリアントBSTR、およびSafeArray)、およびエラー処理 (_com_error)。It focuses on data types specific to COM (Variant, BSTR, and SafeArray), and error handling (_com_error).

#Import コンパイラ ディレクティブを使用します。Using the #import Compiler Directive

#Import Visual C コンパイラ ディレクティブが ADO メソッドとプロパティの使用を簡略化します。The #import Visual C++ compiler directive simplifies working with the ADO methods and properties. ディレクティブは、ado (Msado15.dll) などのタイプ ライブラリを含むファイルの名前を受け取り、typedef 宣言、インターフェイス、および列挙定数のスマート ポインターを含むヘッダー ファイルを生成します。The directive takes the name of a file containing a type library, such as the ADO .dll (Msado15.dll), and generates header files containing typedef declarations, smart pointers for interfaces, and enumerated constants. 各インターフェイスがカプセル化され、またはクラスでラップします。Each interface is encapsulated, or wrapped, in a class.

クラス (メソッドまたはプロパティの呼び出し) 内の各操作については、宣言操作を直接 (つまり、「生」の形式、操作)、呼び出すと、生の操作を呼び出すし、succ を実行する操作が失敗した場合は、COM エラーをスローする宣言essfully します。For each operation within a class (that is, a method or property call), there is a declaration to call the operation directly (that is, the "raw" form of the operation), and a declaration to call the raw operation and throw a COM error if the operation fails to execute successfully. 操作がプロパティの場合、Visual Basic のような構文のある操作の代替構文を作成できるコンパイラ ディレクティブは通常があります。If the operation is a property, there is usually a compiler directive that creates an alternative syntax for the operation that has syntax like Visual Basic.

プロパティの値を取得する操作は、フォームの名前を持つ取得_プロパティ_します。Operations that retrieve the value of a property have names of the form, GetProperty. プロパティの値を設定する操作は、フォームの名前を持つ配置_プロパティ_します。Operations that set the value of a property have names of the form, PutProperty. ADO オブジェクトへのポインターのプロパティの値を設定する操作は、フォームの名前を持つPutRef_プロパティ_します。Operations that set the value of a property with a pointer to an ADO object have names of the form, PutRefProperty.

これらの形式の呼び出しでプロパティを設定または取得できます。You can get or set a property with calls of these forms:

variable = objectPtr->GetProperty(); // get property value   
objectPtr->PutProperty(value);       // set property value  
objectPtr->PutRefProperty(&value);   // set property with object pointer  

プロパティのディレクティブを使用します。Using Property Directives

__Declspec(property...) コンパイラ ディレクティブは、Microsoft 固有の C 言語拡張機能に代替構文は、プロパティとして使用される関数を宣言します。The __declspec(property...) compiler directive is a Microsoft-specific C language extension that declares a function used as a property to have an alternative syntax. その結果、設定したり、Visual Basic に似た方法でプロパティの値を取得できます。As a result, you can set or get values of a property in a way similar to Visual Basic. たとえば、設定でき、この方法でプロパティを取得します。For example, you can set and get a property this way:

objectPtr->property = value;        // set property value  
variable = objectPtr->property;     // get property value  

通知コードする必要はありません。Notice you do not have to code:

objectPtr->PutProperty(value);      // set property value  
variable = objectPtr->GetProperty;  // get property value  

コンパイラは、適切な生成取得 -配置-、またはPutRefプロパティ_代替構文は宣言されており、プロパティがされているかどうかに基づいて、呼び出しの読み取りまたは書き込み。The compiler will generate the appropriate Get-_, Put-, or PutRefProperty call based on what alternative syntax is declared and whether the property is being read or written.

__Declspec(property...) コンパイラ ディレクティブでのみ宣言できます取得配置、または取得配置関数の代替構文。The __declspec(property...) compiler directive can only declare get, put, or get and put alternative syntax for a function. 読み取り専用操作のみがある、取得宣言です書き込み専用の操作のみが、配置宣言です。 操作はどちらも読み取りおよび書き込みの両方がある取得と。配置宣言します。Read-only operations only have a get declaration; write-only operations only have a put declaration; operations that are both read and write have both get and put declarations.

2 つだけ宣言はこのディレクティブを指定します。ただし、各プロパティには、次の 3 つのプロパティ関数があります。取得プロパティ配置プロパティ、およびPutRef_プロパティ_します。Only two declarations are possible with this directive; however, each property may have three property functions: GetProperty, PutProperty, and PutRefProperty. その場合は、プロパティの 2 つの形式では、代替構文があります。In that case, only two forms of the property have the alternative syntax.

たとえば、コマンドオブジェクトActiveConnectionプロパティが、別の構文で宣言された取得_ActiveConnection_とPutRef_ActiveConnection_します。For example, the Command object ActiveConnection property is declared with an alternative syntax for GetActiveConnection and PutRefActiveConnection. PutRef-たいので、実際が通常開いている状態に、構文は、適切な選択接続オブジェクト (つまり、接続オブジェクト ポインター) このプロパティ。The PutRef- syntax is a good choice because in practice, you will typically want to put an open Connection object (that is, a Connection object pointer) in this property. 一方で、レコード セットオブジェクトが取得-、配置-、およびPutRefActiveConnection、操作が別の構文ではありません。On the other hand, the Recordset object has Get-, Put-, and PutRefActiveConnection operations, but no alternative syntax.

コレクション、GetItem メソッドをおよび項目のプロパティCollections, the GetItem Method, and the Item Property

ADO など、いくつかのコレクションを定義するフィールドパラメータープロパティ、およびエラーします。ADO defines several collections, including Fields, Parameters, Properties, and Errors. Visual C で、 GetItem (インデックス) メソッドは、コレクションのメンバーを返します。In Visual C++, the GetItem(index) method returns a member of the collection. インデックスは、バリアント、この値は、コレクション内のメンバーの数値インデックスまたは、メンバーの名前を含む文字列。Index is a Variant, the value of which is either a numeric index of the member in the collection, or a string containing the name of the member.

__Declspec(property...) コンパイラ ディレクティブを宣言、項目プロパティとして各コレクションに別の構文の基本的な37-1getitem () メソッド。The __declspec(property...) compiler directive declares the Item property as an alternative syntax to each collection's fundamental GetItem() method. 代替構文は、角かっこを使用して、配列参照するようになります。The alternative syntax uses square brackets and looks similar to an array reference. 一般に、2 つの形式は、次のようになります。In general, the two forms look like the following:

  
      collectionPtr->GetItem(index);  
collectionPtr->Item[index];  

などのフィールドに値を割り当てる、 Recordsetという名前のオブジェクト rs から派生した、作成者のテーブルpubsデータベース。For example, assign a value to a field of a Recordset object, named rs, derived from the authors table of the pubs database. 使用して、 Item() 、3 番目にアクセスするプロパティフィールドRecordsetオブジェクトフィールドコレクション (コレクションのインデックスはから0;3 番目のフィールドがという名前の想定 au_fname )。Use the Item() property to access the third Field of the Recordset object Fields collection (collections are indexed from zero; assume the third field is named au_fname). 呼び出して、 Value() メソッドをフィールド文字列値を代入するオブジェクト。Then call the Value() method on the Field object to assign a string value.

これで表現できる Visual Basic では、次の 4 つの方法 (Visual Basic に最後の 2 つのフォームが固有; 他の言語には、相当するはありません)。This can be expressed in Visual Basic in the following four ways (the last two forms are unique to Visual Basic; other languages do not have equivalents):

rs.Fields.Item(2).Value = "value"  
rs.Fields.Item("au_fname").Value = "value"  
rs(2) = "value"  
rs!au_fname = "value"  

Visual C で上記の最初の 2 つのフォームには。The equivalent in Visual C++ to the first two forms above is:

rs->Fields->GetItem(long(2))->PutValue("value");   
rs->Fields->GetItem("au_fname")->PutValue("value");  

- または - (の代替構文をもプロパティが表示されます)-or- (the alternative syntax for the Value property is also shown)

rs->Fields->Item[long(2)]->Value = "value";  
rs->Fields->Item["au_fname"]->Value = "value";  

コレクションを反復処理する例については、「ADO 参照」の「ADO コレクション」セクションを参照してください。For examples of iterating through a collection, see the "ADO Collections" section of "ADO Reference".

COM に固有のデータ型COM-Specific Data Types

一般に、任意の Visual Basic データ型が ADO の API リファレンスを検索するには、同等の Visual C があります。In general, any Visual Basic data type you find in the ADO API Reference has a Visual C++ equivalent. などの標準的なデータ型が含まれますunsigned char Visual basicバイト短い整数、および長い長いします。These include standard data types such as unsigned char for a Visual Basic Byte, short for Integer, and long for Long. 構文 Indexesto ファイルの場所では、オペランドの特定のメソッドまたはプロパティの必要なものだけを参照してください。Look in the Syntax Indexesto see exactly what is required for the operands of a given method or property.

このルールの例外は、COM に固有のデータ型は。VariantBSTR、およびSafeArrayします。The exceptions to this rule are the data types specific to COM: Variant, BSTR, and SafeArray.

VariantVariant

Aバリアントvalue メンバーとデータ型のメンバーを含む構造化されたデータ型です。A Variant is a structured data type that contains a value member and a data type member. Aバリアント幅広い別バリアント、BSTR、ブール値、IDispatch または IUnknown ポインター、通貨、日付、およびなどを含むその他のデータ型を含めることができます。A Variant may contain a wide range of other data types including another Variant, BSTR, Boolean, IDispatch or IUnknown pointer, currency, date, and so on. COM では、メソッドを簡単に 1 つのデータ型の変換も提供します。COM also provides methods that make it easy to convert one data type to another.

_Variant_tクラスがカプセル化し、管理、バリアントデータ型。The _variant_t class encapsulates and manages the Variant data type.

ADO の API リファレンスは、メソッドまたはプロパティのオペランドは値を受け取り、通常は、値が渡された、 _variant_tします。When the ADO API Reference says a method or property operand takes a value, it usually means the value is passed in a _variant_t.

このルールは、明示的に true のときに、パラメーター ADO の API リファレンスのトピックの「よると、オペランドは、バリアントします。This rule is explicitly true when the Parameters section in the topics of the ADO API Reference says an operand is a Variant. 1 つの例外は、ドキュメントに明示的に記載されている場合、オペランドをなど、標準的なデータ型が長いまたはバイト、または列挙体。One exception is when the documentation explicitly says the operand takes a standard data type, such as Long or Byte, or an enumeration. 別の例外は、オペランドの実行時、文字列します。Another exception is when the operand takes a String.

BSTRBSTR

A BSTR (Basic STRing) 文字の文字列と文字列の長さを含む構造化されたデータ型です。A BSTR (Basic STRing) is a structured data type that contains a character string and the string's length. COM は、割り当て、操作、および解放するメソッドを提供するBSTRします。COM provides methods to allocate, manipulate, and free a BSTR.

_Bstr_tクラスがカプセル化し、管理、 BSTRデータ型。The _bstr_t class encapsulates and manages the BSTR data type.

ADO の API リファレンスがメソッドまたはプロパティを表示する場合は、文字列値、つまり、値の形式で、 _bstr_tします。When the ADO API Reference says a method or property takes a String value, it means the value is in the form of a _bstr_t.

キャスト _variant_t と _bstr_t クラスCasting _variant_t and _bstr_t Classes

多くの場合、コードでは明示的にする必要はありません、 _variant_tまたは _bstr_tに、操作の引数にします。Often it is not necessary to explicitly code a _variant_t or _bstr_t in an argument to an operation. 場合、 _variant_tまたは _bstr_tクラスの引数のデータ型と一致するコンス トラクターには、コンパイラは、適切な生成 _variant_tまたは _bstr_tします。If the _variant_t or _bstr_t class has a constructor that matches the data type of the argument, the compiler will generate the appropriate _variant_t or _bstr_t.

ただし、引数があいまいな場合は、引数のデータ型は、複数のコンス トラクターを一致する、適切なコンス トラクターを呼び出すための適切なデータ型の引数をキャストする必要があります。However, if the argument is ambiguous, that is, the argument's data type matches more than one constructor, you must cast the argument with the appropriate data type to invoke the correct constructor.

宣言など、 Recordset::Openメソッドは。For example, the declaration for the Recordset::Open method is:

    HRESULT Open (  
        const _variant_t & Source,  
        const _variant_t & ActiveConnection,  
        enum CursorTypeEnum CursorType,  
        enum LockTypeEnum LockType,  
        long Options );  

ActiveConnection引数への参照には、 _variant_t、接続文字列または開いているへのポインターとしてコーディングすることがありますが接続オブジェクト。The ActiveConnection argument takes a reference to a _variant_t, which you may code as a connection string or a pointer to an open Connection object.

正しい _variant_tなど、文字列を渡す場合は、暗黙的に構築されます"DSN=pubs;uid=MyUserName;pwd=MyPassword;"、またはなどのポインター"(IDispatch *) pConn"。The correct _variant_t will be constructed implicitly if you pass a string such as "DSN=pubs;uid=MyUserName;pwd=MyPassword;", or a pointer such as "(IDispatch *) pConn".

注意

Windows 認証をサポートするデータ ソース プロバイダーに接続するかどうかは、する必要がありますを指定するTrusted_Connection = yesまたはIntegrated Security = SSPIユーザー ID とパスワードの代わりに接続文字列の情報です。If you are connecting to a data source provider that supports Windows authentication, you should specify Trusted_Connection=yes or Integrated Security = SSPI instead of user ID and password information in the connection string.

または、明示的にコーディングすることがあります、 _variant_tなどのポインターを格納している"_variant_t((IDispatch *) pConn, true)"。Or you may explicitly code a _variant_t containing a pointer such as "_variant_t((IDispatch *) pConn, true)". キャスト(IDispatch *)、IUnknown インターフェイスへのポインターを受け取るもう 1 つのコンス トラクターを持つあいまいさを解決します。The cast, (IDispatch *), resolves the ambiguity with another constructor that takes a pointer to an IUnknown interface.

めったにありません 実際には、ADO は IDispatch インターフェイスを記載されているが、重要です。It is a crucial, though seldom mentioned fact, that ADO is an IDispatch interface. たびとして ADO オブジェクトへのポインターを渡す必要があります、バリアント、IDispatch インターフェイスへのポインターとしてそのポインターをキャストする必要があります。Whenever a pointer to an ADO object must be passed as a Variant, that pointer must be cast as a pointer to an IDispatch interface.

最後の場合は、コンス トラクターの 2 つ目のブール型の引数は省略可能、既定値を明示的にコードtrueします。The last case explicitly codes the second boolean argument of the constructor with its optional, default value of true. この引数により、バリアントコンス トラクターを呼び出すそのAddRef() メソッドは、ADO が自動的に呼び出すことを補正、 _variant_t::Release() メソッドADO メソッドまたはプロパティの呼び出しが完了したとき。This argument causes the Variant constructor to call its AddRef() method, which compensates for ADO automatically calling the _variant_t::Release() method when the ADO method or property call completes.

SafeArraySafeArray

A SafeArrayは他のデータ型の配列を含む構造化されたデータ型です。A SafeArray is a structured data type that contains an array of other data types. A SafeArrayと呼びますセーフのため、各配列の次元の境界に関する情報を格納し、それらの範囲内の配列要素へのアクセスを制限します。A SafeArray is called safe because it contains information about the bounds of each array dimension, and limits access to array elements within those bounds.

ADO の API リファレンスは、メソッドまたはプロパティは、または配列を返しますメソッドになります。 または、またはプロパティはを返します、 SafeArray、ネイティブ c/c++ 配列ではありません。When the ADO API Reference says a method or property takes or returns an array, it means the method or property takes or returns a SafeArray, not a native C/C++ array.

2 番目のパラメーターなど、接続オブジェクトOpenSchemaメソッドには、配列が必要です。バリアント値。For example, the second parameter of the Connection object OpenSchema method requires an array of Variant values. これらバリアントの要素としての値を渡す必要があります、 SafeArray、およびSafeArray別の値として設定する必要がありますバリアント.Those Variant values must be passed as elements of a SafeArray, and that SafeArray must be set as the value of another Variant. 他のバリアントの 2 番目の引数として渡されるOpenSchemaします。It is that other Variant that is passed as the second argument of OpenSchema.

例として、さらに、最初の引数、検索メソッドは、バリアント値が 1 次元SafeArray; 各オプションの最初と 2 番目の引数のAddNewは、1 次元SafeArray; と戻り値、 GetRowsメソッドは、バリアントが値は、2 次元SafeArrayします。As further examples, the first argument of the Find method is a Variant whose value is a one-dimensional SafeArray; each of the optional first and second arguments of AddNew is a one-dimensional SafeArray; and the return value of the GetRows method is a Variant whose value is a two-dimensional SafeArray.

不足していると、既定のパラメーターMissing and Default Parameters

Visual Basic ではメソッドのパラメーターがありません。Visual Basic allows missing parameters in methods. たとえば、レコード セットオブジェクトオープンメソッドには 5 つのパラメーターが、中間のパラメーターをスキップして、後続のパラメーターをオフのままにすることができます。For example, the Recordset object Open method has five parameters, but you can skip intermediate parameters and leave off trailing parameters. 既定のBSTRまたはバリアントは不足しているオペランドのデータ型によって置き換えられます。A default BSTR or Variant will be substituted depending on the data type of the missing operand.

C と C++ では、すべてのオペランドを指定する必要があります。In C/C++, all operands must be specified. データ型は文字列で不足しているパラメーターを指定する場合、指定、 _bstr_t null 文字列を格納します。If you want to specify a missing parameter whose data type is a string, specify a _bstr_t containing a null string. データ型が不足しているパラメーターを指定するかどうか、バリアント、指定、 _variant_t DISP_E_PARAMNOTFOUND と VT_ERROR の型の値。If you want to specify a missing parameter whose data type is a Variant, specify a _variant_t with a value of DISP_E_PARAMNOTFOUND and a type of VT_ERROR. 代わりに、相当するものを指定 _variant_t定数、 vtMissing、によって提供されますが、 #importディレクティブ。Alternatively, specify the equivalent _variant_t constant, vtMissing, which is supplied by the #import directive.

3 つのメソッドは例外の一般的な用途をvtMissingします。Three methods are exceptions to the typical use of vtMissing. これらは、 Executeのメソッド、接続コマンドオブジェクト、およびNextRecordsetメソッド、のRecordsetオブジェクト。These are the Execute methods of the Connection and Command objects, and the NextRecordset method of the Recordset object. そのシグネチャを次に示します。The following are their signatures:

_RecordsetPtr <A HREF="mdmthcnnexecute.htm">Execute</A>( _bstr_t CommandText, VARIANT * RecordsAffected,   
        long Options );  // Connection  
_RecordsetPtr <A HREF="mdmthcmdexecute.htm">Execute</A>( VARIANT * RecordsAffected, VARIANT * Parameters,   
        long Options );  // Command  
_RecordsetPtr <A HREF="mdmthnextrec.htm">NextRecordset</A>( VARIANT * RecordsAffected );  // Recordset  

パラメーター、 RecordsAffectedパラメーターへのポインターをバリアントします。The parameters, RecordsAffected and Parameters, are pointers to a Variant. パラメーターのアドレスを指定する入力パラメーターには、バリアント1 つを格納しているパラメーター、または実行中のコマンドを変更するには、パラメーターの配列。Parameters is an input parameter which specifies the address of a Variant containing a single parameter, or array of parameters, that will modify the command being executed. RecordsAffectedのアドレスを指定する出力パラメーター、バリアント、メソッドによって影響を受ける行の数が返されます。RecordsAffected is an output parameter that specifies the address of a Variant, where the number of rows affected by the method is returned.

コマンドオブジェクトExecuteメソッドを設定して、パラメーターが指定されていないことを示すパラメーターいずれかに&vtMissing(これを推奨) またはnull ポインター (つまり、 NULLまたはゼロ (0))。In the Command object Execute method, indicate that no parameters are specified by setting Parameters to either &vtMissing (which is recommended) or to the null pointer (that is, NULL or zero (0)). 場合パラメーター設定を null ポインターでは、メソッドは内部的に相当vtMissing、操作が完了するとします。If Parameters is set to the null pointer, the method internally substitutes the equivalent of vtMissing, and then completes the operation.

すべてのメソッドに影響を受けたレコードの数を設定して返されないことを示すRecordsAffected null ポインター。In all the methods, indicate that the number of records affected should not be returned by setting RecordsAffected to the null pointer. この場合、null ポインター パラメーターではありませんほど不足していることを表すメソッドが影響を受けたレコードの数を破棄する必要があります。In this case, the null pointer is not so much a missing parameter as an indication that the method should discard the number of records affected.

したがって、これら 3 つの方法など、コードを記述するは無効があります。Thus, for these three methods, it is valid to code something such as:

pConnection->Execute("commandText", NULL, adCmdText);   
pCommand->Execute(NULL, NULL, adCmdText);  
pRecordset->NextRecordset(NULL);  

エラー処理Error Handling

COM では、ほとんどの操作は、関数が正常に完了したかどうかを示す HRESULT のリターン コードを返します。In COM, most operations return an HRESULT return code that indicates whether a function completed successfully. #Importディレクティブは、各「生」のメソッドまたはプロパティをラッパー コードを生成し、返された HRESULT を確認します。The #import directive generates wrapper code around each "raw" method or property and checks the returned HRESULT. 場合は、HRESULT が障害を示してラッパー コードは、引数として HRESULT のリターン コードで呼び出し元の _com_issue_errorex() によって COM エラーをスローします。If the HRESULT indicates failure, the wrapper code throws a COM error by calling _com_issue_errorex() with the HRESULT return code as an argument. COM エラー オブジェクトをキャッチ、お試しください-キャッチブロック。COM error objects can be caught in a try-catch block. (効率性のために、キャッチへの参照を _com_errorオブジェクトです)。(For efficiency's sake, catch a reference to a _com_error object.)

ただし、これらは、ADO エラー: ADO 操作の失敗による結果です。Remember, these are ADO errors: they result from the ADO operation failing. 基になるプロバイダーから返されるエラーの表示としてエラー内のオブジェクト、接続オブジェクトエラーコレクション。Errors returned by the underlying provider appear as Error objects in the Connection object Errors collection.

#Importディレクティブはエラーのみのメソッドおよび ado で宣言されたプロパティの処理ルーチンを作成します。The #import directive creates only error handling routines for methods and properties declared in the ADO .dll. ただし、このエラー処理機構を独自のエラー チェック マクロまたはインライン関数を記述することで活用を実行できます。However, you can take advantage of this same error handling mechanism by writing your own error checking macro or inline function. このトピックを参照してVisual C 拡張、またはコード例については、次のセクションでは。See the topic, Visual C++ Extensions, or the code in the following sections for examples.

Visual Basic の規則の対応する visual CVisual C++ Equivalents of Visual Basic Conventions

ADO のドキュメントでは、Visual Basic の場合と同等の Visual C でコード化されたいくつかの規則の概要を次に示します。The following is a summary of several conventions in the ADO documentation, coded in Visual Basic, as well as their equivalents in Visual C++.

ADO オブジェクトの宣言Declaring an ADO Object

Visual basic で ADO オブジェクト変数 (この場合は、レコード セットオブジェクト) が次のように宣言されています。In Visual Basic, an ADO object variable (in this case for a Recordset object) is declared as follows:

Dim rst As ADODB.Recordset  

句、"ADODB.Recordset"の ProgID は、レコード セットレジストリで定義されているオブジェクトします。The clause, "ADODB.Recordset", is the ProgID of the Recordset object as defined in the registry. 新しいインスタンスをレコードオブジェクトが次のように宣言されています。A new instance of a Record object is declared as follows:

Dim rst As New ADODB.Recordset  

- または --or-

Dim rst As ADODB.Recordset  
Set rst = New ADODB.Recordset  

Visual C で、 #importディレクティブには、すべての ADO オブジェクトのスマート ポインター型宣言が生成されます。In Visual C++, the #import directive generates smart pointer-type declarations for all the ADO objects. 指す変数など、 _Recordset型のオブジェクトは、 _RecordsetPtrが次のように宣言されているとします。For example, a variable that points to a _Recordset object is of type _RecordsetPtr, and is declared as follows:

_RecordsetPtr  rs;  

新しいインスタンスを指す変数を _Recordsetオブジェクトが次のように宣言されています。A variable that points to a new instance of a _Recordset object is declared as follows:

_RecordsetPtr  rs("ADODB.Recordset");  

- または --or-

_RecordsetPtr  rs;  
rs.CreateInstance("ADODB.Recordset");  

- または --or-

_RecordsetPtr  rs;  
rs.CreateInstance(__uuidof(_Recordset));  

後に、 CreateInstanceメソッドが呼び出されると、変数を次のように使用できます。After the CreateInstance method is called, the variable can be used as follows:

rs->Open(...);  

1 つのケースで、"."の場合、変数がクラスのインスタンスを同じように、演算子を使用 (rs.CreateInstance) と別の場合、"->"変数がインターフェイスへのポインターであるかのように、演算子を使用 (rs->Open)。Notice that in one case, the "." operator is used as if the variable were an instance of a class (rs.CreateInstance), and in another case, the "->" operator is used as if the variable were a pointer to an interface (rs->Open).

2 つの方法で 1 つの変数を使用できる、"->"インターフェイスへのポインターと同様に動作するためのクラスのインスタンスを許可する演算子をオーバー ロードします。One variable can be used in two ways because the "->" operator is overloaded to allow an instance of a class to behave like a pointer to an interface. インスタンス変数のプライベート クラス メンバーにはへのポインターが含まれています、 _Recordsetインターフェイスは、"->"演算子を返しますそのポインターと返されるポインターのメンバーにアクセスする、 _Recordset。 オブジェクト。A private class member of the instance variable contains a pointer to the _Recordset interface; the "->" operator returns that pointer; and the returned pointer accesses the members of the _Recordset object.

不足しているパラメーターの文字列のコーディングCoding a Missing Parameter - String

存在しないをコーディングする必要がある場合文字列オペランド、オペランドの省略だけで Visual basic でします。When you need to code a missing String operand in Visual Basic, you merely omit the operand. Visual C では、オペランドを指定する必要があります。You must specify the operand in Visual C++. コードを _bstr_tを持つ値として空の文字列。Code a _bstr_t that has an empty string as a value.

_bstr_t strMissing(L"");  

不足しているパラメーターの場合は、バリアントのコーディングCoding a Missing Parameter - Variant

存在しないをコーディングする必要がある場合バリアントオペランド、オペランドの省略だけで Visual basic でします。When you need to code a missing Variant operand in Visual Basic, you merely omit the operand. Visual C では、すべてのオペランドを指定する必要があります。You must specify all operands in Visual C++. コードが存在しないバリアントパラメーター、 _variant_t特殊な値や DISP_E_PARAMNOTFOUND、型、VT_ERROR に設定します。Code a missing Variant parameter with a _variant_t set to the special value, DISP_E_PARAMNOTFOUND, and type, VT_ERROR. 代わりに、指定vtMissing、これと同じ定義済みの定数によって提供される、 #importディレクティブ。Alternatively, specify vtMissing, which is an equivalent predefined constant supplied by the #import directive.

_variant_t  vtMissingYours(DISP_E_PARAMNOTFOUND, VT_ERROR);   

またはを使用して、-or use -

...vtMissing...;  

バリアント型を宣言します。Declaring a Variant

Visual basic で、バリアントで宣言されて、 Dimステートメントは、次のとおりです。In Visual Basic, a Variant is declared with the Dim statement as follows:

Dim VariableName As Variant  

ビジュアルでC++、型として変数を宣言 _variant_tします。In Visual C++, declare a variable as type _variant_t. いくつかの概略図 _variant_t宣言を以下に示します。A few schematic _variant_t declarations are shown below.

注意

これらの宣言は、独自のプログラムでコーディングする内容の大まかなアイデアだけを提供します。These declarations merely give a rough idea of what you would code in your own program. 詳細については、以下の例と Visual c ドキュメントを参照してください。For more information, see the examples below, and the Visual C++documentation.

_variant_t  VariableName(value);  
_variant_t  VariableName((data type cast) value);  
_variant_t  VariableName(value, VT_DATATYPE);  
_variant_t  VariableName(interface * value, bool fAddRef = true);  

Variant の配列を使用します。Using Arrays of Variants

Visual basic での配列バリアントでコーディングすることができます、 Dimステートメント、またはを使用して、配列関数は、次のコード例で示した。In Visual Basic, arrays of Variants can be coded with the Dim statement, or you may use the Array function, as demonstrated in the following example code:

Public Sub ArrayOfVariants  
Dim cn As ADODB.Connection  
Dim rs As ADODB.Recordset  
Dim fld As ADODB.Field  
  
    cn.Open "DSN=pubs"  
    rs = cn.OpenSchema(adSchemaColumns, _  
        Array(Empty, Empty, "authors", Empty))  
    For Each fld in rs.Fields  
        Debug.Print "Name = "; fld.Name  
    Next fld  
    rs.Close  
    cn.Close  
End Sub  

次のビジュアルC++使用例を示します、 SafeArrayと併用、 _variant_tします。The following Visual C++ example demonstrates using a SafeArray used with a _variant_t.

メモNotes

次のノートは、コード例ではコメント部分に対応します。The following notes correspond to commented sections in the code example.

  1. もう一度、TESTHR() のインライン関数は、既存のエラー処理メカニズムを活用するために定義されます。Once again, the TESTHR() inline function is defined to take advantage of the existing error-handling mechanism.

  2. 必要なだけ 1 次元配列で使用できるようにSafeArrayCreateVector、一般的な用途ではなくSAFEARRAYBOUND宣言とSafeArrayCreate関数。You only need a one-dimensional array, so you can use SafeArrayCreateVector, instead of the general purpose SAFEARRAYBOUND declaration and SafeArrayCreate function. 次にそのコードがどのようにを使用してSafeArrayCreate:The following is what that code would look like using SafeArrayCreate:

       SAFEARRAYBOUND   sabound[1];  
       sabound[0].lLbound = 0;  
       sabound[0].cElements = 4;  
       pSa = SafeArrayCreate(VT_VARIANT, 1, sabound);  
    
  3. 列挙型の定数で識別されるスキーマadSchemaColumns、4 つの制約の列に関連付けられました。TABLE_CATALOG、table_schema、TABLE_NAME、COLUMN_NAME します。The schema identified by the enumerated constant, adSchemaColumns, is associated with four constraint columns: TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, and COLUMN_NAME. そのため、配列のバリアント4 つの要素を持つ値を作成します。Therefore, an array of Variant values with four elements is created. TABLE_NAME、3 番目の列に対応する制約値を指定します。Then a constraint value that corresponds to the third column, TABLE_NAME, is specified.

    Recordset返されるサブセットを実行するは、制約列の複数の列で構成されます。The Recordset that is returned consists of several columns, a subset of which is the constraint columns. 返された各行の制約列の値は、対応する制約の値と同じである必要があります。The values of the constraint columns for each returned row must be the same as the corresponding constraint values.

  4. 慣れ親しんでいるSafearray可能性があるスタジオに驚きSafeArrayDestroy() は、終了する前に呼び出されません。Those familiar with SafeArrays may be surprised that SafeArrayDestroy() is not called before the exit. 実際には、呼び出すSafeArrayDestroy() ここで、実行時と例外が発生します。In fact, calling SafeArrayDestroy() in this case will cause a run-time exception. その理由は、デストラクターのvtCriteriaが呼び出すVariantClear() ときに、 _variant_tが解放は、スコープ外になる、 SafeArrayします。The reason is that the destructor for vtCriteria will call VariantClear() when the _variant_t goes out of scope, which will free the SafeArray. 呼び出すSafeArrayDestroy、手動でオフにせず、 _variant_t、無効なをオフにしようとするデストラクターを引き起こすSafeArrayポインター。Calling SafeArrayDestroy, without manually clearing the _variant_t, would cause the destructor to try to clear an invalid SafeArray pointer.

    場合SafeArrayDestroyいたよう呼び出されると、コードになります。If SafeArrayDestroy were called, the code would look like this:

          TESTHR(SafeArrayDestroy(pSa));  
       vtCriteria.vt = VT_EMPTY;  
          vtCriteria.parray = NULL;  
    

    ただし、使用できるようにするほうが、 _variant_t管理、 SafeArrayします。However, it is much simpler to let the _variant_t manage the SafeArray.

// Visual_CPP_ADO_Prog_1.cpp  
// compile with: /EHsc  
#import "msado15.dll" no_namespace rename("EOF", "EndOfFile")  
  
// Note 1  
inline void TESTHR( HRESULT _hr ) {   
   if FAILED(_hr)   
      _com_issue_error(_hr);   
}  
  
int main() {  
   CoInitialize(NULL);  
   try {  
      _RecordsetPtr pRs("ADODB.Recordset");  
      _ConnectionPtr pCn("ADODB.Connection");  
      _variant_t vtTableName("authors"), vtCriteria;  
      long ix[1];  
      SAFEARRAY *pSa = NULL;  
  
      pCn->Provider = "sqloledb";  
      pCn->Open("Data Source='(local)';Initial Catalog='pubs';Integrated Security=SSPI", "", "", adConnectUnspecified);  
      // Note 2, Note 3  
      pSa = SafeArrayCreateVector(VT_VARIANT, 1, 4);  
      if (!pSa)   
         _com_issue_error(E_OUTOFMEMORY);  
  
      // Specify TABLE_NAME in the third array element (index of 2).   
      ix[0] = 2;        
      TESTHR(SafeArrayPutElement(pSa, ix, &vtTableName));  
  
      // There is no Variant constructor for a SafeArray, so manually set the   
      // type (SafeArray of Variant) and value (pointer to a SafeArray).  
  
      vtCriteria.vt = VT_ARRAY | VT_VARIANT;  
      vtCriteria.parray = pSa;  
  
      pRs = pCn->OpenSchema(adSchemaColumns, vtCriteria, vtMissing);  
  
      long limit = pRs->GetFields()->Count;  
      for ( long x = 0 ; x < limit ; x++ )  
         printf( "%d: %s\n", x + 1, ((char*) pRs->GetFields()->Item[x]->Name) );  
      // Note 4  
      pRs->Close();  
      pCn->Close();  
   }  
   catch (_com_error &e) {  
      printf("Error:\n");  
      printf("Code = %08lx\n", e.Error());  
      printf("Code meaning = %s\n", (char*) e.ErrorMessage());  
      printf("Source = %s\n", (char*) e.Source());  
      printf("Description = %s\n", (char*) e.Description());  
   }  
   CoUninitialize();  
}  

プロパティの Get と Put/PutRef を使用します。Using Property Get/Put/PutRef

Visual basic ではか取得、割り当てられている、または参照の割り当てによって、プロパティの名前は修飾されません。In Visual Basic, the name of a property is not qualified by whether it is retrieved, assigned, or assigned a reference.

Public Sub GetPutPutRef  
Dim rs As New ADODB.Recordset  
Dim cn As New ADODB.Connection  
Dim sz as Integer  
cn.Open "Provider=sqloledb;Data Source=yourserver;" & _  
         "Initial Catalog=pubs;Integrated Security=SSPI;"  
rs.PageSize = 10  
sz = rs.PageSize  
rs.ActiveConnection = cn  
rs.Open "authors",,adOpenStatic  
' ...  
rs.Close  
cn.Close  
End Sub  

この Visual C の例では、取得/配置/PutRef_プロパティ_します。This Visual C++ example demonstrates the Get/Put/PutRefProperty.

メモNotes

次のノートは、コード例ではコメント部分に対応します。The following notes correspond to commented sections in the code example.

  1. この例は、不足している文字列引数の 2 つの形式を使用して: 明示的な定数、 strMissing、およびコンパイラが、一時パスワードが作成に使用する文字列 _bstr_t のスコープに存在します。開いているメソッド。This example uses two forms of a missing string argument: an explicit constant, strMissing, and a string that the compiler will use to create a temporary _bstr_t that will exist for the scope of the Open method.

  2. オペランドをキャストする必要はありませんrs->PutRefActiveConnection(cn)(IDispatch *)オペランドの型が既に(IDispatch *)します。It is not necessary to cast the operand of rs->PutRefActiveConnection(cn) to (IDispatch *) because the type of the operand is already (IDispatch *).

// Visual_CPP_ado_prog_2.cpp  
// compile with: /EHsc  
#import "msado15.dll" no_namespace rename("EOF", "EndOfFile")  
  
int main() {  
   CoInitialize(NULL);  
   try {  
      _ConnectionPtr cn("ADODB.Connection");  
      _RecordsetPtr rs("ADODB.Recordset");  
      _bstr_t strMissing(L"");  
      long oldPgSz = 0, newPgSz = 5;  
  
      // Note 1  
      cn->Provider = "sqloledb";  
      cn->Open("Data Source='(local)';Initial Catalog=pubs;Integrated Security=SSPI;", strMissing, "", adConnectUnspecified);  
  
      oldPgSz = rs->GetPageSize();  
      // -or-  
      // oldPgSz = rs->PageSize;  
  
      rs->PutPageSize(newPgSz);  
      // -or-  
      // rs->PageSize = newPgSz;  
  
      // Note 2  
      rs->PutRefActiveConnection( cn );  
      rs->Open("authors", vtMissing, adOpenStatic, adLockReadOnly, adCmdTable);  
      printf("Original pagesize = %d, new pagesize = %d\n", oldPgSz, rs->GetPageSize());  
      rs->Close();  
      cn->Close();  
  
   }  
   catch (_com_error &e) {  
      printf("Description = %s\n", (char*) e.Description());  
   }  
   ::CoUninitialize();  
}  

GetItem(x) および項目の [x] を使用します。Using GetItem(x) and Item[x]

この Visual Basic の例は、の標準と代替構文を示します項目()。This Visual Basic example demonstrates the standard and alternative syntax for Item().

Public Sub GetItemItem  
Dim rs As New ADODB.Recordset  
Dim name as String  
rs = rs.Open "authors", "DSN=pubs;", adOpenDynamic, _  
         adLockBatchOptimistic, adTable  
name = rs(0)  
' -or-  
name = rs.Fields.Item(0)  
rs(0) = "Test"  
rs.UpdateBatch  
' Restore name  
rs(0) = name  
rs.UpdateBatch  
rs.Close  
End Sub  

この Visual C の例では項目します。This Visual C++ example demonstrates Item.

注意

次のメモは、コード例のセクションをコメントに対応します。コレクションにアクセスするときに項目、インデックス、 2にキャストする必要があります長い適切なコンス トラクターが呼び出されるようにします。The following note corresponds to commented sections in the code example: When the collection is accessed with Item, the index, 2, must be cast to long so an appropriate constructor will be invoked.

// Visual_CPP_ado_prog_3.cpp  
// compile with: /EHsc  
#import "msado15.dll" no_namespace rename("EOF", "EndOfFile")  
  
void main() {  
   CoInitialize(NULL);  
   try {  
      _ConnectionPtr cn("ADODB.Connection");  
      _RecordsetPtr rs("ADODB.Recordset");  
      _variant_t vtFirstName;  
  
      cn->Provider = "sqloledb";  
      cn->Open("Data Source='(local)';Initial Catalog=pubs;Integrated Security=SSPI;", "", "", adConnectUnspecified);  
  
      rs->PutRefActiveConnection( cn );  
      rs->Open("authors", vtMissing, adOpenStatic, adLockOptimistic, adCmdTable);  
      rs->MoveFirst();  
  
      // Note 1. Get a field.  
      vtFirstName = rs->Fields->GetItem((long)2)->GetValue();  
      // -or-  
      vtFirstName = rs->Fields->Item[(long)2]->Value;  
  
      printf( "First name = '%s'\n", (char*)( (_bstr_t)vtFirstName) );  
  
      rs->Fields->GetItem((long)2)->Value = L"TEST";  
      rs->Update(vtMissing, vtMissing);  
  
      // Restore name  
      rs->Fields->GetItem((long)2)->PutValue(vtFirstName);  
      // -or-  
      rs->Fields->GetItem((long)2)->Value = vtFirstName;  
      rs->Update(vtMissing, vtMissing);  
      rs->Close();  
   }  
   catch (_com_error &e) {  
      printf("Description = '%s'\n", (char*) e.Description());  
   }  
   ::CoUninitialize();  
}  

ADO オブジェクトのポインターにキャスト (IDispatch *)Casting ADO object pointers with (IDispatch *)

Visual C の例を次に示しますを使用して (IDispatch *) ADO オブジェクト ポインターのキャストにします。The following Visual C++ example demonstrates using (IDispatch *) to cast ADO object pointers.

メモNotes

次のノートは、コード例ではコメント部分に対応します。The following notes correspond to commented sections in the code example.

  1. 開いているを指定接続で明示的にコード化されたオブジェクトバリアントします。Specify an open Connection object in an explicitly coded Variant. キャスト (IDispatch *) 適切なコンス トラクターが呼び出されるようにします。Cast it with (IDispatch *) so the correct constructor will be invoked. また、2 つ目を明示的に設定 _variant_tパラメーターの既定値をtrue、オブジェクトの参照カウントされるため、適切なときに、 Recordset::Open操作を終了します。Also, explicitly set the second _variant_t parameter to the default value of true, so the object reference count will be correct when the Recordset::Open operation ends.

  2. 式では、 (_bstr_t)、キャストではありませんが、 _variant_t抽出演算子を _bstr_tから文字列、バリアントによって返される.The expression, (_bstr_t), is not a cast, but a _variant_t operator that extracts a _bstr_t string from the Variant returned by Value.

式では、 (char*)、キャストではありませんが、 _bstr_tでカプセル化された文字列へのポインターを抽出する演算子、 _bstr_tオブジェクト。The expression, (char*), is not a cast, but a _bstr_t operator that extracts a pointer to the encapsulated string in a _bstr_t object.

このセクションのコードでは、に使用できる動作の一部を示します _variant_t_bstr_t演算子。This section of code demonstrates some of the useful behaviors of _variant_t and _bstr_t operators.

// Visual_CPP_ado_prog_4.cpp  
// compile with: /EHsc  
#import "msado15.dll" no_namespace rename("EOF", "EndOfFile")  
  
int main() {  
   CoInitialize(NULL);  
   try {  
      _ConnectionPtr pConn("ADODB.Connection");  
      _RecordsetPtr pRst("ADODB.Recordset");  
  
      pConn->Provider = "sqloledb";  
      pConn->Open("Data Source='(local)';Initial Catalog='pubs';Integrated Security=SSPI", "", "", adConnectUnspecified);  
  
      // Note 1.  
      pRst->Open("authors", _variant_t((IDispatch *) pConn, true), adOpenStatic, adLockReadOnly, adCmdTable);  
      pRst->MoveLast();  
  
      // Note 2.  
      printf("Last name is '%s %s'\n",   
         (char*) ((_bstr_t) pRst->GetFields()->GetItem("au_fname")->GetValue()),  
         (char*) ((_bstr_t) pRst->Fields->Item["au_lname"]->Value));  
  
      pRst->Close();  
      pConn->Close();  
   }  
   catch (_com_error &e) {  
      printf("Description = '%s'\n", (char*) e.Description());  
   }     
   ::CoUninitialize();  
}