ようこそ ADO へ

Microsoft® ActiveX® データ オブジェクト (ADO) を使用すると、OLE DB プロバイダを通してデータベース サーバー上のデータへのアクセスと操作を行うための、クライアント アプリケーションを作成することができます。

ADO プログラマーズ リファレンス

ADO は、クライアント/サーバー アプリケーションおよび Web ベース アプリケーションを構築するための重要な機能をサポートしています。ADO の主な利点は、使用が簡単で、高速に動作し、メモリのオーバーヘッドが小さく、ディスクの使用量が少ないことです。ADO は、サーバーからクライアント アプリケーションまたは Web ページへのデータの移動、クライアント上のデータの操作、サーバーへ更新を返すといった、リモート データ サービス (RDS) の機能も備えています。

ADO の詳細については、「Microsoft ADO プログラマーズ リファレンス」を参照してください。

ADO プログラマーズ リファレンス

ActiveX Data Objects Extensions for Data Definition Language and Security (ADOX) は、ADO の機能を拡張させたもので、テーブルおよびプロシージャなどのスキーマ オブジェクトを、作成、修正、および削除するためのオブジェクトを含んでいます。これはまた、ユーザーおよびグループを保持し、オブジェクトに対する権限を与えたり取り消すためのセキュリティ オブジェクトも含みます。

ADOX の詳細については、「Microsoft ADOX プログラマーズ リファレンス」を参照してください。

ADO MD プログラマーズ リファレンス

ActiveX Data Objects (Multidimensional) (ADO MD) は、ADO を拡張して、多次元データ用オブジェクトを使用できるようにします。ADO MD を使用すると、多次元スキーマを参照し、キューブ (cube) のクエリ結果を取得することができます。

ADO MD の詳細については、「Microsoft ADO MD プログラマーズ リファレンス」を参照してください。

詳細情報

Microsoft Data Access Components SDK の詳細については、「Platform SDK」の「MDAC SDK Overview」を参照してください。


Microsoft ADO プログラマーズ リファレンス

Microsoft® ActiveX® データ オブジェクト (ADO) を利用すると、OLE DB プロバイダを通してデータベース サーバーのデータに対するアクセスおよび操作を行うアプリケーションを作成できます。ADO の主な利点は、使用が簡単で、高速に動作し、メモリのオーバーヘッドが小さく、ディスクの使用量が少ないことです。ADO は、クライアント/サーバー アプリケーションおよび Web ベース アプリケーションを構築するための重要な機能をサポートしています。

ADO は、Remote Data Service (RDS) の機能も備えており、1 回の処理で、サーバーからクライアント アプリケーションまたは Web ページにデータを移動し、そのデータをクライアントで操作し、操作後のデータをサーバーに返すことができます。RDS は、以前に Microsoft Remote Data Service 1.5 としてリリースされていましたが、クライアント側のデータ リモートを簡単にするために ADO プログラミング モデルに統合されています。

ADO の詳細および RDS を ADO と統合する方法については、｢ADO ファースト ステップ ガイド｣を参照してください。


ADO の最新情報

ADO 2.5 には、次に示す新機能、新しい参照トピック、および新しく強化されたマニュアルが含まれています。

新機能

Record オブジェクトと Stream オブジェクト

このバージョンの ADO では、ファイル システムのディレクトリおよびファイル、電子メール システムのフォルダおよびメッセージなどの表示および管理が可能な Record を採用しています。Record は Recordset の行を表すこともできますが、Record オブジェクトと Recordset オブジェクトは、それぞれに異なるメソッドとプロパティを持ちます。

新しく採用された Stream オブジェクトでは、ファイルまたはメッセージのストリームを構成するバイトまたはテキストのバイナリ ストリームの読み取り、書き込み、および管理を行うことができます。

URL の使用

このバージョンでは、接続文字列およびコマンド テキストの代わりに URL (Uniform Resource Locators ) を使ってデータ ストア オブジェクトを指定することもできます。URL は、新しい Record オブジェクトおよび Stream オブジェクトだけでなく、従来の Connection オブジェクトおよび Recordset オブジェクトでも使用できます。

このバージョンの ADO では、各自の URL スキーマを認識する OLE DB プロバイダをサポートしています。たとえば、Windows 2000 のファイル システムにアクセスするための OLE DB Provider for Internet Publishing では、既存の HTTP スキーマを認識します。

ドキュメント ソース プロバイダの特殊フィールド

"ドキュメント ソース" プロバイダという特別な種類のプロバイダは、フォルダおよびドキュメントを管理します。Record オブジェクトがドキュメントを表す場合、または Recordset オブジェクトがドキュメントのフォルダを表す場合、ドキュメント ソース プロバイダは、そのドキュメントの特性を記述する一意のフィールド セットをそのオブジェクトに配置します。これらのフィールドは、"リソース" の Record または Recordset を構成します。

新しい参照トピック

このバージョンでは、次に示す新しいプロパティが追加されています。

プロパティ | 説明
Charset | 文字列型の Stream オブジェクトの内容を、どの文字セットに変換するかを示します。
EOS | 現在の位置がストリームの末尾にあるかどうかを示します。
LineSeparator | 文字列型の Stream オブジェクトの行区切り文字として使用するバイナリ文字を示します。
Mode | Connection オブジェクト、Record オブジェクト、または Stream オブジェクトのデータを変更するための有効な権限を示します。
ParentURL | 現在の Record オブジェクトの親 Record を示す絶対 URL の文字列を示します。
Position | Stream オブジェクト内の現在の位置を示します。
RecordType | Record オブジェクトの種類を示します。
Size | ストリームのサイズをバイト数で示します。
Source | Record オブジェクトで表すエンティティを示します。
State | 対象になるすべてのオブジェクトについて、そのオブジェクトが開いているか、または閉じているかを示します。 非同期メソッドを実行するすべての対象になる Recordset オブジェクトについて、現在の状態が接続中、実行中、または検索中のいずれであるかを示します。
Type | Stream オブジェクトに含まれるデータの種類 (バイナリまたはテキスト) を示します。

このバージョンでは、次に示す新しいメソッドが追加されています。

メソッド | 説明
CopyRecord | ファイルまたはディレクトリとその内容を別の場所にコピーします。
CopyTo | Stream オブジェクトから、指定した文字数またはバイト数 (Type によって決まります) のデータを別の Stream オブジェクトにコピーします。
DeleteRecord | ファイルまたはディレクトリとそのサブディレクトリを削除します。
Flush | ADO バッファに保持されている Stream オブジェクトの内容を、その Stream オブジェクトの基になるオブジェクトに反映します。
GetChildren | この Record オブジェクトで表されているディレクトリに含まれるファイルおよびサブディレクトリを表す行を持つ Recordset オブジェクトを返します。
LoadFromFile | 既存ファイルの内容を Stream オブジェクトに読み込みます。
MoveRecord | ファイルまたはディレクトリとその内容を別の場所に移動します。
Open (ADO Record) | 既存の Record オブジェクトを開くか、または新しいファイルまたはディレクトリを作成します。
Open (ADO Stream) | バイナリ データまたはテキスト データのストリームを操作する Stream オブジェクトを開きます。
Read | バイナリ型の Stream オブジェクトから、指定したバイト数のデータを読み取ります。
ReadText | 文字列型の Stream オブジェクトから、指定した文字数のデータを読み取ります。
SaveToFile | Stream オブジェクトの内容をファイルに保存します。
SetEOS | ストリームの終わりの位置を設定します。
SkipLine | 文字列型の Stream オブジェクトの読み取り時に 1 行全体をスキップします。
Write | バイナリ データを Stream オブジェクトに書き込みます。
WriteText | 指定したテキスト文字列を文字列型の Stream オブジェクトに書き込みます。

新しく強化されたマニュアル

ADO コードの例

サンプルが強化され、Microsoft Visual C++® および Microsoft Visual J++® で記述されたサンプル コードが追加されています。サンプル コードをコピーしてエディタに貼り付けることができます。

ADO でのプロバイダの使用

ADO で OLE DB Provider for Internet Publishing を使用する方法を説明するトピックが新しく追加されています。

ADO を使用したプログラミング

この新しいトピックでは、ADO で 各種のプログラミング言語を使用するためのヒントや技法を説明しています。従来の Visual C++ Extensions for ADO および ADO/WFC の構文インデックスに加えて、Microsoft Visual Basic®、Microsoft Visual Basic®, Scripting Edition、Microsoft JScript®、Microsoft Visual C++、または Microsoft Visual J++ を使用する開発者のための新しい情報が追加されています。


ADO ファースト ステップ ガイド

ここでは、ADO と Remote Data Service (RDS) の概要、ADO と RDS のプログラミング モデルによるデータ ソースの照会や更新のチュートリアル、および ADO と RDS の使用例について説明します。ADO の使用を開始するには、次の各トピックを参照してください。

  • ADO の概要

  • RDS の概要

ADO のマニュアルには、次のトピックにも、ADO の学習および利用に役立つ情報が含まれています。

  • ADO の新機能 ADO の重要な機能、およびそれらの機能をアプリケーションで使用する方法を説明しています。

  • ADO API リファレンス ADO のオブジェクト、コレクション、プロパティ、メソッド、イベント、列挙定数、およびエラー情報について詳細に説明しています。

  • ADO を使用したプログラミング 各種の開発言語で ADO を使用するためのヒントや技法を説明しています。Visual C++ Extensions to ADO、Visual C++ with COM、および Visual J++ (ADO/WFC) の構文インデックスも用意されています。

  • ADO サンプル ADO と RDS の実際の使用方法を示すサンプル アプリケーション、および Visual Basic、C++、Java、および VBScript による ADO プロパティと ADO メソッドのサンプル コードを提供しています。

  • ADOでのプロバイダの使用 ADO で各種の OLE DB データ プロバイダおよび OLE DB サービス プロバイダを使用する方法を説明しています。

  • ADO 用語集 データ アクセス プログラミングに関する用語を定義しています。

  • Technical Articles 技術的な問題に関する情報を提供しています。これは、MDAC SDK の一部であり、さまざまな項目に関する技術的な記事が記載されています。


ADO の概要

ここでは、一連のトピックを、上から順に読み進んでください。次のトピックがあります。

  • ローカル データ アクセスのソリューション

  • 基本的な ADO プログラミング モデル

  • ADO プログラミング モデルの詳細

  • ADO プログラミング モデルとオブジェクト

  • ADO オブジェクト モデルの概要

ここには、データ ソースの照会および更新の方法を示す「ADO チュートリアル」も含まれています。

次へ ローカル データ アクセスのソリューション


ローカル データ アクセスのソリューション

問題

アプリケーションで各種のデータ ソースに対するアクセスおよび修正を可能にするためのアプリケーション プログラミング インターフェイス (API) は、簡単で一貫性のあることが望まれます。データ ソースには、テキスト ファイルのような単純なものもあれば、異種データベースの集合体のような複雑なものもあり、今後もさらに多様なデータ ソースの開発が予想されます。また、API は、データソースに対するアクセスおよび操作の手段としては使わないでください。

これらは一般的な条件ですが、代表的なデータ ソースは、オープン データベース コネクティビティ (ODBC) の規格に対応し、構造化照会言語 (SQL) で記述されたコマンドで操作するリレーショナル データベースとなっています。

この問題に対して Microsoft が提供する汎用ソリューションが、OLE DB です。OLE DBは、さまざまな情報ソースに格納されたデータに対して一貫したアクセス手法を提供する、Component Object Model (COM) インターフェイスのセットです。ただし、OLE DB アプリケーション プログラミング インターフェイスは、さまざまなアプリケーションに最適な機能を提供するために設計されており、簡易性を考慮したものではありません。

アプリケーションと OLE DB の間には、橋渡し役となる API が必要です。ActiveX データ オブジェクト (ADO) が、その橋渡し役になります。

ソリューション

ADO では、データ ソースに対するアクセスおよび更新に必要な一連の操作をまとめた "プログラミング モデル" を定義しています。プログラミング モデルは、ADO の機能全体の概要を示します。

プログラミング モデルでは、"オブジェクト モデル" を提案しています。オブジェクト モデルは、プログラミング モデルに対応し、実装を実現するための "オブジェクト" のセットです。各オブジェクトは、データの操作を実行するための "メソッド" と、データの属性を表したり、メソッドの動作を制御するための "プロパティ" を持っています。

オブジェクトには、何らかの操作が発生したか、またはこれから発生することを通知する "イベント" が関連付けられます。

次へ 基本的な ADO プログラミング モデル


基本的な ADO プログラミング モデル

ADO は、次に示す一連の操作を実行するための手段を提供します。

  1. データ ソースに接続します。必要に応じて、データ ソースに対する変更がすべて正常に実行されるか、まったく実行されないかのどちらかに決定できます。

  2. データ ソースにアクセスするためのコマンドを指定します。必要に応じて、変数パラメータを指定したり、パフォーマンスを最適化することができます。

  3. コマンドを実行します。

  4. テーブルの行の形式でデータを返すコマンドの場合は、検査、操作、または変更を容易にするために、返された行をキャッシュに格納します。

  5. 必要に応じて、行のキャッシュの変更をデータ ソースに反映します。

  6. エラー (通常は接続の確立またはコマンドの実行により発生) を検出する一般的な方法を提供します。

通常、プログラミング モデルでは、これらの手順をすべて使用します。ただし、ADO の持つ柔軟性により、プログラミング モデルの一部分のみを実行しても、有効な処理を行うことができます。たとえば、ファイルのデータを行のキャッシュに格納し、ADO リソースを使ってそのデータの検査のみを行うことができます。

次へ ADO プログラミング モデルの詳細


ADO プログラミング モデルの詳細

ADO プログラミング モデルの主な要素を次に示します。

  • 接続

  • コマンド

  • パラメータ

  • レコードセット

  • フィールド

  • エラー

  • プロパティ

  • レコード

  • ストリーム

  • コレクション

  • イベント

接続

アプリケーションからデータ ソースを利用するときは、データ交換に必要な環境である "接続" を通してアクセスします。アプリケーションからデータ ソースに直接アクセスしたり (2 層システム)、Microsoft Internet Information Services (IIS) などを中継して間接的にアクセスする (3層システム) ことができます。

オブジェクト モデルでは、接続の概念を Connection オブジェクトで表しています。

"トランザクション" は、接続を通して発生する一連のデータ アクセス操作の開始から終了までの範囲を示します。ADO では、トランザクションの操作によるデータ ソースの変更が、すべて正常に実行されるか、まったく実行されないかのどちらかになります。

トランザクションをキャンセルした場合、またはトランザクションの操作の 1 つが正常に実行されなかった場合は、そのトランザクションの操作をまったく実行しなかった場合と同じ結果になります。この場合のデータ ソースは、トランザクションの開始前と同じ状態になります。

オブジェクト モデルでは、トランザクションの概念を明示的に表すのではなく、Connection オブジェクトのメソッドのセットを使って表します。

ADO では、OLE DB プロバイダからデータおよびサービスにアクセスします。Connection オブジェクトは、特定のプロバイダおよびパラメータを指定するために使用されます。たとえば、Remote Data Service (RDS) を明示的または暗黙的に呼び出すには、Microsoft OLE DB Remoting Provider を使います。OLE DB Remoting Provider を通して RDS を呼び出す例については、「RDS チュートリアル」の手順 2 を参照してください。

接続するデータ ソースは、接続文字列または URL (Uniform Resource Locator) で指定します。

コマンド

確立された接続を通して "コマンド" が発行され、データ ソースに対する何らかの操作が行われます。通常は、コマンドを使って、データ ソースのデータの追加、削除、または更新を行ったり、テーブルの行の形式でデータを取得します。

オブジェクト モデルでは、コマンドの概念を Command オブジェクトで表しています。Command オブジェクトによって、ADO はコマンドの実行を最適化することができます。

パラメータ

多くの場合、コマンドは "パラメータ" を必要とします。パラメータは、コマンドの可変要素であり、コマンドを発行する前に変更できます。たとえば、データを取得するための同じコマンドを繰り返し発行する場合に、取得する情報の指定を毎回変更することができます。

パラメータは、特に、関数のような働きをするコマンドを実行する場合に役立ちます。この場合、何をするコマンドかということを知っていればよく、その動作内容を知る必要はありません。たとえば、口座間で金銭の移動を行う銀行送金のコマンドを発行するとします。この場合は、送金する金額をパラメータとして指定します。オブジェクト モデルでは、パラメータの概念を Parameter オブジェクトで表しています。

レコードセット

コマンドが、テーブル内の情報の行としてデータを返すクエリ (つまり、行を返すクエリ) の場合、返された行はローカルな記憶領域に格納されます。

オブジェクト モデルでは、この記憶領域を Recordset オブジェクトで表しています。

Recordset は、行のデータの検査や修正を行う主要な手段として使用されます。Recordset オブジェクトでは、次の操作を行うことができます。

  • 検査可能な行の指定

  • 行の走査

  • 行の走査順序の指定

  • 行の追加、変更、または削除

  • 変更された行によるデータ ソースの更新

  • Recordset の全体的な状態の管理

フィールド

Recordset の行は、1 つ以上の "フィールド" で構成されます。Recordset を 2 次元のグリッドと考えた場合、フィールドの並びは "列" を構成します。各フィールド (列) は、属性として名前、データ型、および値を持ちます。この値に、データ ソースの実際のデータが格納されます。

オブジェクト モデルでは、フィールドを Field オブジェクトで表しています。

データ ソースのデータを変更するには、Recordset の行の Field オブジェクトの値を変更します。最終的には、Recordset の変更はデータ ソースに反映されます。必要に応じて、Connection オブジェクトのトランザクション管理メソッドで、すべての変更が成功するか、またはすべての変更が失敗するかを決定することができます。

エラー

アプリケーションでは、常にエラーが発生する可能性があります。通常は、接続の確立やコマンドの実行に失敗した場合、または初期化されていない Recordset オブジェクトを使用しようとしたときのように、適切な状態でオブジェクトの操作ができなかった場合の結果としてエラーが発生します。

オブジェクト モデルでは、エラーを Error オブジェクトで表しています。

エラーが発生すると、1 つ以上の Error オブジェクトが作成されます。次にエラーが発生すると、前の Error オブジェクトのセットは削除されます。

プロパティ

各 ADO オブジェクトは、そのオブジェクトの動作を説明または制御する一意の "プロパティ" のセットを持ちます。

プロパティには、組み込みプロパティとダイナミック プロパティの 2 種類があります。組み込みプロパティは、ADO オブジェクトの一部であり、常に使用可能です。ダイナミック プロパティは、基になるデータ プロバイダまたはサービス プロバイダによって ADO オブジェクトの Properties コレクションに追加され、そのプロバイダが使われている間のみ存在します。

オブジェクト モデルでは、プロパティを Property オブジェクトで表しています。

レコード

データ ソースは、すべてがデータベースのテーブルとして存在するとは限りません。ファイル システムや電子メール システムなどの情報記憶システムは、"コンテナ" および "コンテンツ" という要素で構成されます。コンテナには、コンテンツまたはサブコンテナが格納されます。

コンテナとコンテンツは、ファイル システムでは "ディレクトリ" と "ファイル"、電子メール システムでは "フォルダ" と "メッセージ" になります。

オブジェクト モデルでは、コンテナまたはコンテンツを Record オブジェクトで表しています。また、Recordset の行を Record オブジェクトで表すこともあります。

Record オブジェクトでは、次の操作を行うことができます。

  • そのレコードが表すアイテムのコピー、削除、または移動

  • ディレクトリまたはファイル、Recordset の行などのアイテムを表すための新規 Record の作成

Record オブジェクトは、Connection オブジェクト、Recordset オブジェクトなど、ほかの ADO オブジェクトと組み合わせて使われます。ただし、Record オブジェクトは、「基本的な ADO プログラミング モデル」に示された ADO オブジェクトとは異なる問題を解決するために設計されています。詳細については、「Record オブジェクトと Stream オブジェクト」を参照してください。

ストリーム

ファイル システムの "ファイル" など、情報記憶システムの "コンテンツ" は、バイトのストリームで構成されます。"メモリ" のバッファも、バイトのストリームで構成されます。

オブジェクト モデルでは、バイトのストリームを Stream オブジェクトで表しています。

Stream オブジェクトでは、次の操作を行うことができます。

  • 一連のバイトまたはテキスト行の読み取りまたは書き込み。

  • ファイルからの Stream オブジェクトの作成、またはファイルへの Stream オブジェクトの保存。

Stream オブジェクトは、必ず、Record オブジェクトと組み合わせて使用されます。Stream オブジェクトは、「基本的な ADO プログラミング モデル」に示されている ADO オブジェクトとは異なる問題を解決するために設計されています。詳細については、「Record オブジェクトと Stream オブジェクト」を参照してください。

コレクション

ADO のオブジェクトの種類の 1 つに、特定の種類の別のオブジェクトを格納するための "コレクション" があります。コレクションに含まれるオブジェクトは、コレクションのプロパティを使って、名前 (テキスト文字列) または順序番号 (整数) によって取得できます。

ADO には、次の 4 種類のコレクションがあります。

  • Connection オブジェクトの Errors コレクション。データ ソースの操作に関する一回の失敗に対して作成されるすべての Error オブジェクトが格納されます。

  • Command オブジェクトの Parameters コレクション。その Command オブジェクトに適用されるすべての Parameter オブジェクトが格納されます。

  • Recordset オブジェクトおよび Record オブジェクトの Fields コレクション。その Recordset オブジェクトの列を定義するすべての Field オブジェクトが格納されます。

  • Connection、Command、Recordset、Field の各オブジェクトの Properties コレクション。各オブジェクトに適用されるすべての Property オブジェクトが格納されます。

ADO オブジェクトは、整数型 (Integer)、文字列型 (String)、ブール型 (Boolean) などの共通データ型の値を設定または取得するプロパティを持ちます。ただし、特定のプロパティについては、"コレクション オブジェクト" というデータ型の値を返すと考えると便利です。コレクション オブジェクトにも、そのコレクションに適したほかのオブジェクトの格納および取得を行うためのメソッドがあります。

たとえば、Recordset オブジェクトは、コレクション オブジェクトを返す Properties プロパティを持っていると考えることができます。コレクション オブジェクトには、その Recordset の属性を記述する Property オブジェクトの格納および取得を行うためのメソッドがあります。

イベント

"イベント" は、ある操作がこれから起こること、または既に起こったことを通知します。イベントを使用すると、複数の非同期処理で構成されるアプリケーションを効率的に作成することができます。

オブジェクト モデルでは、イベントを明示的に表すのではなく、イベント ハンドラ ルーチンの呼び出しとして表します。

操作を開始する前に呼び出されるイベント ハンドラでは、操作パラメータを検査または変更したり、その操作を取り消すかまたは実行するかを指定することができます。

操作が完了した後に呼び出されるイベント ハンドラは、非同期の操作が完了すると、そのことを通知します。一部の操作は、オプションとして、非同期処理を実行できるように拡張されています。たとえば、アプリケーションで Recordset.Open の非同期操作を開始し、操作の終了時に実行完了イベントによる通知を受けることができます。

イベントの詳細については、「ADO イベント モデルと同期および非同期処理」を参照してください。

次へ ADO プログラミング モデルとオブジェクト


ADO プログラミング モデルとオブジェクト

ADO の目的は、データ ソースにアクセスして編集および更新を行うことです。プログラミング モデルは、この目的の達成に必要な一連の操作を表しています。ADO では、次の各操作を実行するためのクラスおよびオブジェクトを提供しています。

  • データ ソースへの接続を確立します (Connection)。必要に応じて、トランザクションを開始します。

  • 必要に応じて、SQL コマンドなどのコマンドを表すオブジェクトを作成します (Command)。

  • 必要に応じて、SQL コマンドの列、テーブル、および値を変数パラメータとして指定します (Parameter)。

  • コマンドを実行します (Command、Connection、または Recordset)。

  • 行を返すコマンドの場合、行をキャッシュに格納します (Recordset)。

  • 必要に応じて、キャッシュのビューを作成します。その結果、データの並べ替え、フィルタ選択、および移動が可能になります (Recordset)。

  • 行および列の追加、削除、または変更によってデータを編集します (Recordset)。

  • 必要に応じて、キャッシュの変更をデータ ソースに反映します (Recordset)。

  • トランザクションが使われている場合、そのトランザクション中に行われた変更を受け入れるか、または拒否します。トランザクションを終了します (Connection)。

次へ ADO オブジェクト モデルの概要


ADO オブジェクト モデルの概要

ADO オブジェクトの概要

オブジェクト | 説明
Connection | データの交換を可能にします。
Command | SQL ステートメントを表します。
Parameter | SQL ステートメントのパラメータを表します。
Recordset | データの移動および操作を可能にします。
Field | Recordset オブジェクトまたは Record オブジェクトの列を表します。
Error | 接続で発生したエラーを表します。
Property | ADO オブジェクトの特性を表します。
Record | ディレクトリまたはファイルを表します。
Stream | ファイルの内容を表します。

ADO コレクションの概要

コレクション | 説明
Errors | 接続で発生した一回の失敗に対して作成されるすべての Error オブジェクトです。
Parameters | Command オブジェクトに関連付けられたすべての Parameter オブジェクトです。
Fields | Recordset オブジェクトに関連付けられたすべての Field オブジェクトです。
Properties | Connection、Command、Recordset、Field の各オブジェクトに関連付けられたすべての Property オブジェクトです。

ADO イベント ハンドラの概要

ConnectionEvents | 説明
BeginTransComplete、 CommitTransComplete、 RollbackTransComplete | トランザクション管理 - その接続で現在のトランザクションを開始したこと、コミットしたこと、またはロール バックしたことを通知します。
WillConnect、 ConnectComplete、 Disconnect | 接続管理 - 現在の接続をこれから開始すること、開始したこと、または終了したことを通知します。
WillExecute、 ExecuteComplete | コマンド実行管理 - その接続で現在のコマンドをこれから開始すること、または終了したことを通知します。
InfoMessage | 情報 - 現在の操作に関する追加情報があることを通知します。

RecordsetEvents | 説明
FetchProgress、 FetchComplete | 取得状況 - データ取得操作の進行状況、または取得操作が完了したことを通知します。
WillChangeField、 FieldChangeComplete | フィールド変更管理 - 現在のフィールド値をこれから変更すること、または変更したことを通知します。
WillMove、 MoveComplete、 EndOfRecordset | 移動管理 - Recordset のカレント行の位置をこれから変更すること、変更したこと、または Recordset の終わりに達したことを通知します。
WillChangeRecord、 RecordChangeComplete | 列変更管理 - Recordset のカレント行の内容をこれから変更すること、または変更したことを通知します。
WillChangeRecordset、 RecordsetChangeComplete | レコードセット変更管理 - 現在の Recordset の内容をこれから変更すること、または変更したことを通知します。


ADO チュートリアル

このチュートリアルでは、データ ソースのクエリと更新のために ADO プログラミング モデルを使用する方法を説明します。最初に、この処理の実行に必要な手順を説明します。続いて、Microsoft Visual Basic、Microsoft Visual C++ (VC++ Extensions を中心に)、および Microsoft Visual J++ (ADO for Windows Foundation Classes (ADO/WFC) を中心に) のコードを示します。

このチュートリアルは、次の 2 つの理由から複数の言語でコーディングされています。

  • ADO のマニュアルは、読者が Visual Basic でコーディングすることを前提にしています。これは Visual Basic プログラマには有利ですが、ほかの言語を使用しているプログラマにとってはやや不便です。

  • ADO の特定の機能についてわからない場合に、ほかの言語について多少の知識があれば、その言語で記述された同じ機能を参照することが疑問点の解消に役立ちます。

このチュートリアルの構成

このチュートリアルは、ADO プログラミング モデルに対応した手順に分けて構成されています。さらに、それぞれの手順に Visual Basic コードの一部を示してあります。チュートリアルの最後では、すべてのコード片を Visual Basic の例として統合しています。

次に、この統合された例を別のプログラミング言語で示します。各プログラミング言語例のそれぞれの手順には、番号を付けてあります。チュートリアルの説明に対応する内容を参照するには、この番号を利用してください。

ADO プログラミング モデルについて、次に説明します。チュートリアルを使用するうえでのガイドラインとしてご利用ください。

ADO プログラミング モデルとオブジェクト

  • データ ソースへ接続します (Connection)。必要に応じて、トランザクションを開始します。

  • 必要に応じて、SQL コマンドを表すオブジェクトを作成します (Command)。

  • 必要に応じて、SQL コマンド内に変数パラメータとして、列、テーブル、および値を指定します (Parameter)。

  • コマンドを実行します (Command、Connection、または Recordset)。

  • 行を返すコマンドの場合は、ストレージ オブジェクトに行を格納します (Recordset)。

  • 必要に応じて、ストレージ オブジェクトのビューを作成し、データの並べ替え、フィルタの適用、移動ができるようにします (Recordset)。

  • 行および列の追加、削除、または変更など、データを編集します (Recordset)。

  • 適切であれば、ストレージ オブジェクトにある変更でデータ ソースを更新します (Recordset)。

  • トランザクションが使用された場合は、そのトランザクション中に行われた変更を受け入れるか、または破棄します。トランザクションを終了します (Connection)。

次へ 手順 1： 接続を開く


手順 1: 接続を開く (ADO チュートリアル)

ここでは、次の操作のうちの太字の部分を行います。

  • データ ソースに接続します。

  • 必要に応じて、SQL クエリ コマンドを表すオブジェクトを作成します。

  • 必要に応じて、SQL コマンド内に変数パラメータとして値を指定します。

  • コマンドを実行します。行を返すコマンドの場合は、ストレージ オブジェクトに行を格納します。

  • 必要に応じて、データの移動、調査、操作、および編集を行います。

  • 適切であれば、ストレージ オブジェクトにある変更でデータ ソースを更新します。必要に応じて、トランザクションに更新内容を埋め込みます。

  • トランザクションが使用された場合は、トランザクション中に行われた変更を受けるか、または破棄します。トランザクションを終了します。

説明

データを交換するためには、データ交換ができる状態を成立させる手段、つまり "接続" が必要です。接続するデータ ソースは "接続文字列" に指定しますが、接続文字列に指定するパラメータは、それぞれのデータ プロバイダとデータ ソースによって異なる場合があります。

ADO が接続を開く主な方法として、Connection.Open メソッドの使用があります。それ以外にも、ショートカット メソッドである Recordset.Open を使う方法があります。この場合には、接続を開き、その接続を通じてコマンドを発行することの両方を 1 回の操作で行うことができます。それぞれのメソッドの Visual Basic 構文を次に示します。

connection.Open ConnectionString, UserID, Password, OpenOptions
recordset.Open Source, ActiveConnection, CursorType, LockType, Options

この 2 つのメソッドを比較すると、ADO メソッドのパラメータに一般的な、いくつかの有用な特性がわかります。

メソッドのパラメータを指定するには、いくつかの方法があります。たとえば Recordset.Open では ActiveConnection パラメータを使用しますが、リテラル文字列、その文字列を表す変数、または開かれた接続を表す Connection オブジェクトを指定することができます。

このチュートリアルでは、リテラルの接続文字列、"DSN=Pubs;uid=sa;pwd=;" を使用します (データ ソースは、"DSN=" キーワードで間接的に指定されます。詳細については、「Microsoft OLE DB Provider for ODBC」の「接続文字列の例」を参照してください)。

多くのオブジェクトには、メソッド パラメータが指定されなかった場合に引数になるプロパティがあります。たとえば、Connection オブジェクトに ConnectionString プロパティを設定すると Connection.Open メソッドに接続文字列情報が渡されるので、Open メソッドでは ConnectionString パラメータを省略できます。

このチュートリアルでは、次の Connection オブジェクト宣言と Open メソッドを使います。

Dim cnn As New ADODB.Connection
cnn.Open "DSN=Pubs;uid=sa;pwd=;"

次へ 手順 2： コマンドの作成


手順 2: コマンドの作成 (ADO チュートリアル)

ここでは、次の操作のうちの太字の部分を行います。

  • データ ソースに接続します。

  • 必要に応じて、SQL クエリ コマンドを表すオブジェクトを作成します。

  • 必要に応じて、SQL コマンド内に変数パラメータとして値を指定します。

  • コマンドを実行します。行を返すコマンドの場合は、ストレージ オブジェクトに行を格納します。

  • 必要に応じて、データの移動、調査、操作、および編集を行います。

  • 適切であれば、ストレージ オブジェクトにある変更でデータ ソースを更新します。必要に応じて、トランザクションに更新内容を埋め込みます。

  • トランザクションが使用された場合は、そのトランザクション中に行われた変更を受け入れるか、または破棄します。トランザクションを終了します。

説明

"コマンド" は、データ ソースを変更、管理、または操作するデータ プロバイダによって解釈される命令です。コマンドは通常 SQL で記述されますが、特別なコマンド言語が必要なわけではありません。"クエリ" コマンドで、情報行が含まれた Recordset オブジェクトをデータ プロバイダが取得するように要求します。

次のいずれかの方法で、コマンドを指定します。

  • リテラル文字列、または文字列を表す変数の "コマンド テキスト" を指定します。

  • コマンドを表すオブジェクトを指定します。この場合は、コマンド テキストに設定される Command オブジェクトの CommandText プロパティの値です。

パラメータ化コマンドの簡単な説明については、「コマンドの作成 (ADO チュートリアル) サイドバー」を参照してください。

このチュートリアルでは、Pubs データベースの Authors テーブルにあるすべての情報を求めるクエリを実行します。Command オブジェクトが宣言され、開かれた Connection オブジェクトとコマンド テキストで設定されます。コードは、次のようになります。

Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = cnn
cmd.CommandText = "SELECT * from Authors"

次へ 手順 3： コマンドの実行


手順 3: コマンドの実行 (ADO チュートリアル)

ここでは、次の操作のうちの太字の部分を行います。

  • データ ソースに接続します。

  • 必要に応じて、SQL クエリ コマンドを表すオブジェクトを作成します。

  • 必要に応じて、SQL コマンド内に変数パラメータとして値を指定します。

  • コマンドを実行します。行を返すコマンドの場合は、ストレージ オブジェクトに行を格納します。

  • 必要に応じて、データの移動、調査、操作、および編集を行います。

  • 適切であれば、ストレージ オブジェクトにある変更でデータ ソースを更新します。必要に応じて、トランザクションに更新内容を埋め込みます。

  • トランザクションが使用された場合は、そのトランザクション中に行われた変更を受け入れるか、または破棄します。トランザクションを終了します。

説明

Recordset を返すメソッドは、Connection. Execute、Command.Execute、および Recordset.Open の 3 種類です。Visual Basic でのこれらのメソッドの構文を次に示します。

connection.Execute(CommandText, RecordsAffected, Options)
command.Execute(RecordsAffected, Parameters, Options)
recordset.Open Source, ActiveConnection, CursorType, LockType, Options

これらのメソッドは、特定のオブジェクトの長所を利用できるよう最適化されています。

コマンドを発行する前に、暗黙的に、または明示的に接続を開いておく必要があります。コマンドを発行する各メソッドは、それぞれ異なった接続を表しています。

  • Connection.Execute メソッドでは、Connection オブジェクト自身の内部に組み込まれた接続を使います。

  • Command.Execute メソッドでは、ActiveConnection プロパティに設定された Connection オブジェクトを使います。

  • Recordset.Open メソッドでは、接続文字列、ActiveConnection パラメータ、または ActiveConnection プロパティに設定された Connection オブジェクトを使います。

また、この 3 つのメソッドではコマンドの指定方法も異なります。

  • Connection.Execute メソッドでは、コマンドはコマンド テキストです。

  • Command.Execute メソッドではコマンドは表示されず、Command.CommandText プロパティに指定されています。さらに、コマンドをパラメータ化することができます。

  • Recordset.Open メソッドでは、コマンドは Source 引数です。この引数をコマンド テキストまたは Command オブジェクトにすることができます (Source 引数を、テーブル名、ストアド プロシージャ、または永続的な Recordset のファイル名を指す文字列にすることもできます)。

それぞれのメソッドは、機能とパフォーマンスにおいて一長一短があります。

  • Execute メソッドは、データを返さないコマンドを実行することを目的にしていますが、それだけに限定されてはいません。

  • どちらの Execute メソッドも読み取り専用、前方スクロールのみ可能な Recordset オブジェクトを返します。

  • Command.Execute メソッドでは、効率的に再使用できるパラメータ化コマンドを使用できます。

  • Open メソッドでは CursorType (データのアクセスに使用するストラテジとオブジェクト) と LockType (ほかのユーザーからの "隔離" の程度を指定し、カーソルが "即時モード" または "バッチ モード" (後で詳しく説明) での更新をサポートするかどうか) を指定できます。

これらのオプションを習得してください。Recordset の機能の多くが組み込まれています。特に重要なことは、Microsoft Cursor Service for OLE DB を使用するかどうかの判断です。この実装方法の詳細については、「Microsoft Cursor Service for OLE DB」を参照してください。

このチュートリアルでは、バッチ モードで Recordset を変更します。したがって、adLockBatchOptimistic の LockType が指定されます。バッチ処理には Cursor Service が必要なので、CursorLocation プロパティが adUseClient に設定されます。開いている接続に Command オブジェクトが既に設定されているので、ActiveConnection パラメータを Open メソッドに指定することはできません。

Recordset が宣言され、次のように使用されます。

Dim rs As New ADODB.Recordset
rst.CursorLocation = adUseClient
rst.Open cmd, , adOpenStatic, adLockBatchOptimistic

次へ 手順 4： データの操作


手順 4: データの操作 (ADO チュートリアル)

ここでは、次の操作のうちの太字の部分を行います。

  • データ ソースに接続します。

  • 必要に応じて、SQL クエリ コマンドを表すオブジェクトを作成します。

  • 必要に応じて、SQL コマンド内に変数パラメータとして値を指定します。

  • コマンドを実行します。行を返すコマンドの場合は、ストレージ オブジェクトに行を格納します。

  • 必要に応じて、データの移動、調査、操作、および編集を行います。

  • 適切であれば、ストレージ オブジェクトにある変更でデータ ソースを更新します。必要に応じて、トランザクションに更新内容を埋め込みます。

  • トランザクションが使用された場合は、そのトランザクション中に行われた変更を受け入れるか、または破棄します。トランザクションを終了します。

説明

Recordset オブジェクトのメソッドとプロパティで、Recordset のデータの調査、移動、および操作を行います。

Recordset は、行の配列とみなすことができます。いつでも好きなときに調査したり操作できる行が、"カレント行" です。また、Recordset での現在の位置が "カレント行位置" です。別の行に移動するたびに、移動先の行が新しいカレント行になります。

Recordset 内を明示的に "移動" するメソッドがあります (Move メソッド)。また、操作の二次的効果として Recordset 内を移動するメソッドもあります (Find メソッド)。さらに、プロパティによっては、設定することで行位置が変更される場合があります(Bookmark プロパティ)。Recordset オブジェクトの CursorType プロパティ、または Open メソッドの CursorType パラメータで、Recordset 内を前方および後方へ移動できるように指定します。

Filter プロパティで、アクセスできる行 (画面に表示される行) を制御します。Sort プロパティで、Recordset の行を移動する順序を制御します。

また、AddNew メソッドで新しい行を作成したり、Delete メソッドで既存の行を削除することができます。

Recordset にある Fields コレクションは、各フィールド、または行のフィールド (または列) を表す Field オブジェクトの集まりです。Field オブジェクトの Value プロパティで、フィールドにデータを代入したり、フィールドからデータを取得します。また、GetRows メソッドで大量のフィールド データにアクセスできます。Recordset を変更した後、Update メソッドを使って変更部分をデータ ソースに反映します。

このチュートリアルでは、次の処理を行います。

  • 並べ替えと抽出のパフォーマンスを向上させるため、au_lname Field オブジェクトの Properties コレクションにある Optimize プロパティを設定します。

  • それぞれの著作者の姓で Recordset を並べ替えます。

  • Recordset にフィルタを適用して、市外局番 "415" で交換番号が "5" で始まる電話番号の著作者の行にだけアクセスできるようにします。

  • 抽出された電話番号を架空の市外局番 "777" に変更します。

Move メソッドを使って、並べ替えられて、フィルタが適用された Recordset の、最初から最後まで移動します。Recordset オブジェクトの EOF プロパティが最後の行に移動したことを示したら、停止します。Recordset 内を移動するにつれ、著作者の姓名と元の電話番号が表示され、phone フィールドの市外局番が "777" に変化します (phone フィールドの電話番号は、"aaa xxx-yyyy" の形式です。aaa は市外局番、xxx は交換番号です)。

各行が変更されるのでフィルタに指定された条件に一致する番号がなくなり、Recordset 内には何も表示されなくなります。フィルタがクリアされると、すべての行が再び表示されます。

Authors テーブルのレイアウトについては、「データの操作 (ADO チュートリアル) のスキーマ」を参照してください。コードは、次のようになります。

rst!au_lname.Properties("Optimize") = True
rst.Sort = "au_lname"
rst.Filter = "phone LIKE '415 5*'"
rst.MoveFirst
Do While Not rst.EOF
    Debug.Print "Name = "; rst!au_fname; " "; rst!au_lname; _
        ", Phone = "; rst!phone
    rst!phone = "777" & Mid(rst!phone, 4)
    rst.MoveNext
Loop
rst.Filter = adFilterNone

次へ 手順 5： データの更新


手順 5: データの更新 (ADO チュートリアル)

ここでは、次の操作のうちの太字の部分を行います。

  • データ ソースに接続します。

  • 必要に応じて、SQL クエリ コマンドを表すオブジェクトを作成します。

  • 必要に応じて、SQL コマンド内に変数パラメータとして値を指定します。

  • コマンドを実行します。行を返すコマンドの場合は、ストレージ オブジェクトに行を格納します。

  • 必要に応じて、データの移動、調査、操作、および編集を行います。

  • 適切であれば、ストレージ オブジェクトにある変更でデータ ソースを更新します。必要に応じて、トランザクションに更新内容を埋め込みます。

  • トランザクションが使用された場合は、そのトランザクション中に行われた変更を受け入れるか、または破棄します。トランザクションを終了します。

説明

これまでに、Recordset のいくつかの行でデータを変更しました。ADO は、データ行の追加、削除、および変更に関連する 2 つの基本的な考え方をサポートしています。

1 つ目は、Recordset への変更が即座に行われないという考え方です。その代わり、変更は内部の "コピー バッファ" で行われます。変更を行わないと決めると、コピー バッファにある変更は破棄されます。変更をそのまま行う場合は、コピー バッファにある変更が Recordset に適用されます。

2 つ目は、行に対する作業が完了したと宣言すると直ちに、変更がデータ ソースに反映されるという考え方です ("即時" モード)。または、行セットへのすべての変更はセット全体の作業が完了したと宣言するまで収集されないという考え方です ("バッチ" モード)。LockType プロパティによって、基になるデータ ソースへの変更が行われる時点が決定されます。CursorLocation プロパティは、どの LockType の設定値が有効かということに影響を与えます。たとえば、CursorLocation プロパティが adUseClient に設定されている場合、adLockPessimistic の設定値はサポートされません。

即時モードでは、Update メソッドが実行されるたびに変更がデータ ソースへ反映されます。バッチ モードでは、Update の呼び出し、またはカレント行位置の移動が行われるたびに変更がコピー バッファに保存されますが、データ ソースに変更が反映するのは UpdateBatch メソッドのみです。バッチ モードで Recordset を開くと (adLockBatchOptimistic)、更新もバッチ モードで行われます。

必要に応じて、"トランザクション" 内で更新を行うことができます。トランザクションは、トランザクション内の操作がすべて成功するか、またはすべての結果を取り消すという環境を確立します。

トランザクションの一般的な例として、銀行業務のアプリケーションがあります。ある操作が口座から一定の金額を差し引き、別の操作が別の口座に同じ金額を振り込む場合、両方の操作とも成功する必要があります。一方の操作が失敗した場合、もう一方の操作も元に戻す必要があります。そうしないと、各口座間の均衡がとれません。

トランザクションでは通常、データ ソースの制限されたリソースを長時間にわたって割り当て、拘束します。このため、できるだけ短時間でトランザクションを終了させることをお勧めします (このため、このチュートリアルでは、接続が行われても、直ちにトランザクションを開始しませんでした)。

実際は、このチュートリアルにトランザクションは必要ありませんが、わかりやすく説明するために含めてあります。トランザクションを開始し、バッチ更新を実行するコードは、次のようになります。

cnn.BeginTrans
rst.UpdateBatch

次へ 手順 6： 更新の終了


手順 6: 更新の終了 (ADO チュートリアル)

ここでは、次の操作のうちの太字の部分を行います。

  • データ ソースに接続します。

  • 必要に応じて、SQL クエリ コマンドを表すオブジェクトを作成します。

  • 必要に応じて、SQL コマンド内に変数パラメータとして値を指定します。

  • コマンドを実行します。行を返すコマンドの場合は、ストレージ オブジェクトに行を格納します。

  • 必要に応じて、データの移動、調査、操作、および編集を行います。

  • 適切であれば、ストレージ オブジェクトにある変更でデータ ソースを更新します。必要に応じて、トランザクションに更新内容を埋め込みます。

  • トランザクションが使用された場合は、そのトランザクション中に行われた変更を受け入れるか、または破棄します。トランザクションを終了します。

説明

バッチ更新がエラーで終了したと想定します。エラーの性質と重要度のレベル、およびアプリケーションのロジックによって、エラーの解決方法は異なります。ただし、ほかのユーザーと共用しているデータベースの場合は、自分が変更する前にほかのユーザーが同じフィールドを変更していたことが典型的なエラーになります。このようなエラーは "競合" と呼ばれます。ADO はこうした状況を検出し、エラーとして報告します。

このチュートリアルの手順は 2 つに分かれています。更新エラーがない場合は、データ ソースに更新内容が反映されます。トランザクションは "コミット" されます。トランザクションのコミットで、トランザクションは終了します。

更新を受け入れるコードは、次のようになります。

cnn.CommitTrans

更新エラーが発生した場合、エラー処理ルーチン内でエラーがトラップされます。adFilterConflictingRecords 定数で Recordset にフィルタを適用すると、競合の発生した行だけが表示されます。エラーの解決方法は、単に著作者の姓と名 (au_fname と au_lname) を出力するだけで、トランザクションは "ロールバック" されます (つまり、処理前の状態に戻されます)。トランザクションをロールバックすると、成功した更新も廃棄され、トランザクションが終了します。

更新を拒否するコードは、次のようになります。

rst.Filter = adFilterConflictingRecords
rst.MoveFirst
Do While Not rst.EOF
    Debug.Print "Conflict: Name =  "; rst!au_fname; " "; rst!au_lname
    rst.MoveNext
Loop
cnn.RollbackTrans

更新の終了後に Recordset と Connection オブジェクトが閉じられ、この例が終了します。コードは、次のようになります。

rst.Close
cnn.Close

これでチュートリアルを終了します。


ADO チュートリアル (Visual Basic)

これは、Microsoft Visual Basic でコーディングされた ADO チュートリアルです。このチュートリアルの目的については、「ADO チュートリアル」を参照してください。

Public Sub Main()    ' Tutorial in VB

Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset

' Step 1 - Open a Connection
cnn.Open "DSN=Pubs;uid=sa;pwd=;"

' Step 2 - Create a Command
Set cmd.ActiveConnection = cnn
cmd.CommandText = "SELECT * from Authors"

' Step 3 - Execute the Command
rst.CursorLocation = adUseClient
rst.Open cmd, , adOpenStatic, adLockBatchOptimistic

' Step 4 - Manipulate the Data
rst!au_lname.Properties("Optimize") = True
rst.Sort = "au_lname"
rst.Filter = "phone LIKE '415 5*'"
rst.MoveFirst
Do While Not rst.EOF
    Debug.Print "Name = "; rst!au_fname; " "; rst!au_lname; _
        ", Phone = "; rst!phone
    rst!phone = "777" & Mid(rst!phone, 4)
    rst.MoveNext
Loop

rst.Filter = adFilterNone

' Step 5 - Update the Data
cnn.BeginTrans
On Error GoTo ConflictHandler
rst.UpdateBatch

'Step 6, part A - Conclude the Update (Accept changes)
cnn.CommitTrans

ExitTutorial:
On Error GoTo 0
rst.Close
cnn.Close
Exit Sub

'Step 6, part B - Conclude the Update (Reject changes)
ConflictHandler:
rst.Filter = adFilterConflictingRecords
rst.MoveFirst
Do While Not rst.EOF
    Debug.Print "Conflict: Name =  "; rst!au_fname; " "; rst!au_lname
    rst.MoveNext
Loop
cnn.RollbackTrans
Resume ExitTutorial

End Sub

これで Visual Basic チュートリアルを終了します。


ADO チュートリアル (Visual C++)

これは、#import ディレクティブを加えて Microsoft Visual C++ でコーディングされたADO チュートリアルです。このチュートリアルの目的については、「ADO チュートリアル」を参照してください。

#import ディレクティブは、ADO タイプ ライブラリから関数を生成してヘッダー ファイルに入れます。このヘッダー ファイルによって、ADO と Visual C++ が Microsoft Visual Basic のように使いやすくなります。

このチュートリアルでは、Visual C++ Extension for ADO も扱います。Visual C++ Extensions では自動的に変換が行われ、指定された Recordset のフィールドの値でローカル インスタンスの変数が設定されます。Visual C++ Extensions は、AddNew および Update メソッドもサポートします。

#import ディレクティブで、ADO の各プロパティとメソッドのためのエラー処理ルーチンが生成されます。このチュートリアルでは、非 ADO 関数のために同じエラー処理ルーチンを呼び出す便利な方法として、関数の TESTHR() が提供されています。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>
#include <icrsint.h>   //Include support for VC++ Extensions

void dump_com_error(_com_error &e)
   {
   printf("Error:\n");
   printf("Code = %08lx\n", e.Error());
   printf("Code meaning = %s\n", e.ErrorMessage());
   printf("Source = %s\n", (LPCSTR) e.Source());
   printf("Description = %s\n", (LPCSTR) e.Description());
   }

inline void TESTHR( HRESULT _hr )
   { if FAILED(_hr) _com_issue_error(_hr); }

class CCustomRs :
   public CADORecordBinding
{
BEGIN_ADO_BINDING(CCustomRs)
   ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_fname,
         sizeof(m_szau_fname), lau_fnameStatus, false)
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_lname,
         sizeof(m_szau_lname), lau_lnameStatus, false)
   ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_szphone,
         sizeof(m_szphone),    lphoneStatus,    true)
END_ADO_BINDING()

public:
   CHAR   m_szau_fname[22];
   ULONG   lau_fnameStatus;
   CHAR   m_szau_lname[42];
   ULONG   lau_lnameStatus;
   CHAR   m_szphone[14];
   ULONG   lphoneStatus;
};

VOID   main()         // Tutorial in VC
   {
   IADORecordBinding   *picRs = NULL;

   ::CoInitialize(NULL);

   try
      {
      _ConnectionPtr pConn("ADODB.Connection");
      _RecordsetPtr pRs("ADODB.Recordset");
      _CommandPtr pCmd("ADODB.Command");
      CCustomRs rs;

// Step 1: Open a connection
      pConn->Open("dsn=Pubs;", "sa", "", adConnectUnspecified);

// Step 2: Create a command
      pCmd->CommandText = "select * from Authors";
      pCmd->ActiveConnection = pConn;

// Step 3: Execute the command
      pRs->CursorLocation = adUseClient;
      pRs->Open((IDispatch *) pCmd, vtMissing,
         adOpenStatic, adLockBatchOptimistic, adCmdUnspecified);

      TESTHR(pRs->QueryInterface(__uuidof(IADORecordBinding),
               (LPVOID*)&picRs));
      TESTHR(picRs->BindToRecordset(&rs));

// Step 4: Manipulate the data
      pRs->Fields->GetItem("au_lname")->Properties->GetItem("Optimize")->Value = true;
      pRs->Sort = "au_lname ASC";
      pRs->Filter = "phone LIKE '415 5*'";

      pRs->MoveFirst();
      while (VARIANT_FALSE == pRs->EndOfFile)
         {
         printf("Name: %s\t %s\tPhone: %s\n",
            (rs.lau_fnameStatus == adFldOK ? rs.m_szau_fname : ""),
            (rs.lau_lnameStatus == adFldOK ? rs.m_szau_lname : ""),
            (rs.lphoneStatus == adFldOK ? rs.m_szphone   : ""));

         if (rs.lphoneStatus == adFldOK)
            memcpy(rs.m_szphone, "777", 3);

         TESTHR(picRs->Update(&rs));   // Add change to the batch

      // Change the current row of the Recordset.
      // Recordset data for the new current row will automatically be
      // extracted and placed in the CCustomRs C++ instance variables.

         pRs->MoveNext();
         }

      pRs->Filter = (long) adFilterNone;

// Step 5: Update the data
      pConn->BeginTrans();
      try
         {
         pRs->UpdateBatch(adAffectAll);

// Step 6, part A: Conclude the update - Accept changes
         pConn->CommitTrans();
         }

// Step 6, part B: Conclude the update - Reject changes
      catch (_com_error &e)
         {
         dump_com_error(e);
         pRs->Filter = (long) adFilterConflictingRecords;
         pRs->MoveFirst();
         while (VARIANT_FALSE == pRs->EndOfFile)
            {
            printf("Conflict: Name = %s\t %s\n",
               (rs.lau_fnameStatus == adFldOK ? rs.m_szau_fname : ""),
               (rs.lau_lnameStatus == adFldOK ? rs.m_szau_lname : ""));
            pRs->MoveNext();
            }
         pConn->RollbackTrans();
         }

      if (picRs) picRs->Release();
      pRs->Close();
      pConn->Close();
      }

   catch (_com_error &e)
      {
      dump_com_error(e);
      }

   CoUninitialize();
   }

これで Visual C++ チュートリアルを終了します。


ADO チュートリアル (Visual J++)

これは、ADO/WFC クラスを中心とした、Microsoft Visual J++ でコーディングされた ADO チュートリアルです。このチュートリアルの目的については、「ADO チュートリアル」を参照してください。

import com.ms.wfc.data.*;

/**
* ADOTutorial:
* Purpose: Demonstrates the usage of Ado in Java.
*          Opens a recordset through a command object
*          and illustrates update within a transaction
*/
public class ADOTutorial
{
   //odbc-style connection string
   public static String strConn =
      "Driver={SQL Server};SERVER=YourServer;DATABASE=Pubs;" +
      "UID=testmod;PWD=testmod;";

   public static void main(String args[] )   // Tutorial in VJ
   {
      try
      {
         Connection conn = new Connection();
         Command cmd = new Command();
         Recordset rs = new Recordset();

         Field fld;
         AdoProperties fldProps;

// STEP 1: Open the connection
         conn.open(strConn);

// STEP 2: Create a command
         cmd.setActiveConnection(conn);
         cmd.setCommandText("SELECT * from Authors");

// STEP 3: Open the recordset with the source as a command object
         rs.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
         rs.setCursorType(AdoEnums.CursorType.DYNAMIC);
         rs.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
         rs.open (cmd);

// STEP 4: Manipulate the data
         fldProps  = rs.getField("au_lname").getProperties();
         fldProps.getItem("Optimize").setBoolean(true);
         rs.setSort("au_lname");
         rs.setFilter("phone like '415 5*'");

         rs.moveFirst();
         while ( !rs.getEOF())
         {
            StringBuffer strBuf = new StringBuffer();
            System.out.println( " Name: " +
               rs.getField("au_fname").getString() +
               "  " + rs.getField("au_lname").getString() +
               "   Phone : " + rs.getField("phone").getString() );

            //Change area code 415 to 777.
            fld =  rs.getField("phone");
            strBuf.append( fld.getString());
            strBuf.setCharAt(0, '7');
            strBuf.setCharAt(1, '7');
            strBuf.setCharAt(2, '7');

            //set the field to the new value
            fld.setString(strBuf.toString());

            rs.moveNext();
         }

         rs.setFilter(new Integer(AdoEnums.FilterGroup.NONE));

// STEP 5: Update the data
         conn.beginTrans();
         try
         {
            rs.updateBatch();

// STEP 6 PART A: Conclude the Update - Accept changes
            conn.commitTrans();
         }

// STEP 6 PART B: Conclude the Update - Reject changes
         catch(AdoException ex)
         {
            rs.setFilter(new Integer
                        (AdoEnums.FilterGroup.CONFLICTINGRECORDS));
            rs.moveFirst();
            while(!rs.getEOF())
            {
               //print conflicting records
               System.out.println("Conflict : Name : " +
                  rs.getField("au_fname").getString() + " " +
                  rs.getField("au_lname").getString() );
               rs.moveNext();
            }
            conn.rollbackTrans();
         }

         rs.close();
         conn.close();

      }
      catch(Exception ex)
      {
         ex.printStackTrace();
      }
   }
}

これで Visual J++ チュートリアルを終了します。


RDS の概要

ここでは、一連のトピックを、示されている順に読み進んでください。次のトピックがあります。

  • リモート データ アクセスのソリューション

  • 基本的な RDS プログラミング モデル

  • RDS プログラミング モデルの詳細

  • ADO プログラミング モデルとオブジェクト

  • RDS オブジェクト モデルの概要

ここには、データ ソースに対するアクセスおよび更新の方法を示す「RDS チュートリアル」と「RDS のシナリオ」、および RDS についてさらに詳細に解説する「RDS の使用」の一連のトピックも含まれています。

次へ リモート データ アクセスのソリューション


リモート データ アクセスのソリューション

問題

ADO では、アプリケーションからデータ ソースに直接アクセスし、データ ソースを変更することができます。これは 2 層システムとも呼ばれます。たとえば、自分のデータが格納されているデータ ソースに接続する場合は、2 層システムによる直接接続になります。

一方、Microsoft Internet Information Services (IIS) などを中継して、データ ソースに間接的にアクセスすることが必要になる場合もあります。この構成は、3 層システムとも呼ばれます。IIS は、ローカル (クライアント) アプリケーションからインターネットまたはイントラネットを介してリモート (サーバー) プログラムを効率的に呼び出すことができるようにするためのクライアント/サーバー システムです。サーバー プログラムからデータ ソースにアクセスし、取得したデータを処理することもできます。

たとえば、Microsoft Visual Basic, Scripting Edition (VBScript) で記述された、IIS に接続するアプリケーションがイントラネットの Web ページに配置されているとします。この場合、IIS が実際のデータ ソースに接続してデータを取得し、必要な処理を行ったうえで、処理済みの情報をアプリケーションに返します。

この例では、アプリケーションがデータ ソースに直接アクセスすることはなく、IIS がデータ ソースにアクセスします。IIS は、ADO によってデータにアクセスします。

注意 クライアント/サーバー アプリケーションは、必ずしもインターネットまたはイントラネットを基にする (つまり、Web ベースである) 必要はなく、ローカル エリア ネットワーク上のコンパイル済みのプログラムだけで構成される場合もあります。ただし、一般的には、Web ベースのアプリケーションの場合がほとんどです。

グリッド、チェック ボックス、リストなどのビジュアル コントロールの中には、返された情報を使用するものがあるため、返された情報は、ビジュアル コントロールで容易に使用できる必要があります。

3 層システムを利用する場合も、2 層システムで取得した場合と同じようにスムーズに情報を返す、シンプルで効率の良いアプリケーション プログラミング インターフェイスが望まれます。Remote Data Service (RDS) が、これに該当するインターフェイスです。

ソリューション

RDS では、IIS などを中継してデータにアクセスするためのプログラミング モデルを定義しています。プログラミング モデルは、データ ソースに対するアクセスおよび更新に必要な一連の操作をまとめたものです。プログラミング モデルは、RDS の機能全体の概要を示します。

次へ 基本的な RDS プログラミング モデル


基本的な RDS プログラミング モデル

RDS は、次のような状況にあるクライアント アプリケーションを対象としています。このクライアント アプリケーションでは、サーバー上で実行するプログラムと、目的の情報を返すために必要なパラメータを指定します。サーバー上で呼び出されたプログラムは、指定されたデータ ソースにアクセスして情報を取得します。また、そのデータを処理することも可能です。次に、結果の情報を、使用しやすい形式でクライアント アプリケーションに返します。RDS は、次に示す一連の操作を実行する手段を提供します。

  1. サーバー上で呼び出すプログラムを指定し、クライアントがそのプログラムを参照する手段を獲得します。この参照は、"プロキシ" とも呼ばれます。これはリモート サーバー プログラムを表します。クライアント アプリケーションは、ローカル プログラムを呼び出すようにプロキシを "呼び出し" ますが、実際にはリモート サーバー プログラムを呼び出します。

  2. サーバー プログラムを呼び出します。データ ソースおよび発行するコマンドを識別するためのパラメータをサーバー プログラムに渡します。サーバー プログラムは、実際に ADO を使ってデータ ソースにアクセスします。ADO は、渡されたパラメータの 1 つを使用して接続し、もう 1 つのパラメータに指定されているコマンドを発行します。

  3. サーバー プログラムは、データ ソースから Recordset オブジェクトを取得します。また、Recordset オブジェクトをサーバー上で処理することもできます。

  4. サーバー プログラムは、結果の Recordset オブジェクトをクライアント アプリケーションに返します。

  5. クライアントでは、返された Recordset オブジェクトが、ビジュアル コントロールで使用されやすい形式に変換されます。

  6. その Recordset オブジェクトに変更を加えた場合は、サーバー プログラムに変更が送り返され、その変更がデータ ソースに反映されます。

このプログラミング モデルには、便利な機能があります。データ ソースへのアクセスに複雑なサーバー プログラムを必要としない場合は、必要な接続パラメータおよびコマンド パラメータを提供すれば、自動的に、既定のサーバー プログラムを使って指定データを取得できます。一方、複雑な処理が必要な場合は、独自のカスタム サーバー プログラムを指定できます。たとえば、カスタム サーバー プログラムには ADO のすべての機能を自由に組み込むことができるので、複数の異なるデータ ソースに接続し、各データ ソースのデータを複雑な方法で組み合わせて 1 つの単純なデータに加工し、その結果をクライアント アプリケーションに返すこともできます。

さらに、ADO では、必要に応じて、既定のサーバー プログラムの動作をカスタマイズできます。

次へ RDS プログラミング モデルの詳細


RDS プログラミング モデルの詳細

RDS プログラミング モデルの主な要素を次に示します。

  • RDS.DataSpace

  • RDSServer.DataFactory

  • RDS.DataControl

  • イベント

RDS.DataSpace

クライアント アプリケーションでは、サーバーおよび呼び出すサーバー プログラムを指定する必要があります。その結果、クライアント アプリケーションでは、サーバー プログラムへの参照を受け取り、その参照をサーバー プログラムそのものと同じように扱うことができます。

RDS のオブジェクト モデルでは、この機能を RDS.DataSpace オブジェクトで表しています。

サーバー プログラムは、プログラム識別子 (ProgID) によって指定されます。サーバーは、ProgID と、サーバー コンピュータのレジストリを使って、実際に起動するプログラムを検索します。

RDS では、目的のサーバー プログラムが、インターネットまたはイントラネットを介したリモート サーバー上にあるか、ローカル エリア ネットワークのサーバー上にあるか、またはサーバーではなくローカルのダイナミック リンク ライブラリ (DLL) にあるかを内部で識別します。識別した結果によって、クライアントとサーバーの間で情報を交換する方法を決定し、クライアント アプリケーションに返す参照の種類を明確に区別します。ただし、ユーザーにとっては、この区別は特別な意味を持ちません。ユーザーにとって重要なのは、使用可能なプログラム参照を受け取るということだけです。

RDSServer.DataFactory

RDS が提供する既定のサーバー プログラムでは、データ ソースに対して SQL クエリを実行して Recordset オブジェクトを返すか、または Recordset オブジェクトを取り込んでデータ ソースを更新することができます。

RDS オブジェクト モデルでは、この機能を RDSServer.DataFactory オブジェクトで表しています。

さらに、このオブジェクトには、プログラムによるデータを格納するための空の Recordset オブジェクトを作成するメソッド (CreateRecordset)、および Recordset オブジェクトを Web ページ作成用のテキスト文字列に変換するメソッド (ConvertToString) があります。

ADO では、DataFactory ハンドラの RDSServer.DataFactory の既定の接続およびコマンドの動作の一部、および接続、コマンド、セキュリティなどのパラメータが格納されたカスタマイズ ファイルを無効にすることができます。

サーバー プログラムは、"ビジネス オブジェクト" とも呼ばれます。複雑なデータ アクセス、妥当性検査などを実行する独自のカスタム ビジネス オブジェクトを作成できます。カスタム ビジネス オブジェクトを作成する場合でも、RDSServer.DataFactory オブジェクトのインスタンスを作成し、そのメソッドの一部を利用して独自の操作を実行することができます。

RDS.DataControl

RDS では、RDS.DataSpace と RDSServer.DataFactory の機能を組み合わせて使用することができます。また、クエリの結果としてデータ ソースから返される Recordset オブジェクトを、ビジュアル コントロールで容易に使用できるようにすることもできます。通常、RDS は、可能な限り、自動的にサーバー上の情報にアクセスしてビジュアル コントロールにその情報を表示しようとします。

RDS オブジェクト モデルでは、この機能を RDS.DataControl オブジェクトで表しています。

RDS.DataControl には 2 つの側面があります。1 つはデータ ソースに関する側面です。RDS.DataControl のコマンド プロパティおよび接続プロパティを設定すると、自動的に RDS.DataSpace が使用され、既定の RDSServer.DataFactory オブジェクトへの参照が作成されます。次に、RDSServer.DataFactory は、接続プロパティの値を使ってデータ ソースに接続し、コマンド プロパティの値を使ってデータ ソースから Recordset を取得し、取得した Recordset オブジェクトを RDS.DataControl に返します。

もう 1 つは、返された Recordset 情報のビジュアル コントロールでの表示に関する側面です。ビジュアル コントロールをバインディングという処理によって RDS.DataControl に関連付けて、該当する Recordset オブジェクトに含まれる情報にアクセスし、クエリの結果を Internet Explorer で Web ページに表示することができます。各 RDS.DataControl オブジェクトは、単一のクエリの結果を表す 1 つの Recordset オブジェクトを、1 つ以上のビジュアル コントロール (テキスト ボックス、コンボ ボックス、グリッド コントロールなど) にバインドします。各ページに複数の RDS.DataControl オブジェクトが配置される場合もあります。それぞれの RDS.DataControl オブジェクトで、別のデータ ソースに接続して別のクエリの結果を取得することができます。

また、RDS.DataControl オブジェクトには、関連する Recordset オブジェクトの行に対して移動、並べ替え、およびフィルタ選択を行うためのメソッドがあります。これらのメソッドは、ADO の Recordset オブジェクトのメソッドと似ていますが、同じではありません。

イベント

RDS は、2 種類の独自のイベントをサポートしています。この 2 つのイベントは ADO のイベント モデルとは無関係です。onReadyStateChange イベントは、RDS.DataControl の ReadyState プロパティが変更されるたびに呼び出され、非同期操作の完了、中断、またはエラーの発生を通知します。onError イベントはエラーが発生するたびに呼び出されます。エラーが非同期操作の途中で発生した場合にも呼び出されます。

注意 Microsoft Internet Explorer を利用する場合は、onDataSetChanged (Recordset は有効な状態であるが、まだ列を取得している状態) および onDataSetComplete (Recordset の列の検索が終了した状態) の 2 つの追加イベントが RDS に提供されます。

次へ RDS プログラミング モデルとオブジェクト


RDS プログラミング モデルとオブジェクト

RDS の目的は、Internet Information Services などを中継してデータ ソースに対するアクセスおよび更新を行うことです。プログラミング モデルでは、この目的の達成に必要な一連の操作を指定します。オブジェクト モデルでは、プログラミング モデルに作用するメソッドおよびプロパティを持つオブジェクトを指定します。

RDS は、次に示す一連の操作を実行する手段を提供します。

  1. サーバー上で呼び出すプログラムを指定し、クライアントがそのプログラムを参照する手段 (プロキシ) を獲得します (RDS.DataSpace)。

  2. サーバー プログラムを呼び出します。データ ソースおよび発行するコマンドを識別するためのパラメータをサーバー プログラムに渡します (プロキシまたは RDS.DataControl)。

  3. サーバー プログラムは、データ ソースから Recordset オブジェクトを取得します。通常は、ADO を使用して取得します。また、Recordset オブジェクトをサーバー上で処理することもできます (RDSServer.DataFactory)。

  4. サーバー プログラムは、結果の Recordset オブジェクトをクライアント アプリケーションに返します (プロキシ)。

  5. クライアントでは、返された Recordset オブジェクトを、ビジュアル コントロールで使用しやすい形式に変換します (ビジュアル コントロールおよび RDS.DataControl)。

  6. Recordset オブジェクトに加えられた変更がサーバーに送り返され、その変更がデータ ソースに反映されます (RDS.DataControl または RDSServer.DataFactory)。

次へ ADO オブジェクト モデルの概要


RDS オブジェクト モデルの概要

オブジェクト | 説明
RDS.DataSpace | このオブジェクトは、サーバー プロキシを取得するメソッドのみを格納します。プロキシは、既定のサーバー プログラムの場合と、カスタム サーバー プログラム (ビジネス オブジェクト) の場合があります。サーバー プログラムは、インターネット、イントラネット、またはローカル エリア ネットワークを介して呼び出すか、またはローカルのダイナミック リンク ライブラリを利用できます。
RDSServer.DataFactory | このオブジェクトは、既定のサーバー プログラムを表します。既定の RDS データ取得およびデータ更新を実行します。
RDS.DataControl | このオブジェクトは、RDS.DataSpace オブジェクトおよび RDSServer.DataFactory オブジェクトを自動的に呼び出すことができます。 このオブジェクトを使用して、既定の RDS データ取得またはデータ更新を呼び出します。 また、このオブジェクトは、返された Recordset オブジェクトにアクセスする手段をビジュアル コントロールに提供します。


RDS チュートリアル

このチュートリアルでは、データ ソースへのクエリと更新を行うために RDS プログラミング モデルを使用する方法を説明します。最初に、この処理の実行に必要な手順を説明します。続いて、Microsoft Visual Basic, Scripting Edition、および Windows Foundation Classes (ADO/WFC) を中心にした Microsoft Visual J++ でコーディングされたチュートリアルがあります。

このチュートリアルは、次の 2 つの理由から複数の言語でコーディングされています。

  • RDS のマニュアルは、読者が Visual Basic でコーディングすることを前提にしています。これは Visual Basic プログラマには有利ですが、ほかの言語を使用しているプログラマにとってはやや不便です。

  • RDS の特定の機能についてわからない場合に、ほかの言語について多少の知識があれば、ほかの言語で記述された同じ機能を参照することが疑問点の解消に役立ちます。

このチュートリアルの構成

このチュートリアルは、RDS プログラミング モデルに基づいています。プログラミング モデルの各手順を 1 つずつ解説します。さらに、それぞれの手順に Visual Basic コードの一部を示してあります。

ほかの言語についても、コード例を最小限の説明と共に取り上げています。各プログラム言語のチュートリアルの手順には、プログラミング モデルとチュートリアルの説明にある手順に対応する番号が付いています。チュートリアルの説明に対応する内容を参照するには、この手順番号を利用してください。

RDS プログラミング モデルについて、次に説明します。チュートリアルを使用するうえでのガイドラインとしてご利用ください。

RDS プログラミング モデルとオブジェクト

  • サーバーで呼び出されるプログラムを指定し、クライアントからプログラムを参照する経路 (プロキシ) を取得します。

  • サーバー プログラムを呼び出します。データ ソースと発行するコマンドを処理するサーバー プログラムにパラメータを渡します。

  • サーバー プログラムがデータ ソースから Recordset オブジェクトを取得します。通常、この作業には ADO を使用します。必要に応じて、Recordset オブジェクトをサーバーで処理することができます。

  • サーバー プログラムが、最終的な Recordset オブジェクトをクライアント アプリケーションに返します。

  • クライアント側では、ビジュアル コントロールを使用すると、必要に応じて簡単にフォームに Recordset オブジェクトを配置できます。

  • Recordset オブジェクトに加えられた変更がサーバーに送られ、データ ソースの更新に使用されます。

次へ 手順 1： サーバー プログラムの指定


手順 1: サーバー プログラムの指定 (RDS チュートリアル)

ここでは、次の操作のうちの太字の部分を行います。

  • サーバーで起動されるプログラムを指定し、プロキシを取得します。

  • サーバー プログラムを呼び出します。データ ソースと発行するコマンドを処理するサーバー プログラムにパラメータを渡します。

  • サーバー プログラムがデータ ソースから Recordset オブジェクトを取得します。通常、この作業には ADO を使用します。

  • サーバー プログラムが、最終的な Recordset オブジェクトをクライアント アプリケーションに返します。

  • クライアント側では、ビジュアル コントロールを使用すると、必要に応じて簡単にフォームに Recordset オブジェクトを配置できます。

  • Recordset オブジェクトに加えられた変更がサーバーに送られ、データ ソースの更新に使用されます。

説明

ほとんどの場合、既定のサーバー プログラムの RDSServer.DataFactory、またはカスタム サーバー プログラム (ビジネス オブジェクト) の指定には、RDS.DataSpace オブジェクトの CreateObject メソッドを使用します。サーバー プログラムのインスタンスがサーバーで作成され、サーバー プログラムへの経路 (プロキシ) が返されます。

このチュートリアルのプログラムでは、既定のサーバー プログラムを使用します。

Sub RDSTutorial1()
   Dim DS as New RDS.DataSpace
   Dim DF as Object
   Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
...

次へ 手順 2： サーバー プログラムの起動


手順 2: サーバー プログラムの起動 (RDS チュートリアル)

ここでは、次の操作のうちの太字の部分を行います。

  • サーバーで起動されるプログラムを指定し、プロキシを取得します。

  • サーバー プログラムを呼び出します。データ ソースと発行するコマンドを処理するサーバー プログラムにパラメータを渡します。

  • サーバー プログラムがデータ ソースから Recordset オブジェクトを取得します。通常、この作業には ADO を使用します。

  • サーバー プログラムが、最終的な Recordset オブジェクトをクライアント アプリケーションに返します。

  • クライアント側では、ビジュアル コントロールを使用すると、必要に応じて簡単にフォームに Recordset オブジェクトを配置できます。

  • Recordset オブジェクトに加えられた変更がサーバーに送られ、データ ソースの更新に使用されます。

説明

クライアントの "プロキシ" でメソッドを呼び出すと、サーバー側の実際のプログラムでメソッドが実行されます。この手順では、サーバーでクエリを実行します。

パート A このチュートリアルで RDSServer.DataFactory を使用していなかった場合、この手順を実行する最も便利な方法は、RDS.DataControl オブジェクトを使用することです。RDS.DataControl によって、プロキシを作成する前の手順が、クエリを発行するこの手順と結合されます。

サーバー プログラムがインスタンス作成を行う場所を識別するために RDS.DataControl オブジェクトの Server プロパティを設定し、データ ソースにアクセスする接続文字列を指定するために Connect プロパティを設定し、クエリ コマンド テキストを指定するために SQL プロパティを設定します。次に Refresh メソッドを発行して、サーバー プログラムがデータ ソースに接続してクエリで指定された行を取得し、Recordset オブジェクトをクライアントに返すようにします。

このチュートリアルでは RDS.DataControl を使用しませんが、使用する場合には次のようになります。

Sub RDSTutorial2A()
   Dim DC as New RDS.DataControl
   DC.Server = "http://yourServer"
   DC.Connect = "DSN=Pubs;UID=sa;PWD=;"
   DC.SQL = "SELECT * FROM Authors"
   DC.Refresh
...

また、このチュートリアルでは ADO オブジェクトを使用して RDS を呼び出しませんが、呼び出す場合は次のようになります。

Dim rs as New ADODB.Recordset
   rs.Open "SELECT * FROM Authors", "Provider=MS Remote;Remote Provider=sqloledb;Data Source=srv;Initial Catalog=Pubs;User ID=sa;Password=;Remote Server=http://YourServer"

パート B この手順を実行するには、RDSServer.DataFactory オブジェクトの Query メソッドを呼び出すことが一般的です。このメソッドには、データ ソースへの接続に使われる接続文字列と、データ ソースから返された行を指定するコマンド テキストを指定します。

このチュートリアルでは、DataFactory オブジェクトの Query メソッドを使います。

Sub RDSTutorial2B()
   Dim DS as New RDS.DataSpace
   Dim DF as Object
   Dim RS as ADODB.Recordset
   Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
   Set RS = DF.Query ("DSN=Pubs;UID=sa;PWD=;", "SELECT * FROM Authors")
...

次へ 手順 3： サーバーによる Recordset の取得


手順 3: サーバーによる Recordset の取得 (RDS チュートリアル)

ここでは、次の操作のうちの太字の部分を行います。

  • サーバーで起動されるプログラムを指定し、プロキシを取得します。

  • サーバー プログラムを呼び出します。データ ソースと発行するコマンドを処理するサーバー プログラムにパラメータを渡します。

  • サーバー プログラムがデータ ソースから Recordset オブジェクトを取得します。通常、この作業は ADO を使用します。

  • サーバー プログラムが、最後の Recordset オブジェクトをクライアント アプリケーションに返します。

  • クライアント側では、ビジュアル コントロールを使用すると、必要に応じて簡単にフォームに Recordset オブジェクトを配置できます。

  • Recordset オブジェクトに加えられた変更がサーバーに送られ、データ ソースの更新に使用されます。

説明

サーバー プログラムは、目的の行のデータ ソースへのクエリの実行に、接続文字列とコマンド テキストを使用します。この Recordset の取得には通常 ADO が使用されますが、ほかにも OLE DB などの Microsoft のデータ アクセス インターフェイスを使用できます。クエリの実行方法の詳細については、「ADO チュートリアル」を参照してください。

カスタム サーバー プログラムを次に示します。

Public Function ServerProgram(cn as String, qry as String) as Object
Dim rs as New ADODB.Recordset
   rs.CursorLocation = adUseClient
   rs.Open qry, cn
   rs.ActiveConnection = Nothing
   Set ServerProgram = rs
End Function

次へ 手順 4： サーバーにより Recordset が返される


手順 4: サーバーにより Recordset が返される (RDS チュートリアル)

ここでは、次の操作のうちの太字の部分を行います。

  • サーバーで起動されるプログラムを指定し、プロキシを取得します。

  • サーバー プログラムを呼び出します。データ ソースと発行するコマンドを処理するサーバー プログラムにパラメータを渡します。

  • サーバー プログラムがデータ ソースから Recordset オブジェクトを取得します。通常、この作業には ADO を使用します。

  • サーバー プログラムが、最終的な Recordset オブジェクトをクライアント アプリケーションに返します。

  • クライアント側では、ビジュアル コントロールを使用すると、必要に応じて簡単にフォームに Recordset オブジェクトを配置できます。

  • Recordset オブジェクトに加えられた変更がサーバーに送られ、データ ソースの更新に使用されます。

説明

RDS は、取得した Recordset オブジェクトを、クライアントに送るフォームに変換します (つまり、Recordset を "マーシャリング" します)。変換された正確なフォームとその送信方法については、サーバーがインターネット、イントラネット、LAN (ローカル エリア ネットワーク)、またはダイナミック リンク ライブラリのいずれに接続されているかによって異なります。ただし、送信方法については重要ではありません。RDS が Recordset をクライアントに返すことが重要なのです。

クライアント側では、Recordset オブジェクトが返されてローカル変数に割り当てられます。

Sub RDSTutorial4()
   Dim DS as New RDS.DataSpace
   Dim RS as ADODB.Recordset
   Dim DF as Object
   Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
   Set RS = DF.Query("DSN=Pubs;UID=sa;PWD=;", "SELECT * FROM Authors")
...

次へ 手順 5： DataControl の有効化


手順 5: DataControl の有効化 (RDS チュートリアル)

ここでは、次の操作のうちの太字の部分を行います。

  • サーバーで起動されるプログラムを指定し、プロキシを取得します。

  • サーバー プログラムを呼び出します。データ ソースと発行するコマンドを処理するサーバー プログラムにパラメータを渡します。

  • サーバー プログラムがデータ ソースから Recordset オブジェクトを取得します。通常、この作業には ADO を使用します。

  • サーバー プログラムが、最終的な Recordset オブジェクトをクライアント アプリケーションに返します。

  • クライアント側では、ビジュアル コントロールを使用すると、必要に応じて簡単にフォームに Recordset オブジェクトを配置できます。

  • Recordset オブジェクトに加えられた変更がサーバーに送られ、データ ソースの更新に使用されます。

説明

返された Recordset オブジェクトは、クライアント側で使用することができます。ほかの Recordset と同様に、調査、移動、または編集を行うことができます。Recordset を使用してできる操作は、環境によって異なります。Microsoft Visual Basic および Visual C++ には、直接、またはデータ コントロールを使って間接的に Recordset を使用できる、ビジュアル コントロールがあります。

たとえば、Microsoft® Internet Explorer で Web ページを表示する場合、ビジュアル コントロールに Recordset オブジェクトのデータを表示するとします。Web ページ上のビジュアル コントロールは、Recordset オブジェクトに直接アクセスすることはできません。ただし、RDS.DataControl を通じて Recordset にアクセスすることはできます。RDS.DataControl は、SourceRecordset プロパティが Recordset オブジェクトに設定されていれば、ビジュアル コントロールによって使用可能な状態になります。

ただし、ビジュアル コントロール オブジェクトは、DATASRC パラメータが RDS.DataControl に設定され、DATAFLD プロパティが Recordset オブジェクトのフィールド (列) に設定されている必要があります。

このチュートリアルでは、SourceRecordset プロパティを設定します。

Sub RDSTutorial5()
   Dim DS as New RDS.DataSpace
   Dim RS as ADODB.Recordset
   Dim DC as New RDS.DataControl
   Dim DF as Object
   Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
   Set RS = DF.Query ("DSN=Pubs;UID=sa;PWD=;", "SELECT * FROM Authors")
   DC.SourceRecordset = RS            ' Visual controls can now bind to DC.
...

次へ 手順 6： サーバーへの変更の送信


手順 6: サーバーへの変更の送信 (RDS チュートリアル)

ここでは、次の操作のうちの太字の部分を行います。

  • サーバーで起動されるプログラムを指定し、プロキシを取得します。

  • サーバー プログラムを呼び出します。データ ソースと発行するコマンドを処理するサーバー プログラムにパラメータを渡します。

  • サーバー プログラムがデータ ソースから Recordset オブジェクトを取得します。通常、この作業には ADO を使用します。

  • サーバー プログラムが、最終的な Recordset オブジェクトをクライアント アプリケーションに返します。

  • クライアント側では、ビジュアル コントロールを使用すると、必要に応じて簡単にフォームに Recordset オブジェクトを配置できます。

  • Recordset オブジェクトに加えられた変更がサーバーに送られ、データ ソースの更新に使用されます。

説明

Recordset オブジェクトが編集される場合、あらゆる変更データ (追加、変更、または削除された行) をサーバーに送ることができます。

注意 RDS の既定動作が、ADO オブジェクトと MS OLE DB Remoting Provider を使用して暗黙的に呼び出される可能性があります。クエリはレコードセットを返すことができ、編集されたレコードセットによってデータ ソースが更新されます。このチュートリアルでは ADO オブジェクトを使用して RDS を呼び出しませんが、呼び出す場合は次のようになります。

Dim rs as New ADODB.Recordset
   rs.Open "SELECT * FROM Authors", "Provider=MS Remote;Remote Provider=sqloledb;Data Source=srv;Initial Catalog=Pubs;User ID=sa;Password=;Remote Server=http://YourServer"
...              ' Edit the recordset
rs.UpdateBatch   ' The equivalent of SubmitChanges
...

パート A ここでは、RDS.DataControl のみを使用し、また、Recordset オブジェクトが現在は RDS.DataControl に関連付けられていると想定します。Server と Connect プロパティが引き続き設定されていれば、SubmitChanges メソッドによって Recordset オブジェクトへの変更でデータ ソースが更新されます。

Sub RDSTutorial6A()
Dim DC as New RDS.DataControl
Dim RS as ADODB.Recordset
DC.Server = "http://yourServer"
DC.Connect = "DSN=Pubs;UID=sa;PWD=;"
DC.SQL = "SELECT * FROM Authors"
DC.Refresh
...
Set RS = DC.Recordset
   ' Edit the Recordset
...
DC.SubmitChanges
...

パート B 別の方法として、RDSServer.DataFactory オブジェクトに接続と Recordset オブジェクトを指定して、サーバーを更新することもできます。

Sub RDSTutorial6B()
Dim DS As New RDS.DataSpace
Dim RS As ADODB.Recordset
Dim DC As New RDS.DataControl
Dim DF As Object
Dim blnStatus As Boolean
Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
Set RS = DF.Query ("DSN=Pubs;UID=sa;PWD=;", "SELECT * FROM Authors")
DC.SourceRecordset = RS    ' Visual controls can now bind to DC.
    ' Edit the Recordset
blnStatus = DF.SubmitChanges("DSN=Pubs;UID=sa;PWD=;", RS)
End Sub

これでチュートリアルを終了します。


RDS チュートリアル (VBScript)

これは、Microsoft Visual Basic, Scripting Edition でコーディングされた RDS チュートリアルです。このチュートリアルの目的については、「RDS チュートリアル」を参照してください。

このチュートリアルでは、RDS.DataControl および RDS.DataSpace がデザイン時に作成されます。つまり、次のようにオブジェクト タグを使用して定義されます。<OBJECT>...</OBJECT>。別の方法としては、Server.CreateObject メソッドを使用して実行時に作成することができます。たとえば、RDS.DataControl オブジェクトは次のようにして作成できます。

Set DC = Server.CreateObject("RDS.DataControl")
    <!-- RDS.DataControl -->
    <OBJECT
        ID="DC1" WIDTH=1 HEIGHT=1
        CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E33">
    </OBJECT>

    <!-- RDS.DataSpace -->
    <OBJECT
        ID="DS1" WIDTH=1 HEIGHT=1
        CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
    </OBJECT>

    <SCRIPT LANGUAGE="VBScript">

    Sub RDSTutorial()
    Dim DF1

手順 1 - サーバー プログラムの指定

VBScript は、Active Server Pages で利用可能な VBScript の Request.ServerVariables メソッドにアクセスすることで、VBScript 自体が動作中の IIS Web サーバーの名前を検出することができます。

"http://<%=Request.ServerVariables("SERVER_NAME")%>"

ただし、このチュートリアルでは架空のサーバー名、"yourServer" を使用します。

注意 ByRef 引数のデータ型に注意してください。VBScript では変数型の指定はできないため、常にバリアント型を渡す必要があります。HTTP を使用している場合は、RDS によってバリアントをメソッドに渡すことができます。これを RDS.DataSpace オブジェクトの CreateObject メソッドで呼び出すことによって、非バリアント型となります。DCOM またはインプロセス サーバーを使用している場合は、クライアント側とサーバー側のパラメータ型を一致させてください。一致しない場合は、"Type Mismatch" エラーが発生します。

Set DF1 = DS1.CreateObject("RDSServer.DataFactory", "http://yourServer")

手順 2a - RDS.DataControl を使ったサーバー プログラムの起動

次の例は、RDS.DataControl の既定動作が指定クエリの実行であることを単に示すものです。

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="DC1">
    <PARAM NAME="SQL" VALUE="SELECT * FROM Authors">
    <PARAM NAME="Connect" VALUE="DSN=Pubs;UID=sa;PWD=;">
    <PARAM NAME="Server" VALUE="http://YourServer/">
</OBJECT>
...
<SCRIPT LANGUAGE="VBScript">

Sub RDSTutorial2A()
   Dim RS
   DC1.Refresh
   Set RS = DC1.Recordset
...

手順 2b - RDSServer.DataFactory を使ったサーバー プログラムの起動

手順 3 - サーバーによる Recordset の取得

手順 4 - サーバーにより Recordset が返される

Set RS = DF1.Query("DSN=Pubs;UID=sa;PWD=;", "SELECT * FROM Authors")

手順 5 - ビジュアル コントロールによる DataControl の有効化

' Assign the returned recordset to the DataControl.

DC1.SourceRecordset = RS

手順 6a - RDS.DataControl を使ったサーバーへの変更の送信

次の例は、RDS.DataControl がどのようにして更新を行うかを単に示したものです。

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="DC1">
    <PARAM NAME="SQL" VALUE="SELECT * FROM Authors">
    <PARAM NAME="Connect" VALUE="DSN=Pubs;UID=sa;PWD=;">
    <PARAM NAME="Server" VALUE="http://YourServer/">
</OBJECT>
...
<SCRIPT LANGUAGE="VBScript">

Sub RDSTutorial6A()
Dim RS
DC1.Refresh
...
Set RS = DC1.Recordset
' Edit the Recordset object...
' The SERVER and CONNECT properties are already set from Step 2A.
Set DC1.SourceRecordset = RS
...
DC1.SubmitChanges

手順 6b - RDSServer.DataFactory を使ったサーバーへの変更の送信

DF.SubmitChanges "DSN=PubsUID=sa;PWD=;", RS

End Sub
</SCRIPT>
</BODY>
</HTML>

これでチュートリアルを終了します。


RDS チュートリアル (VJ++)

ADO/WFC は、RDS.DataControl オブジェクトを実装していない RDS オブジェクト モデルに完全には従っていません。ADO/WFC は、クライアント側のクラスの RDS.DataSpace のみを実装しています。

DataSpace クラスは、ObjectProxy オブジェクトを返すメソッドの CreateObject を実装しています。また、DataSpace クラスは、InternetTimeout プロパティも実装しています。

ObjectProxy クラスは、サーバー側の任意のビジネス オブジェクトを呼び出す手段 (call) を実装しています。

ここからチュートリアルを開始します。

import com.ms.wfc.data.*;
public class RDSTutorial
{
    public void tutorial()
    {
// Step 1: Specify a server program
        ObjectProxy obj =
            DataSpace.createObject(
                "RDSServer.DataFactory",
                "http://YourServer");

// Step 2: Server returns a Recordset
        Recordset rs = (Recordset) obj.call(
                "Query",
                new Object[] {"DSN=Pubs;UID=sa;PWD=;", "SELECT * FROM Authors"});

// Step 3: Changes are sent to the server
        ...                                // Edit Recordset
        obj.call(
                "SubmitChanges",
                new Object[] {"DSN=Pubs;UID=sa;PWD=;", rs});
        return;
    }
}

これでチュートリアルを終了します。


RDS のシナリオ

ここで説明する Address Book アプリケーションは、リモート データ サービス (Remote Data Service : RDS) を使って、単純なデータ連結型の Web アプリケーション (オンラインの社内住所録) を作成する方法を示すシナリオの役目を果たします。RDS を使ったデータ連結 ActiveX コントロールの使い方を習得しようとしている Microsoft Visual Basic, Scripting Edition (VBScript) および COM のプログラマにとって、また、データ集約型の Web アプリケーションを構築しようとしている経験を積んだアプリケーション開発者にとっても、このシナリオは有効です。

このシナリオは、基本的な HTML レイアウト タグの使用方法、DHTML データ バインディング技法、および ActiveX コントロールを使ったプログラミング方法を習得している読者を対象としています。

Platform SDK をインストール済みの場合は、<ドライブ文字>:\Platform SDK\samples\dataaccess\rds\AddrBook\AddrBook に、この Address Book サンプル アプリケーションの完全なソース コードがあります。Address Book のシナリオを参照するには、Internet Explorer 4.0 以降を使用して、「http://webserver/RDS/AddrBook/AddrBook.asp」と入力してください。webserver の部分には、Internet Information Services (IIS) と ASP を実行している Windows NT 4.0 または Windows 2000 Web サーバー コンピュータの名前を指定します。

Address Book の概要

Address Book は、単純なオンライン住所録のサンプル アプリケーションです。このアプリケーションを使用して、イントラネット上で検索可能なディレクトリを公開することができます。この住所録は、ユーザーが社員情報を必要とするときのために、複数のフィールドに検索文字列を入力できるように設計されています。RDS の基本的な機能を示すことが目的であるため、サンプル アプリケーションは最小限のオブジェクトと検索フィールドのみの小さなサイズに意図的に抑えられています。

このアプリケーションのインターフェイスは、次の部分から構成されています。

  • 表示されない RDS.DataControl。これは、データベースに接続するためにクライアントに使用されるデータ バインディング オブジェクトです。

  • HTML テキスト ボックス。社員属性の検索条件を入力するフィールドです。

  • HTML コマンド ボタン。クエリの作成、検索フィールドのクリア、社員情報によるデータベースの更新、保留されている変更の取り消し、およびグリッド内に表示されたデータ行の移動のために使います。

  • DHTML データ バインディング。RDS.DataControl データ バインディング オブジェクトを使用して、バックエンドのデータベースへのクエリから取得したデータをテーブル内に表示します。

  • VBScript ルーチン。これまでに説明した要素をすべて結合し、相互に作用できるようにします。また VBScript コードを使って、RDS.DataControl オブジェクトを初期化し、RDS.DataControl レコードセット フィールドの名前から HTML テーブル内の列の見出しを動的に作成します。

リンクを順にたどって、サンプル アプリケーションをセットアップして実行し、このアプリケーションがどのように動作するかを学習してください。

次へ Address Book アプリケーションに必要なシステム構成


Address Book アプリケーションに必要なシステム構成

Address Book サンプル アプリケーションをセットアップするためには、次のソフトウェアおよびデータベースの要件を満たしている必要があります。

ソフトウェアの要件

この Web アプリケーションを実行するには、サーバー コンピュータに次のソフトウェアが必要です。

  • Service Pack 3 以降がインストールされた Microsoft® Windows NT® Server 4.0、または Microsoft® Windows® 2000 Server

  • Active Server Pages を含む Microsoft Internet Information Services (IIS) 3.0 以降

この Web アプリケーションを実行するには、クライアント コンピュータに次のソフトウェアが必要です。

  • Microsoft Internet Explorer 4.0 以降

  • Windows NT 4.0 Workstation、Windows NT 4.0 Server、Windows 2000、または Microsoft Windows 98

データベースの要件

このサンプルを使用するには、次のものが必要です。

  • Microsoft SQL Server 6.5 以降のデータベース サーバー

  • データベースを作成し、サンプル データを設定する権限

  • Enterprise Manager または ISQL ユーティリティ (SQL Server 7.0 のクエリ アナライザ) による、設定データの検証

権限がない場合には、データベース管理者がシステムをセットアップし、データベースへのアクセス権限をその管理者から取得する必要があります。または、データベースを自分用にセットアップする必要があります。

次へ Address Book SQL スクリプトの実行


Address Book SQL スクリプトの実行

このサンプル アプリケーションに含まれている SQL スクリプト (Sampleemp.sql) の実行には、ISQL/クエリ アナライザ コマンドライン ユーティリティ、または SQL Server Enterprise Manager のどちらかを使用する必要があります。このスクリプトでは、次の処理を行います。

  • 既定のデバイスに新規データベースである AddrBookDB を作成します。

  • データベース AddrBookDB に接続します。

  • Employee テーブルを作成します。

  • テーブルにサンプル データを設定します。

  • データベース テーブルの設定を確認するために、簡単な SELECT ステートメントを実行します。

  • パスワード "rdsdemo" で、ユーザー アカウント "rdsdemo" をセットアップします。

Sampleemp.sql スクリプトを実行するには

Microsoft SQL Server 6.5 の場合

  1. [スタート] ボタンをクリックして [プログラム]、[Microsoft SQL Server 6.5] の順にポイントします。[SQL Enterprise Manager] をクリックします。

  2. [ツール] メニューの [SQL クエリー ツール] をクリックします。

  3. [SQL スクリプトのロード] をクリックし、c:\Platform SDK\Samples\DataAccess\RDS\AddrBook を参照します。

  4. Sampleemp.sql ファイルを選択し、[開く] をクリックします。

  5. [クエリーの実行] ボタン (ツールバーの緑の矢印) をクリックします。

  6. 実行後に [クエリー] と [Microsoft SQL Enterprise Manager] ウィンドウを閉じます。

Microsoft SQL Server 7.0 の場合

  1. [スタート] ボタンをクリックして [プログラム]、[Microsoft SQL Server 7.0] の順にポイントします。[Enterprise Manager] をクリックします。

  2. 使用する SQL Server が Enterprise Manager に登録されているサーバー一覧で選択されていることを確認します。

  3. [ツール] メニューの [SQL Server クエリ アナライザ] をクリックします。

  4. [SQL スクリプトの読み込み] ボタン (ツールバーの開いているフォルダ) をクリックし、c:\Platform SDK\Samples\DataAccess\RDS\AddrBook を参照します。

  5. Sampleemp.sql ファイルを選択し、[開く] をクリックします。

  6. [クエリの実行] ボタン (ツールバーの緑の矢印) をクリックするか、F5 キーを押します。

  7. 実行後に [クエリ]、[クエリ アナライザ]、および [Microsoft SQL Enterprise Manager] ウィンドウを閉じます。

次へ Address Book サンプル アプリケーションの実行


Address Book サンプル アプリケーションの実行

Address Book アプリケーションを実行するには、次の手順に従ってください。

アプリケーションを実行するには

  1. Microsoft SQL Server が実行中であることを確認します。[スタート] ボタンをクリックし、[プログラム]、[Microsoft SQL Server 7.0] の順にポイントして、[サービス マネージャ] をクリックします。白い円の中に緑色の矢印がある場合に、SQL Server は実行されています。実行されていない場合 (白い円の中が赤い四角形) は、[起動/再開] をクリックします。

  2. Microsoft Internet Explorer 4.0 以降を使用して、次のアドレスを入力します。

    http://webserver/RDS/AddrBook/AddrBook.asp

    webserver には、RDS サーバーのコンポーネントがインストールされている Web サーバーの名前を指定します。

  3. Address Book サンプル アプリケーションで、電子メールの名前に基づいた社員の検索、"Program Manager" という役職名を持つ社員すべての一覧表示、既存のレコードの編集や更新といった、さまざまなシナリオを試してみることができます。[Find] をクリックして、使用できるすべての名前をデータ グリッドに入れてください。

次へ Address Book データ バインディング オブジェクト


Address Book データ バインディング オブジェクト

Address Book アプリケーションでは、RDS.DataControl オブジェクトを使って、SQL Server データベースのデータをクライアントの HTML ページに表示されるオブジェクト (この場合は DHTML テーブル) とバインドします。イベント駆動型の VBScript プログラム ロジックでは、RDS.DataControl を使って次の処理を行います。

  • データベースの更新するクエリを送って実行し、データ グリッドを更新します。

  • ユーザーがデータ グリッド内で最初または最後、あるいは現在レコードの前後のレコードに移動できるようにします。

次のコードで、RDS.DataControl コンポーネントを定義します。

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=DC1 Width=1 Height=1>
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="Provider=sqloledb;Data Source=yourServer;
Initial Catalog=AddrBookDb;User ID=adcdemo;Password=adcdemo;">
</OBJECT>

<OBJECT> タグで、RDS.DataControl コンポーネントをプログラム内に定義します。このタグには 2 種類のパラメータがあります。

  • 一般的な <OBJECT> タグに関連するパラメータ

  • RDS.DataControl オブジェクト固有のパラメータ

一般的な OBJECT タグ パラメータ

次の表は、<OBJECT> タグに関連するパラメータの一覧です。

パラメータ | 説明
CLASSID | 一意の 128 ビットの数字で、システムに埋め込まれたオブジェクトの種類を識別します。この識別子は、ローカル コンピュータのシステム レジストリに保持されます。(RDS.DataControl オブジェクトのクラス ID については、「DataControl オブジェクト (RDS)」を参照してください。)
ID | 埋め込まれたオブジェクトの、ドキュメント全体での識別子です。コード内でオブジェクトを識別するために使用されます。

RDS.DataControl タグ パラメータ

次の表は、RDS.DataControl オブジェクト固有のパラメータの一覧です。RDS.DataControl オブジェクトのすべてのパラメータ一覧、およびすべてのパラメータが実装される時期については、「RDS.DataControl オブジェクト」を参照してください。

パラメータ | 説明
Server | HTTP を使用している場合、この値はサーバー コンピュータの名前で、http:// の後に指定します。
Connect | SQL Server に接続するために RDS.DataControl に必要な接続情報を指定します。
SQL | Recordset を取得するために使用されるクエリ文字列を設定します。または値を取得します。

次へ Address Book のコマンド ボタン


Address Book のコマンド ボタン

Address Book アプリケーションには、次のコマンド ボタンが含まれています。

  • データベースへのクエリを送信する [Find] ボタン

  • 新規検索前にテキスト ボックスをクリアする [Clear] ボタン

  • 社員レコードへの変更を保存する [Update Profile] ボタン

  • 変更の保存を破棄する [Cancel Changes] ボタン

[Find] ボタン

[Find] ボタンをクリックすると、SQL クエリを作成して送信する VBScript Find_OnClick Sub プロシージャが実行されます。このボタンをクリックすると、データ グリッドにデータが設定されます。

SQL クエリの作成

Find_OnClick Sub プロシージャの最初の部分では、1 回に 1 フレーズずつテキスト文字列をグローバル SQL SELECT ステートメントに追加して、SQL クエリを作成します。最初に、データ ソース テーブルのすべてのデータ行を要求する SQL SELECT ステートメントに、変数 myQuery を設定します。次に Sub プロシージャは、ページ上の 4 つの各入力ボックスをスキャンします。

プログラムでは SQL ステートメントの作成に like という語を使用しているので、このクエリでは、完全に同一の文字列ではなく、部分的に同一の文字列が検索されます。

たとえば、[Last Name] ボックスに「Berge」、[Title] ボックスに「Program Manager」が入力されると、SQL ステートメント (myQuery の値) は次のように解釈されます。

Select FirstName, LastName, Title, Email, Building, Room, Phone from Employee where lastname like 'Berge%' and title like 'Program Manager%'

このクエリが成功した場合、"Berge" という文字を含む姓 (Berge や Berger など) と、"Program Manager" という文字を含む役職 (たとえば Program Manager、Advanced Technologies) を持つ社員全員が HTML のデータ グリッドに表示されます。

クエリの準備と送信

Find_OnClick Sub プロシージャの最後の部分は、2 つのステートメントから構成されています。最初のステートメントで、RDS.DataControl オブジェクトの SQL プロパティに、今回動的に作成された SQL クエリを代入します。2 つ目のステートメントでは、RDS.DataControl オブジェクト (DC1) によってデータベースへのクエリが実行され、そのクエリの結果がグリッドに表示されます。

Sub Find_OnClick
    ‘...
    DC1.SQL = myQuery
    DC1.Refresh
End Sub

[Update Profile] ボタン

[Update Profile] ボタンをクリックすると、VBScript Update_OnClick Sub プロシージャが実行され、そのプロシージャ内で RDS.DataControl オブジェクト (DC1) の SubmitChanges および Refresh メソッドが実行されます。

Sub Update_OnClick
    DC1.SubmitChanges
    DC1.Refresh
End Sub

DC1.SubmitChanges が実行されると、RDS がすべての更新された情報をパッケージ化して、HTTP 経由でサーバーへ送信します。この更新は、全体が更新されるか、まったく更新されないかのどちらかです。更新の一部が正常に行われなかった場合には変更は一切行われず、ステータス メッセージが表示されます。DC1.Refresh は、RDS を使用した SubmitChanges の後では必要ありませんが、データが更新されていることの保証になります。

[Cancel Changes] ボタン

[Cancel Changes] をクリックすると、VBScript Cancel_OnClick Sub プロシージャが実行され、そのプロシージャ内で RDS.DataControl オブジェクト (DC1) の CancelUpdate メソッドが実行されます。

Sub Cancel_OnClick
    DC1.CancelUpdate
End Sub

DC1.CancelUpdate が実行されると、最後のクエリまたは更新以後にデータ グリッドで社員レコードに行ったすべての変更が破棄されます。したがって、元の値が復元されます。

次へ Address Book の移動ボタン


Address Book の移動ボタン

Address Book アプリケーションでは、Web ページの一番下に移動ボタンが表示されます。移動ボタンを使って最初または最後の行、あるいは現在の行の前後にある行を選択することで、HTML のグリッド表示内でデータ間を移動することができます。

移動の Sub プロシージャ

Address Book アプリケーションには、ユーザーが [First]、[Next]、[Previous]、および [Last] ボタンをクリックしてデータ間を移動できるようにする複数のプロシージャが含まれています。

たとえば、[First] ボタンをクリックすると VBScript First_OnClick Sub プロシージャが実行されます。このプロシージャは MoveFirst メソッドを実行し、このメソッドによって、最初のデータ行が現在選択されている行になります。[Last] ボタンをクリックすると Last_OnClick Sub プロシージャが実行され、MoveLast メソッドが実行されて、最後のデータ行が現在選択されている行になります。その他の移動ボタンも同様の形式で動作します。

' Move to the first record in the bound recordset.
Sub First_OnClick
    DC1.Recordset.MoveFirst
End Sub

' Move to the next record from the current position
' in the bound recordset.
Sub Next_OnClick
    If Not DC1.Recordset.EOF Then    ' cannot move beyond bottom record
        DC1.Recordset.MoveNext
        Exit Sub
    End If
End Sub

' Move to the previous record from the current position in the bound
' recordset.
Sub Prev_OnClick
    If Not DC1.Recordset.BOF Then    ' cannot move beyond top record
        DC1.Recordset.MovePrevious
        Exit Sub
    End If
End Sub

' Move to the last record in the bound recordset.
Sub Last_OnClick
    DC1.Recordset.MoveLast
End Sub


RDS の使用

ここでは、サーバーをセットアップしてすばやく RDS を使う方法について説明します。RDS の実装時に必要になることがある固有の設定手順や、RDS とほかの技術との主要な関係について説明し、RDS ソリューションのセットアップ時に発生する問題の解決法を見いだすのに役立つ情報を提供します。

ここで説明する項目は、次のとおりです。

  • RDS の設定

  • RDS 関連技術の使用

  • RDS のトラブルシューティング


RDS の設定

RDS を効率的に実装するには、利用可能なさまざまな設定情報に通じている必要があります。ここでは、RDS の実装において重要なセキュリティとスケーラビリティに関する情報について説明します。コンピュータで RDS を使うための設定については、次のトピックを参照してください。

  • Web サーバー コンピュータに Guest 権限を与える

  • カスタム ビジネス オブジェクトの登録

  • スクリプト化しても安全なビジネス オブジェクトとしてマークする

  • DCOM を介して使えるようビジネス オブジェクトをクライアントに登録する

  • DCOM ストリーム マーシャリング形式の設定

  • DCOM 上で DLL の実行を有効にする

  • IIS における仮想サーバーの設定

  • IIS におけるプロセッサ別スレッドの指定

  • RDS アプリケーションの保護

  • DataFactory をセーフ モードまたは無制限モードに設定する


Web サーバー コンピュータに Guest 権限を与える

RDS を使うには、Web サーバー コンピュータの Guests ローカル グループに匿名 Web サーバー アカウント (IUSR_ComputerName) を追加する必要があります。

Web サーバー コンピュータに Guest 権限を与えるには

  1. Windows 2000 Server コンピュータで [スタート] ボタンをクリックし、[プログラム]、[管理ツール] をポイントして、[コンピュータの管理] をクリックします。

  2. コンソール ツリーの [ローカル ユーザーとグループ] で、[グループ] をクリックします。

  3. Guests ローカル グループを選択します。[操作] メニューの [プロパティ] をクリックします。

  4. [Guests のプロパティ] ダイアログ ボックスの [追加] をクリックします。

  5. 匿名 Web サーバー アカウントが [ユーザーまたはグループの選択] ダイアログ ボックスの一覧にない場合は、一番下の空白欄にその名前 (IUSR_ComputerName) を入力し、[追加] をクリックします。

  6. [OK] をクリックします。


カスタム ビジネス オブジェクトの登録

Web サーバーを通してカスタム ビジネス オブジェクト (.dll または .exe) を正常に起動するには、次の手順に従ってビジネス オブジェクトの ProgID をレジストリに入力する必要があります。この RDS 機能は、許可された実行可能なオブジェクトだけを実行することによって、使用している Web サーバーのセキュリティを保護します。

メモ MDAC 2.0 以降では、既定のビジネス オブジェクトである RDSServer.DataFactory は、既定では MDAC のインストール時に登録されません。ただし、RDSServer.DataFactory がコンピュータで安全に実行できるようインストール前に登録されていれば、そのレジストリ エントリは新しいインストールに対しても保持されます。

カスタム ビジネス オブジェクトを登録するには

  1. [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。

  2. 「RegEdit」と入力し、[OK] をクリックします。

  3. レジストリ エディタで、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ADCLaunch レジストリ キーに移動します。

  4. [ADCLaunch] キーをクリックし、[編集] メニューの [新規] をポイントして [キー] をクリックします。

  5. 使用するカスタム ビジネス オブジェクトの ProgID を入力して、Enter キーを押します。[値] エントリは空白のまま残します。


スクリプト化しても安全なビジネス オブジェクトとしてマークする

インターネット環境のセキュリティを保つために、RDS.DataSpace オブジェクトの CreateObject メソッドでインスタンス化されたすべてのビジネス オブジェクトは、"スクリプト化しても安全な" ビジネス オブジェクトとしてマークする必要があります。DCOM で使用する前に、システム レジストリの License エリア内でこれらのオブジェクトがマークされていることを確認する必要があります。

スクリプト化しても安全なビジネス オブジェクトとして手動でマークするには、次のテキストを含む、拡張子 .reg のテキスト ファイルを作成します。次の 2 つの数値によって、スクリプト化しても安全な機能が有効になります。

[HKEY_CLASSES_ROOT\CLSID\<MyActiveXGUID>\Implemented
Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}]
[HKEY_CLASSES_ROOT\CLSID\<MyActiveXGUID>\Implemented
Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}]

<MyActiveXGUID> は、使用するビジネス オブジェクトの 16 進 GUID 型の数値を表します。レジストリ エディタを使うか、または Windows のエクスプローラで .reg ファイルをダブルクリックして、この数値を保存してレジストリにマージします。

Microsoft Visual Basic で作成したビジネス オブジェクトは、パッケージ ウィザードおよび配置ウィザードを使って、"スクリプト化しても安全な" オブジェクトとして自動的にマークできます。ウィザードが安全性に関する設定を指定するように要求したら、[初期化の安全性保持] および [スクリプト化の安全性保持] を選択します。

最後に、セットアップ ウィザードは .htm ファイルと .cab ファイルを生成します。この後、これらの 2 つのファイルを目的のコンピュータにコピーし、.htm ファイルをダブルクリックしてページを読み込み、サーバーを正しく登録します。

既定では、ビジネス オブジェクトは Windows\System32\Occache ディレクトリにインストールされるため、これを Windows\System32 ディレクトリに移動して、HKEY_CLASSES_ROOT\CLSID\<MyActiveXGUID>\InprocServer32 レジストリ キーを正しいパスに合わせて変更する必要があります。


DCOM を介して使えるようビジネス オブジェクトをクライアントに登録する

カスタム ビジネス オブジェクトは、DCOM を介して使用できる識別子 (CLSID) にクライアント側がプログラム名 (ProgID) を確実にマップできるようにしておく必要があります。このため、DCOM オブジェクトの ProgID をクライアント側のレジストリに指定し、サーバー側ビジネス オブジェクトのクラス ID にマップする必要があります。サポートされているほかのプロトコル (HTTP、HTTPS、およびインプロセス) では、この操作は必要ありません。

たとえば、MyBObj というサーバー側ビジネス オブジェクトを、"{00112233-4455-6677-8899-00AABBCCDDEE}" という特定のクラス ID を使って公開する場合、次のエントリがクライアント側のレジストリに追加されていることを確認する必要があります。

[HKEY_CLASSES_ROOT]
\MyBObj
    \Clsid
    (Default) "{00112233-4455-6677-8899-00AABBCCDDEE}"


DCOM ストリーム マーシャリング形式の設定

RDS 1.5 以前のコンポーネントを使っているクライアント コンピュータは、RDS 2.0 以降のコンポーネントを使っているサーバーとは互換性がありません。基になるプロトコルとして DCOM を使っている場合は、RDS 2.0 以降をサポートする方が Recordset オブジェクトの転送に効果的です。クライアントで RDS 1.5 以前のコンポーネントを実行している場合は、サーバーを古い RDS サポート (RDS 1.0) または新しい RDS サポート (RDS 2.0 以降) のいずれかに合わせて設定できます。それぞれ、次のようにレジストリ エントリを設定してください。

[HKEY_CLASSES_ROOT]
\CLSID
    \[58ECEE30-E715-11CF-B0E3-00AA003F000F}
        \ADTGOptions]"MarshalFormat"="RDS10"

- または -

[HKEY_CLASSES_ROOT]
\CLSID
    \[58ECEE30-E715-11CF-B0E3-00AA003F000F}
        \ADTGOptions]"MarshalFormat"="RDS20"


DCOM 上で DLL の実行を有効にする

次の手順では、ビジネス オブジェクトの .dll が、コンポーネント サービスを経由して DCOM と Microsoft Internet Information Services (HTTP) の両方を使用できるようにする方法の概要を示します。

  1. コンポーネント サービス MMC スナップインに新しい空のパッケージを作成します。

    コンポーネント サービス MMC スナップインを使ってパッケージを作成し、DLL をこのパッケージに追加します。これにより、DCOM を通して .dll にアクセスできるようになりますが、IIS を通してのアクセスはできなくなります。.dll のレジストリを確認すると、Inproc キーが空になっているのがわかります。後述するように、アクティブ化属性を設定すると、Inproc キーに値が追加されます。

  2. ビジネス オブジェクトをパッケージにインストールします。

    - または -

    RDSServer.DataFactory オブジェクトをパッケージにインポートします。

  3. パッケージのアクティブ化属性を [作成元のプロセス内でコンポーネントをアクティブ化します。] (ライブラリ アプリケーション) に設定します。

    同一コンピュータで DCOM と IIS を通して .dll にアクセスするには、コンポーネントのアクティブ化属性をコンポーネント サービス MMC スナップインで設定する必要があります。[作成元のプロセス内でコンポーネントをアクティブ化します。] に属性を設定すると、コンポーネント サービス代理 DLL をポイントする Inproc サーバー キーがレジストリに追加されます。

    関連項目 コンポーネント サービス (Windows NT の場合は、Microsoft Transaction Service) の詳細、およびこれらの手順の実行方法については、コンポーネント サービスのドキュメントを参照するか、Transaction Server の Web サイト (http://www.microsoft.com/japan/com/default.htm) を参照してください。


IIS における仮想サーバーの設定

Internet Information Services 4.0 で仮想サーバーを作成する場合、その仮想サーバーが RDS と共に動作するよう設定するには、さらに次の 2 つの手順が必要です。

  1. サーバーをセットアップするときに、[実行アクセスを許可する (スクリプトのアクセスを含む)] チェック ボックスをオンにします。

  2. Msadcs.dll を vroot\msadc に移動します。vroot は、仮想サーバーのホーム ディレクトリです。


Specifying Threads Per Processor on IIS

IIS におけるプロセッサ別スレッドの指定

Internet Information Services (IIS) 4.0 以降で RDS を使う場合は、Web サーバーのレジストリを操作することによって、プロセッサごとに作成されるスレッドの数を制御できます。プロセッサごとのスレッド数は、トラフィックが多い場合や、トラフィックが少なくてもクエリのサイズが大きい場合に、パフォーマンスに影響することがあります。最善の結果を見つけるには、実験してみる必要があります。

この設定の既定値を決定または変更する方法は、IIS 4.0 サーバーの設定によって異なります。

MDAC 2.1.2.4202.3 (GA) 以降が IIS サーバーにインストールされている場合、RDS では、ASP スクリプトが使うのと同じコンポーネント サービス (Windows NT では Microsoft Transaction Services) を使います。プロセッサごとのスレッド数の既定値は 10 です。この既定値を変更するには、サーバー レジストリに次のキーを追加する必要があります。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\InetInfo\Parameters\MaxPoolThreads

MaxPoolThreads は、REG_DWORD です。MaxPoolThreads は、指定して追加しない限り、レジストリには表示されません。有効値の範囲は、5 から推奨最大値の 20 までです。レジストリ キーで指定した値が PoolThreadLimit キー (同じパスにあります) を超えると、PoolThreadLimit の値が使われます。

MDAC 2.1 2.1.1.3711.11 (GA) 以前のバージョンが IIS サーバーにインストールされている場合は、プロセッサごとのスレッド数の既定値は 6 です。既定値を変更するには、IIS サーバーのレジストリに次のキーを追加する必要があります。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ADCThreads

ADCThreads は、REG_DWORD です。ADCThreads は、指定して追加しない限り、レジストリには表示されません。有効な値の範囲は、1 から 50 です。レジストリ キーで指定した値が 50 を超えると、最大値 (50) が使用されます。


Securing RDS Applications

RDS アプリケーションの保護

Microsoft Internet Explorer のセキュリティの問題点

Micorosoft Internet Explorer では新しくセキュリティが拡張されたため、いくつかの ADO オブジェクトと RDS オブジェクトは、"セーフ (Safe)" モード環境でしか動作しません。そのため、ゾーンの相違、セキュリティ レベル、動作の制限、危険な操作、カスタマイズされたセキュリティ設定などの問題に注意を払う必要があります。

これらの問題の詳細については、「Microsoft Data Access Technical Articles」の「ActiveX Data Objects (ADO) Technical Articles」の「ADO and RDS Security Issues in Microsoft Internet Explorer」を参照してください。

セキュリティと Web サーバー

インターネット Web サーバーで RDSServer.DataFactory オブジェクトを使う場合は、それによりセキュリティ上の潜在的なリスクが発生することに留意してください。有効なデータ ソース名 (DSN)、ユーザー ID、およびパスワードの情報を持っている外部ユーザーであれば、データ ソースにクエリを送るページを作成できます。データ ソースへのアクセスを制限する方法の 1 つとして、RDSServer.DataFactory オブジェクト (msadcf.dll) の登録を解除して削除し、その代わりにハード コードされたクエリを使うカスタム ビジネス オブジェクトを使う方法があります。

RDSServer.Datafactory オブジェクトの使用に伴うセキュリティ上の影響の詳細については、Microsoft Security Web サイト (http://www.microsoft.com/security/default.asp) の Microsoft Security Bulletin MS99-025 を参照してください。

クライアントの擬似ユーザー化とセキュリティ

IIS Web サーバーのパスワード認証のプロパティが、Windows NT Challenge/Response 認証 (Windows NT 4.0) または統合 Windows 認証 (Windows 2000) に設定されている場合は、ビジネス オブジェクトはクライアントのセキュリティ コンテキストで呼び出されます。これは RDS 1.5 の新機能で、HTTP でのクライアントの擬似ユーザー化を可能にするものです。このモードで機能しているときは、Web サーバー (IIS) へのログオンは、匿名ではなく、動作中のクライアント コンピュータのユーザー ID とパスワードを使います。ODBC の DSN が信頼関係接続を使用するように設定されていれば、SQL Server などのデータベースへのアクセスもクライアントのセキュリティ コンテキスト下で行われます。ただし、これはデータベースが IIS と同じコンピュータにある場合にのみ機能し、ほかのコンピュータに対してクライアント認証を行うことはできません。

たとえば、ユーザー ID が "JohnD"、パスワードが "Secret" の John Doe がクライアント コンピュータにログオンしたとします。John Doe が実行しているブラウザ ベースのアプリケーションは、IIS が動作しているコンピュータ、"MyServer" で SQL クエリを実行し、Recordset を作成するために RDSServer.DataFactory オブジェクトにアクセスしなければなりません。Windows NT Server 4.0 が動作中のシステム、MyServer は、Windows NT Challenge/Response 認証を使うようセットアップされており、その ODBC DSN では [信頼関係接続] が選択されてます。また、このサーバーには SQL Server データ ソースが含まれています。Web サーバーは要求を受け取ると、クライアントにユーザー ID とパスワードを求めます。そのため、この要求は IUSER_MyServer (匿名パスワード認証がオンの場合の既定値) ではなく、"JohnD"/"Secret"の要求として MyServer にログオンされます。同じように、SQL Server へのログオンにも "JohnD"/"Secret" が使われます。

したがって、IIS Windows NT Challenge/Response 認証モードでは、ユーザーは、データベースのログオンに必要なユーザー ID とパスワード情報を明示的に要求されることなく、HTML ページを作成できます。IIS の基本認証が使われている場合は、ユーザー ID とパスワード情報が要求されます。

パスワード認証

RDS は、匿名、基本、または NT Challenge/Response 認証 (Windows 2000 では、統合 Windows 認証と呼ばれます) の 3 種類のパスワード認証のどのモードで動作している IIS Web サーバーとでも交信できます。こうした設定によって、たとえば、クライアント コンピュータは NT Web サーバーに対して明示的なアクセス権限を持っていなければならないなど、Web サーバーがパスワード認証を通してアクセスを制御する方法を定義できます。


DataFactory をセーフ モードまたは無制限モードに設定する

既定では、ADO は "安全な" RDSServer.DataFactory 設定でインストールされます。RDS Server コンポーネントのセーフ モードの条件は次のとおりです。

  1. RDSServer.DataFactory にハンドラが必要である (必須かどうかは、レジストリ キーの設定によって決まる)。

  2. 既定のハンドラである msdfmap.handler が登録され、安全なハンドラの一覧にあり、既定のハンドラとしてマークされている。

  3. Windows ディレクトリに Msdfmap.ini ファイルがインストールされている。3 層モードで RDS を使用する場合は、必要に応じてこのファイルを事前に設定する必要がある。

または、無制限の DataFactory インストールを設定することもできます。DataFactory は、カスタム ハンドラがなくても直接使うことができます。接続文字列を変更してカスタム ハンドラを使うことはできますが、そうする必要はありません。RDSServer.DataFactory オブジェクトの使用に伴う影響の詳細については、「RDS アプリケーションの保護」を参照してください。

安全に設定を行うために、レジストリ ファイル Handsafe.reg がハンドラ レジストリ エントリのセットアップ用に用意されています。セーフ モードで実行するには、Handsafe.reg を実行します。

無制限の設定を行うために、レジストリ ファイル Handunsf.reg がハンドラ レジストリ エントリのセットアップ用に用意されています。無制限モードで実行するには、Handunsf.reg を実行します。

RDS のカスタム ハンドラ機能の使用方法の詳細については、http://www.microsoft.com/data/ado/rds/custhand.htm にある「Using the Customization Handler Feature in RDS 2.0」を参照してください。


RDS 関連技術の使用

ここでは、次の技術的観点から、RDS の使用方法に関する特定の情報について説明します。

  • ODBC 接続プール

  • Microsoft コンポーネント サービス

ほかにもさまざまな技術が、RDS との対話、あるいは実装に使われています。

Internet Information Services Microsoft® Internet Information Services (IIS) または Active Server Pages (ASP) の詳細については、IIS の Web サイト (http://www.microsoft.com/japan/products/iis/) を参照してください。

Microsoft コンポーネント サービス コンポーネント サービス (Windows NT では Microsoft Transaction Server) の詳細については、Windows の Web サイト (http://www.microsoft.com/japan/windows/) を参照してください。Microsoft Transaction Server の詳細については、MTS の Web サイト (http://www.microsoft.com/japan/com/default.htm) を参照してください。

Microsoft SQL Server Microsoft SQL Server の詳細については、SQL Server の Web サイト (http://www.microsoft.com/japan/BackOffice/SQL/default.htm/) を参照してください。

Microsoft Internet Explorer Microsoft Internet Explorer の詳細については、Internet Explorer の Web サイト (http://www.microsoft.com/japan/ie/default.htm) 、または MSDN Online Web Workshop のページ (http://www.microsoft.com/japan/developer/workshop/default.asp) を参照してください。

Microsoft Windows NT Server/Windows 2000 Server Microsoft Windows NT Server または Windows 2000 Server のセキュリティの詳細については、Windows の Web サイト (http://www.microsoft.com/japan/windows/) を参照してください。


Using RDS with ODBC Connection Pooling

RDS を ODBC 接続プールと共に使用する

ODBC データ ソースを使用している場合は、Internet Information Services (IIS) の接続プール オプションを使って、クライアントのロード パフォーマンスを向上させることができます。接続プールは接続のためのリソース マネージャで、頻繁に使用される接続を開いた状態に保つことができます。

接続プールの使用については、Internet Information Services のドキュメントを参照してください。

Internet Information Services のドキュメントにあるように、接続プールを使用すると Web サーバーに制限が課される場合があるので注意してください。

接続プールの安定性とパフォーマンスの向上を確保するには、Microsoft SQL Server が TCP/IP ソケット ネットワーク ライブラリを使用するように設定する必要があります。

これを行うには、次のように設定します。

  • SQL Server コンピュータで TCP/IP ソケットを使用するよう設定する。

  • Web サーバーで TCP/IP ソケットを使用するよう設定する。

SQL Server コンピュータで TCP/IP ソケットを使用するよう設定する

SQL Server がインストールされているコンピュータで、SQL Server セットアップ プログラムを実行し、データ ソースとの対話に TCP/IP ソケット ネットワーク ライブラリを使うよう設定します。

SQL Server コンピュータに TCP/IP ソケット ネットワーク ライブラリを指定するには

Microsoft SQL Server 6.5 の場合

  1. [スタート] ボタンをクリックし、[プログラム]、[Microsoft SQL Server 6.5] をポイントして、[SQL セットアップ] をクリックします。

  2. [続行] を 2 回クリックします。

  3. [Microsoft SQL Server 6.5 - オプション] ダイアログ ボックスの [ネットワーク サポートの変更] を選択し、[続行] をクリックします。

  4. [TCP/IP ソケット] チェック ボックスがオンになっていることを確認し、[OK] をクリックします。

  5. [続行] をクリックして作業を完了し、セットアップを終了します。

Microsoft SQL Server 7.0 の場合

  1. [スタート] ボタンをクリックし、[プログラム]、[Microsoft SQL Server 7,0] をポイントして、[Server ネットワーク ユーティリティ] をクリックします。

  2. ダイアログ ボックスの [全般] タブで、[追加] をクリックします。

  3. [ネットワーク ライブラリ設定の新規追加] ダイアログ ボックスの [TCP/IP] をクリックします。

  4. [ポート番号] ボックスと [プロキシ アドレス] ボックスで、ネットワーク管理者によって割り当てられたポート番号とプロキシ アドレスを入力します。

  5. [OK] をクリックして作業を完了し、セットアップを終了します。

Web サーバーで TCP/IP ソケットを使用するよう設定する

Web サーバーで TCP/IP ソケットを使用する設定には、2 つのオプションがあります。すべての SQL Server を Web サーバーからアクセスできるようにするか、特定の SQL Server だけを Web サーバーからアクセスできるようにするかによって、行う設定も異なります。

すべての SQL Server を Web サーバーからアクセスできるようにする場合は、Web サーバー コンピュータで SQL Server クライアント設定ユーティリティを実行する必要があります。以下の手順により、この IIS Web サーバーから行われるすべての SQL Server 接続の既定のネットワーク ライブラリが、TCP/IP ソケット ネットワーク ライブラリに変更されます。

Web サーバーを設定するには (すべての SQL Server)

Microsoft SQL Server 6.5 の場合

  1. [スタート] ボタンをクリックし、[プログラム]、[Microsoft SQL Server 6.5] をポイントして、[SQL Server クライアント設定ユーティリティ] をクリックします。

  2. [Net Library] タブをクリックします。

  3. [デフォルト ネットワーク] ボックスで [TCP/IP ソケット] をクリックします。

  4. [終了] をクリックして変更を保存し、ユーティリティを終了します。

Microsoft SQL Server 7.0 の場合

  1. [スタート] ボタンをクリックし、[プログラム]、[Microsoft SQL Server 7.0] をポイントして、[クライアント ネットワーク ユーティリティ] をクリックします。

  2. [全般] タブをクリックします。

  3. [既定のネットワーク ライブラリ] ボックスで、[TCP/IP] をクリックします。

  4. [OK] をクリックして変更を保存し、ユーティリティを終了します。

Web サーバーから特定の SQL Server だけにアクセスする場合は、Web サーバー コンピュータで SQL Server クライアント設定ユーティリティを実行する必要があります。特定の SQL Server 接続のネットワーク ライブラリを変更するには、SQL Server クライアント設定ユーティリティを Web サーバー コンピュータで以下のように設定します。

Web サーバーを設定するには (特定の SQL Server)

Microsoft SQL Server 6.5 の場合

  1. [スタート] ボタンをクリックし、[プログラム]、[Microsoft SQL Server 6.5] をポイントして、[SQL Server クライアント設定ユーティリティ] をクリックします。

  2. [拡張] タブをクリックします。

  3. [サーバー] ボックスに、TCP/IP ソケットを使って接続するサーバーの名前を入力します。

  4. [DLL 名] ボックスの [TCP/IP ソケット] をクリックします。

  5. [追加/変更] をクリックします。これで、このサーバーを指す、すべてのデータ ソースが TCP/IP ソケットを使用します。

  6. [終了] をクリックします。

Microsoft SQL Server 7.0 の場合

  1. [スタート] ボタンをクリックし、[プログラム]、[Microsoft SQL Server 7.0] をポイントして、[クライアント設定ユーティリティ] をクリックします。

  2. [全般] タブをクリックします。

  3. [追加] をクリックします。

  4. [サーバー別名] タブにサーバーの別名を入力します。[ネットワーク ライブラリ] ボックスで、[TCP/IP] をクリックします。[コンピュータ名] ボックスに、TCP/IP ソケット クライアントを待ち受けるコンピュータの名前を入力します。[ポート番号] ボックスに、SQL サーバーが監視 (リスン) するポートを入力します。

  5. [OK] を 2 回クリックしてユーティリティを終了します。


コンポーネント サービスでのビジネス オブジェクトの実行

ビジネス オブジェクトには、実行可能ファイル (.exe) とダイナミックリンク ライブラリ (.dll) があります。ビジネス オブジェクトを実行するために使う設定は、オブジェクトが .dll ファイルと .exe ファイルのどちらであるかによって異なります。

  • .exe ファイルのビジネス オブジェクトは、DCOM を通して呼び出せます。Internet Information Services (IIS) を通してこれらのビジネス オブジェクトを使う場合は、データの追加マーシャリングの対象となるため、クライアントのパフォーマンスが低下します。

  • .dll ファイルのビジネス オブジェクトは、IIS (したがって、HTTP) を介して利用できます。コンポーネント サービス (Windows NT では Microsoft Transaction Server) を使う場合に限り、DCOM からも利用できます。IIS を介してアクセスするには、IIS サーバー コンピュータにビジネス オブジェクト DLL を登録する必要があります。DCOM で DLL を実行するための設定手順については、「DCOM 上で DLL の実行を有効にする」を参照してください。

    メモ 中間層のビジネス オブジェクトをコンポーネント サービスのコンポーネント (GetObjectContext、SetComplete、および SetAbort を使用) として実装すると、それらのビジネス オブジェクトは、コンポーネント サービス (Windows NT では、MTS) コンテキスト オブジェクトを使って、複数のクライアント呼び出しにわたってその状態を維持できます。このシナリオは、信頼関係のあるクライアントとサーバー (イントラネット) 間で運用される DCOM においても可能です。その場合、クライアント側の RDS.DataSpace オブジェクトと CreateObject メソッドは、トランザクション コンテキスト オブジェクトと CreateInstance メソッド (ITransactionContext インターフェイスにより供給) に置き換えられ、コンポーネント サービスによって実装されます。


RDS トラブルシューティング

ここでは、RDS に関する特定のエラーや問題点の対応策を説明します。次の項目をとりあげます。

  • "インターネット サーバー エラー : アクセスは拒否されました"

  • 反復可能な分離レベルの読み取りでのデッドロック

  • 十分な TempDB 領域の確保

  • ログ ファイルの使用領域の最小化


"インターネット サーバー エラー : アクセスは拒否されました"

このエラーが発生した場合は、通常 Microsoft® Internet Information Services (IIS) が次のステータスを戻したことを意味します。

HTTP_STATUS_DENIED 401

IIS がアクセスしているディレクトリの権限が適切かどうか確認してください。RDS は、3 種類あるパスワード認証モードのどのモードで実行している IIS Web サーバーとも通信できます。3 種類のパスワード認証モードには、匿名、基本、または Microsoft 暗号化認証 (Windows 2000 では統合 Windows 認証) があります。また、Windows NT/Windows 2000 コンピュータがデータ ソース コンピュータの場合、そのコンピュータに対する権限が Web サーバーに必要です。


反復可能な分離レベルの読み取りでのデッドロック

反復読み取り可能な分離レベルで SQL Server にアクセスするカスタム ビジネス オブジェクトを、同じトランザクションでクエリを送信し、更新する 2 つのクライアントから同時に呼び出すと、デッドロックになる場合があります。RDS は、処理のうち 1 つをタイムアウトにしてデッドロックを解除する仕組みになっていますが、タイムアウトになったクライアントは更新されません。

タイムアウトの長さは、Cursor Service の Command Time Out ダイナミック プロパティで調整します。


十分な TempDB 領域の確保

SQL Server 6.5 において処理領域が必要な Recordset オブジェクトの処理中にエラーが発生した場合は、TempDB のサイズを増やす必要があります。(クエリによっては、一時的な処理領域が必要なものがあります。たとえば、ORDER BY 句のあるクエリでは Recordset のソートが必要ですが、これには一時的な処理領域が必要です。)

重要 一度展開したデバイスは簡単には圧縮できません。実行前に以下の手順をよく読んでください。

注意 既定では、Microsoft SQL Server 7.0 以降のバージョンでは、TempDB は必要に応じて自動的に拡大できるよう設定されます。したがって、この手順が必要なのは、7.0 より前のバージョンを実行するサーバーだけです。

SQL Server 6.5 の TempDB 領域を拡大するには

  1. Microsoft® SQL Server Enterprise Manager を起動し、サーバーのツリーを開き、次にデータベース デバイス ツリーを開きます。

  2. マスターなど拡張する物理デバイスをダブルクリックして、[データベース デバイスの編集] ダイアログ ボックスを開きます。

    このダイアログ ボックスには、カレント データベースの使用領域のサイズが表示されます。

  3. [サイズ] スクロール ボックスで、デバイスを目的の大きさまで増やします (たとえば、ハードディスクの容量のうち 50 MB)。

  4. [すぐに変更] をクリックして、論理 TembDB の領域の拡張限度を増やします。

  5. サーバーのデータベース ツリーを開き、[TempDB] をダブルクリックして [データベースの編集] ダイアログ ボックスを開きます。[データベース] タブには、現在 TempDB ([データ サイズ]) に割り当てられている領域の大きさが表示されます。既定値の領域サイズは 2MB です。

  6. [サイズ] グループの [拡張] をクリックします。各物理デバイスで使用できる割り当て領域がグラフで示されます。茶色のバーが使用できる領域を表します。マスターなどのログ デバイスを選択し、[サイズ (MB)] ボックスに使用できる領域の大きさを表示します。

  7. [すぐに拡張] をクリックして、領域を TempDB データベースに割り当てます。

    TempDB に新たに割り当てられたサイズが、[データベースの編集] ダイアログ ボックスに表示されます。

    関連項目 このトピックの詳細については、Microsoft SQL Server Enterprise Manager ヘルプの、「データベースのサイズを拡張する方法」を参照してください。


ログ ファイルの使用領域の最小化

SQL Server データベースで大規模な操作を行うと、ログ ファイルの領域がすぐになくなり、サーバーが停止することがあります。ログ ファイルを [チェック ポイント時のログ切り捨て] に設定しておけば、データベースのログ ファイルに十分な余裕を設けることができます。

Microsoft SQL Server 6.5 でチェック ポイント時のログの切り捨てを有効にするには

  1. Microsoft SQL Server Enterprise Manager を起動し、サーバーのツリーを開き、次にデータベース デバイス ツリーを開きます。

  2. この機能を有効にするデータベースの名前をダブルクリックします。

  3. [データベース] タブの [切り捨て] をクリックします。

  4. [オプション] タブの [チェック ポイント時のログ切り捨て] をクリックし、[OK] をクリックします。

Microsoft SQL Server 7.0 でチェック ポイント時のログの切り捨てを有効にするには

  5. Microsoft SQL Server Enterprise Manager を起動し、サーバーのツリーを開き、次にデータベース ツリーを開きます。

  6. この機能を有効にするデータベースの名前を右クリックし、[プロパティ] を選択します。

  7. [オプション] タブの [チェック ポイント時のログ切り捨て] をクリックし、[OK] をクリックします。

    関連項目 [チェック ポイント時のログ切り捨て] 機能の詳細については、Microsoft SQL Server のマニュアルを参照してください。


ADO の新機能

次のトピックは、ADO および RDS で利用可能なさまざまな機能を解説しています。

  • Recordset 作成の簡略化

  • Recordset の永続化

  • インデックス サポートと Find メソッド、Sort プロパティ、Filter プロパティ

  • Record オブジェクトと Stream オブジェクト

  • ADO イベント モデルと同期および非同期処理

  • データ シェイプ

  • DataFactory のカスタマイズ


Recordset 作成の簡略化

ADO は、Recordset の Fields コレクションに新たな Field オブジェクトを追加することによって、Recordset の作成を簡略化する新しいメソッドを提供しています。最初に空の Recordset を作成し、そこにデータベースに限らず、どのようなソースからでもデータを Recordset に挿入することができます。また、プログラム的にデータを作成することもできます。

この新しい Recordset 作成方法では、Recordset に使用できるすべてのデータ操作メソッドを利用できます。ビジュアル コントロールに情報を与えたり、実際のデータ ソースを更新するために Recordset を使用します。

次の Visual Basic コードは、簡略化された方法で Recordset を作成する例を示しています。

Sub CreateRS()
    Dim rs As New ADODB.Recordset

    rs.Fields.Append "Field1", adChar, 10
    rs.Fields.Append "Field2", adInteger

    rs.Open
    rs.AddNew
    rs("Field1") = "any string"
    rs("Field2") = 9

    Do While Not rs.EOF
        Debug.Print rs("Field1") & " " & rs("Field2")
        rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing
End Sub


Recordset の永続化

Microsoft OLE DB Persistence Provider は、Recordset オブジェクトの Save メソッドを使用したファイルへの Recordset オブジェクトの格納をサポートします。永続的に保存されたファイルは、ローカル ドライブ上、ネットワーク サーバー上、または Web サイト上に URL として存在することになります。この永続化されたファイルは、Recordset オブジェクトの Open メソッドまたは Connection オブジェクトの Execute メソッドのどちらかを使用して、後で復元できます。

さらに、GetString メソッドは、ユーザーがレコードを取り出すときに、ユーザーが指定した文字で区切られた列と行の形式へ、Recordset オブジェクトを変換します。

Recordset を永続化するには、まず、ファイルに格納できる形式に変換します。Recordset オブジェクトは、Microsoft の ADTG (Advanced Data TableGram) 形式、または公開されている XML (Extensible Markup Language) 形式で保存することができます。

注意 階層 Recordsets (データ シェイプ) を XML 形式で保存するときは、2 つの制限事項があります。階層 Recordset に保留中の更新が含まれている場合は XML で保存できません。また、パラメータ化された階層 Recordset を保存することはできません。

次に、保留中の変更を、永続化されたファイルに保存します。この操作によって、Recordset オブジェクトを返すクエリの発行、レコードセットの編集、レコードセットおよび保留中の変更の保存、後でのレコードセットの復元、保存されている保留中の変更を使ったデータ ソースの更新などが可能になります。

Stream オブジェクトを永続的に保存する方法については、「ストリームと永続性」を参照してください。

Recordset の永続化の例については、「XML Recordset の永続化のシナリオ」を参照してください。

例

Recordset の保存

Dim rs as New ADODB.Recordset
rs.Save "c:\yourFile.adtg", adPersistADTG

Recordset.Open を使用して永続化ファイルを開く

Dim rs as New ADODB.Recordset
rs.Open "c:\yourFile.adtg", "Provider=MSPersist",,,adCmdFile

必要に応じて、Recordset がアクティブな接続を持たない場合、次のように記述してすべての既定値を受け入れるようにします。

Dim rs as New ADODB.Recordset
rs.Open "c:\yourFile.adtg"

Connection.Execute を使用して永続化ファイルを開く

Dim conn as New ADODB.Connection
Dim rs as ADODB.Recordset
conn.Open "Provider=MSPersist"
Set rs = conn.execute("c:\yourFile.adtg")

RDS.DataControl を使用して永続化ファイルを開く

この場合、Server プロパティは設定されません。

Dim dc as New RDS.DataControl
dc.Connect = "Provider=MSPersist"
dc.SQL = "c:\yourFile.adtg"
dc.Refresh


XML Recordset の永続化のシナリオ

このシナリオでは、Recordset オブジェクトの内容を ASP Response オブジェクトに直接保存する Active Server Pages (ASP) アプリケーションを作成します。

注意 このシナリオでは、サーバーに Internet Information Services 5.0 (IIS) 以降がインストールされている必要があります。

返された Recordset は、RDS.DataControl を使って Internet Explorer に表示されます。

このシナリオを作成するには、次の手順を実行する必要があります。

  1. アプリケーションのセットアップ

  2. データの取得

  3. データの送信

  4. データの受信

  5. データの表示

次へ 手順 1: アプリケーションのセットアップ


手順 1: アプリケーションのセットアップ

スクリプトの権限を持つ "XMLPersist" という名前の IIS 仮想ディレクトリを作成します。この仮想ディレクトリを指し示すフォルダ内に、"XMLResponse.asp" および "Default.htm" という名前の 2 つのテキスト ファイルを作成します。

次へ 手順 2: データの取得


手順 2: データの取得

この手順では、ADO Recordset を開いてクライアントに送信する準備を行うコードを記述します。メモ帳などのテキスト エディタで XMLResponse.asp ファイルを開き、次のコードを挿入してください。

<%@ codepage="65001" %>
<object id="rstCustomers" progid="ADODB.Recordset" runat="Server">
</object>
<%
  Option Explicit
  Response.Buffer = True

  Dim strSQL, strConnection

  Response.ContentType = "text/xml"
  Response.Expires = 0
  Response.Buffer = False

  strSQL="SELECT title_id, title, type FROM titles" & _
         " ORDER By title"

  strConnection = "Provider=MSDataShape;Data Provider=SQLOLEDB;" & _
                      "Database=Pubs;Data Source=SRV;User Id=sa;" & _
                        "Password=;"

  rstCustomers.Open strSQL, 3, 4, adLockBatchOptimistic

strConnection の Data Source パラメータは、実際に使用する Microsoft SQL Server コンピュータの名前に置き換えてください。ページの codepage は、XML を返すように 65001 (Unicode) に設定されます。

ファイルを開いたままで、次の手順に進みます。

次へ 手順 3: データの送信


手順 3: データの送信

前の手順で作成した Recordset を、XML として ASP Response オブジェクトに保存して、クライアントに送信する必要があります。XMLResponse.asp ファイルの最後に、次のコードを追加します。

  Response.Write "<?xml version='1.0' encoding='ISO-8859-1'?>" & vbCRLF
  rstCustomers.save Response, 1
  rstCustomers.Close
%>

Recordset の Save メソッドの保存先として ASP Response オブジェクトが指定されていることに注意してください。Save メソッドの保存先として、ADO Stream オブジェクトなど、IStream インターフェイスをサポートする任意のオブジェクト、または Recordset の保存先の完全なパスを含むファイル名を指定できます。XMLResponse.asp ファイルを保存して閉じ、次の手順に進みます。

次へ 手順 4: データの受信


手順 4: データの受信と表示

この手順では、Recordset を取得する XMLResponse.asp ファイルを示す RDS.DataControl オブジェクトが埋め込まれた HTML ファイルを作成します。メモ帳などのテキスト エディタで Default.htm ファイルを開き、次のコードを追加してください。URL の "yourserver" の部分は、実際に使用するサーバー コンピュータの名前に置き換えてください。

<HTML>
<HEAD><TITLE>ADO Recordset Persistence Sample</TITLE></HEAD>
<BODY>

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="RDC1" HEIGHT="1" WIDTH="1">
   <PARAM NAME="URL"
          VALUE="http://yourserver/XMLPersist/XMLResponse.asp">
</OBJECT>

<TABLE DATASRC="#RDC1">
  <TR>
<TD><SPAN DATAFLD="title_id"></SPAN></TD>
<TD><SPAN DATAFLD="title"></SPAN></TD>
<TD><SPAN DATAFLD="type"></SPAN></TD>
  </TR>
</TABLE>
</BODY>
</HTML>

Default.htm ファイルを保存して閉じます。Internet Explorer 4.0 以降で、http://yourserver/XMLPersist/default.htm の URL を開き、結果を確認します。データは関連付けられた DHTML テーブルに表示されます。次に、http://yourserver/XMLPersist/XMLResponse.asp の URL を開き、結果を確認します。XML が表示されます。


インデックス サポートと Find メソッド、Sort プロパティ、Filter プロパティ

フィールドのインデックスは、Recordset オブジェクトの Find メソッド、Sort プロパティ、および Filter プロパティのパフォーマンスを大きく向上できます。Field オブジェクトの内部インデックスを、ダイナミック Optimize プロパティを設定することによって、作成することができます。このダイナミック プロパティは、CursorLocation プロパティが adUseClient に設定されたときに、Field オブジェクトの Properties コレクションに追加されます。ただし、このインデックスは、ADO 内部でのみ使用できます。このインデックスは、外からアクセスしたり、ほかの目的に使用することはできません。このインデックスは、Recordset オブジェクトの Index プロパティとは別のものです。

Sort プロパティは、Recordset オブジェクトが移動する行の順序を決定します。Filter プロパティは、行を移動する時に、アクセス可能な行を決定します。Find メソッドは、Recordset オブジェクトの、インデックス列 (フィールド) 内の値の位置をすばやく決定します。Optimize プロパティを使って列のインデックスを作成すると、多くの場合、その列に対する Find メソッドの処理速度が速くなります。


Record オブジェクトと Stream オブジェクト

ADO には現在、リレーショナル データベースなどのデータ ソース内の情報にアクセスするための簡単な手段があります。しかし多くの情報は、データベース内のテーブルとしてではなく、電子メール システム内のメッセージおよび最新のファイル システム内のファイルとして存在しています。このような現状に対して Record オブジェクトと Stream オブジェクトを使うことで、リレーショナル データベース以外のソースに格納された情報にアクセスできるようになります。

Record オブジェクトは、ファイル システム内のディレクトリとファイルのようなデータを、または電子メール システムのフォルダとメッセージのようなデータを、表したり管理することができます。Record オブジェクトと Recordset オブジェクトには異なるメソッドとプロパティがありますが、Record は Recordset 内の行を表すこともできます。

Stream オブジェクトは、ファイルまたはメッセージを構成するバイナリ ストリームまたはテキスト ストリームを読み、書き、管理する手段を提供します。

また、データ ソースおよびファイルとディレクトリの場所を指定するための接続文字列とコマンド テキストの代わりに、URL (Uniform Resource Locator) を使用することができます。既存の Connection オブジェクトと Recordset オブジェクトと共に使用する場合と同様に、Record オブジェクトと Stream オブジェクトと共に、URL を使用できます。

いくつかの ADO オブジェクトが、Record オブジェクトと Stream オブジェクトと共に機能できるように、機能強化されました。

  • Field オブジェクトを作成してコレクションに追加する Fields コレクションの Append メソッドも、Field の値を指定できます。

  • Update メソッドで、フィールドのコレクションへの追加またはコレクションからの削除を完結させます。

  • Append メソッドのショートカットと代替手段として、未定義の、または以前削除されたフィールドに値を代入するだけで、フィールドを作成することもできます。

説明を簡単にするために、これ以降の説明では、"ディレクトリ" という用語はフォルダも指し、"ファイル" という用語はメッセージも指すことにします。

Record と Stream オブジェクトの詳細については、次のトピックを参照してください。

  • 絶対および相対 URL

  • レコードとプロバイダ供給のフィールド

  • ストリーム

  • ストリームと永続性

  • OLE DB Provider for Internet Publishing を用いた ADO の使用

  • インターネット公開のシナリオ


絶対および相対 URL

URL で、ファイル、ディレクトリ、HTML ページ、画像、プログラムなどの保存先、つまりローカルまたはネットワーク コンピュータでの場所を指定します。この説明では、"絶対 URL" は次の形式とします。

scheme://server/path/resource

各項目の意味は次のとおりです。

scheme

resource がどのようにアクセスされるかを指定します。

server

resource が存在するコンピュータの名前を指定します。

path

ターゲットに導くディレクトリの順序を指定します。resource が省略されると、ターゲットは path 内の最後のディレクトリと見なされます。

resource

指定すると、resource がターゲットと見なされます。通常はファイル名です。resource は、単純なバイナリ ストリームまたはテキスト ストリームを含む "単純ファイル" にすることも、1 つ以上のストレージとバイナリまたはテキスト ストリームを含む "構造ドキュメント" にすることもできます。

"絶対 URL" には、リソースを検索するために必要なすべての情報が含まれています。

一方 "相対 URL" では、開始点として絶対 URL を使用して、リソースを検索します。実際、ターゲットの "完全 URL" は、絶対 URL と相対 URL を連結することで指定されます。通常、相対 URL は path とオプションの resource から構成され、scheme または server が含まれることはありません。

URL を使用したコンテキストの定義

Connection オブジェクトで表される開かれた接続の機能の 1 つに、その接続で示されるデータ ソースへの以後の操作の制限があります。つまり、接続によって以後の操作のコンテキストが定義されます。

このリリースでは、絶対 URL でコンテキストを定義することもできます。たとえば、Record オブジェクトが絶対 URL で開かれたとき、URL に指定されたリソースを表すために、Connection オブジェクトが暗黙的に作成されます。

コンテキストを定義する絶対 URL は、Record オブジェクト Open メソッドの ActiveConnection パラメータに指定することができます。絶対 URL は、Connection オブジェクト Open メソッドの ConnectionString パラメータ、および Recordset オブジェクト Open メソッドの ActiveConnection パラメータ内の新しい "URL=" キーワードの値としても、指定することができます。

ディレクトリを表す Record オブジェクトまたは Recordset オブジェクトを使用しても、コンテキストを定義することができます。これは、これらのオブジェクトが既に明示的または暗黙的に、コンテキストを指定する Connection オブジェクトを宣言しているためです。

適用範囲についての操作

コンテキストの定義では、同時に "適用範囲" も定義します。つまり、以後の操作に関係するディレクトリとサブディレクトリを定義します。Record オブジェクトには、ディレクトリとその下のサブディレクトリで作用する、CopyRecord、MoveRecord、および DeleteRecord を含めた、適用範囲に関連するメソッドがいくつかあります。

コマンド コンテキストとしての相対 URL

データ ソースで実行されるコマンドを指定する文字列は、Connection オブジェクト Execute メソッドのCommandText パラメータ、および Recordset オブジェクト Open メソッドの Source パラメータ内で指定することができます。

相対 URL は、CommandText または Source パラメータ内に指定できます。相対 URL は実際には SQL コマンドなどのコマンドを指定するわけではなく、単にこれらのパラメータ内に指定されるだけです。また、アクティブな接続のコンテキストは絶対 URL である必要があり、Option パラメータは adCmdTableDirect に設定する必要があります。

たとえば次のようにして、Winnt/system32 ディレクトリの Readme25.txt ファイルで Recordset を開くことができます。

recordset.Open "system32/Readme25.txt",      "URL=http://YourServer/Winnt/",,,adCmdTableDirect

接続文字列内の絶対 URL で、サーバー (YourServer) とパス (Winnt) を指定しています。この URL は、コンテキストも指定しています。

コマンド テキスト内の相対 URL では、開始点として絶対 URL を使い、パスの残りの部分 (system32) と開くファイル (Readme25.txt) を指定します。

オプション フィールド (adCmdTableDirect) で、コマンドの型は相対 URL であることを示しています。

別の例を示します。次のコードでは、Winnt ディレクトリの内容についての Recordset を開きます。

recordset.Open "", "URL=http://YourServer/Winnt/",,,adCmdTableDirect

OLE DB プロバイダ供給の URL スキーマ

完全修飾 URL の先行部分は、URL の残りの部分で示されるリソースへのアクセスに使用される "スキーマ" です。ここに示す例は、HTTP (ハイパーテキスト転送プロトコル) と FTP (ファイル転送プロトコル) です。

このリリースで、ADO は、独自の URL スキーマを認識する OLE DB プロバイダをサポートします。たとえば、"公開" Windows 2000 ファイルにアクセスする OLE DB Provider for Internet Publishing では、既存の HTTP スキーマが認識されます。


レコードとプロバイダ供給のフィールド

Record オブジェクトが開かれると、そのソースは、開かれた Connection オブジェクトと共に動作する開かれた Recordset オブジェクトのカレント行、絶対 URL、または相対 URL になることができます。

Record が Recordset から開かれる場合は、Record オブジェクトの Fields コレクションには、Recordset からのすべてのフィールドに加えて基になるプロバイダによって追加されたフィールドが含まれます。

プロバイダは、Record の補完機能として作用する追加フィールドを挿入することができます。その結果、Record には、Recordset 全体、または Recordset の別の行から派生した Record にはない固有のフィールドが存在するようになります。

たとえば、電子メール データ ソースから派生した Recordset のすべての行に、"From"、"To"、および "Subject" などの列があるとします。この Recordset から派生した Record にも、同じフィールドがあります。ただし、"Attachment" と "Cc" (カーボン コピー) など、ある Record で表される特定のメッセージに固有のフィールドがある場合もあります。

Record オブジェクトと Recordset オブジェクトのカレント行には同じフィールドがありますが、Record オブジェクトと Recordset オブジェクトには異なるメソッドとプロパティがあるので、この 2 つは別のものです。

Record オブジェクトと Recordset オブジェクトに共通して存在しているフィールドは、どちらかのオブジェクトで変更することができます。ただし、基になるプロバイダがフィールドを "Null" に設定できたとしても、Record オブジェクトでフィールドを削除することはできません。

Record が開かれた後に、プログラムでフィールドを追加することができます。また、追加したフィールドを削除することができますが、元の Recordset からフィールドを削除することはできません。

さらに、URL から Record オブジェクトを直接開くことができます。この場合、Record に追加したフィールドは、基になるプロバイダによって異なります。現在ほとんどのプロバイダでは、Record で表されるエンティティを記述したフィールドのセットを追加することができます。エンティティが単純ファイルなどのバイト ストリームから構成されている場合、通常は Stream オブジェクトを Record から開くことができます。

ドキュメント ソース プロバイダからの特殊フィールド

"ドキュメント ソース プロバイダ" というプロバイダの特殊なクラスが、フォルダとドキュメントを管理します。Record オブジェクトがドキュメントを表しているか、Recordset オブジェクトがドキュメントのフォルダを表している場合には、ドキュメント ソース プロバイダが、実際のドキュメント自体ではなくドキュメントの特徴を記述した固有のフィールドのセットで、これらのオブジェクトにデータを設定します。通常、1 つのフィールドにドキュメントを表す Stream への参照が含まれます。

これらのフィールドがリソース レコードまたはレコードセットを形成します。「ADO でのプロバイダの使用」では、これらのフィールドをサポートする特定のプロバイダ群用に、フィールドが列挙されています。

リソースの Record または Recordset の Fields コレクションを 2 つの定数でインデックス付けて、両方で共通して使用されるフィールドが検索されます。Field オブジェクトの Value プロパティが、希望した内容を返します。

  • adDefaultStream 定数でアクセスされたフィールドには、Record オブジェクトまたは Recordset オブジェクトに関連付けられた既定のストリームが含まれます。プロバイダは、既定のストリームをオブジェクトに割り当てます。

  • adRecordURL 定数でアクセスされたフィールドには、ドキュメントを識別する絶対 URL が含まれます。

ドキュメント ソース プロバイダでは、Record オブジェクトと Field オブジェクトの Properties コレクションはサポートされません。Properties コレクションの内容は、このようなオブジェクトに対しては Null です。

ドキュメント ソース プロバイダで、ドキュメント ソース プロバイダかどうかを識別する Datasource Type などのプロバイダ特有のプロパティを追加することができます。使用中のプロバイダの型を調べる方法の詳細については、そのプロバイダに関連するマニュアルを参照してください。

リソース レコードセットの列

"リソース レコードセット" は、次の列で構成されています。

列名 | 型 | 説明
RESOURCE_PARSENAME | adVarWChar | 読み取り専用。リソースの URL を示します。
RESOURCE_PARENTNAME | adVarWChar | 読み取り専用。親レコードの絶対 URL を示します。
RESOURCE_ABSOLUTEPARSENAME | adVarWChar | 読み取り専用。リソースの絶対 URL、つまり PARENTNAME と PARSENAME の連結を示します。
RESOURCE_ISHIDDEN | adBoolean | リソースが非表示状態であれば True。行セットを作成するコマンドが明示的に RESOURCE_ISHIDDEN が TRUE の行を選択しない限り、行が返されません。
RESOURCE_ISREADONLY | adBoolean | リソースが読み取り専用であれば True。DBBINDFLAG_WRITE でこのリソースを開こうとすると、DB_E_READONLY が設定されて失敗します。リソースが読み取り専用で開かれた場合でも、このプロパティを編集することができます。
RESOURCE_CONTENTTYPE | adVarWChar | "text/html" などの形式を示すドキュメントの MIME の種類を示します。
RESOURCE_CONTENTCLASS | adVarWChar | たとえば法律家の書類などの、ドキュメントの使用方法を示します。これは、ドキュメントの作成に使用される Office テンプレートに対応付けることができます。
RESOURCE_CONTENTLANGUAGE | adVarWChar | 内容がどの言語で保存されるかを示します。
RESOURCE_CREATIONTIME | adFileTime | 読み取り専用。リソースが作成された時刻を含んだ FILETIME 構造を示します。時刻は、UTC (Coordinated Universal Time) 形式で報告されます。
RESOURCE_LASTACCESSTIME | adFileTime | 読み取り専用。リソースが最後にアクセスされた時刻を含んだ FILETIME 構造を示します。時刻は UTC 形式です。プロバイダでこの時刻メンバがサポートされない場合、FILETIME メンバは 0 です。
RESOURCE_LASTWRITETIME | adFileTime | 読み取り専用。リソースが最後に書き込まれた時刻を含んだ FILETIME 構造を示します。時刻は UTC 形式です。プロバイダでこの時刻メンバがサポートされない場合、FILETIME メンバは 0 です。
RESOURCE_STREAMSIZE | asUnsignedBigInt | 読み取り専用。リソースの既定のストリームのサイズをバイト数で示します。
RESOURCE_ISCOLLECTION | adBoolean | 読み取り専用。リソースがディレクトリなどのコレクションであれば True です。リソースが単純ファイルの場合は False です。
RESOURCE_ISSTRUCTUREDDOCUMENT | adBoolean | リソースが構造ドキュメントであれば True。リソースが構造ドキュメントでない場合は False です。その場合は、コレクションまたは単純ファイルの可能性があります。
DEFAULT_DOCUMENT | adVarWChar | 読み取り専用。このリソースがフォルダの既定の単純ドキュメントまたは構造ドキュメントへの URL を含んでいることを示します。既定のストリームがリソースから要求された時に使用されます。このプロパティは、単純ファイルの場合は空白です。
CHAPTERED_CHILDREN | adChapter | 読み取り専用。オプションです。リソースの子を含む行セットのチャプタを示します。(OLE DB Provider for Internet Publishing はこの列を使いません。)
RESOURCE_DISPLAYNAME | adVarWChar | 読み取り専用。リソースの表示名を示します。
RESOURCE_ISROOT | adBoolean | 読み取り専用。リソースがコレクションのルートまたは構造ドキュメントであれば True です。


ストリーム

Stream オブジェクトは、次の対象について開くことができます。

  • URL で指定された単純ファイル。

  • Stream オブジェクトを含む Record または Recordset のフィールド。

  • ディレクトリまたは複合ファイルを表す Record または Recordset オブジェクトの既定のストリーム。

  • 単純ファイルの URL を含むリソースのフィールド。

  • 特定のソースの指定なし。この場合、Stream オブジェクトはメモリ内で開かれ、データをそこへ書き込み、別の Stream またはファイルに書き出すことができます。

  • Recordset 内の BLOB フィールド。


ストリームと永続性

Recordset オブジェクトの Save メソッドでファイル内に Recordset を格納し (つまり、"永続")、Open メソッドでそのファイルから Recordset を復元します。

同様に、Save および Open メソッドで Recordset を Stream オブジェクトに保存することができます。この機能は、リモート データ サービス (RDS) および Active Server Pages (ASP) と連携して使用する場合に、特に役に立ちます。

この永続性を ASP ページ自体でどのように使用できるかの詳細については、最新の ASP マニュアルを参照してください。

次に、Stream オブジェクトと永続性を使用する方法についてのシナリオをいくつか示します。

シナリオ 1:

このシナリオでは、Recordset をファイルへ、次に Stream へ単純に保存します。次に、この永続性が保たれたストリームを別の Recordset で開きます。

Dim rs1 As ADODB.Recordset
Dim rs2 As ADODB.Recordset
Dim stm As ADODB.Stream

rs1.Open    "SELECT * FROM Authors", "DSN=Pubs;uid=sa;pwd=;", _
            adopenStatic, adLockReadOnly, adCmdText
rs1.Save "c:\myfolder\mysubfolder\myrs.xml", adPersistXML
rs1.Save stm, adPersistXML
rs2.Open stm

シナリオ 2:

このシナリオでは、Recordset を XML 形式で Stream に保存します。次に、その Stream をユーザーが参照、操作、または表示できる文字列に読み込みます。

Dim rs As New ADODB.Recordset
Dim stm As New ADODB.Stream
Dim strRst As String

' Open, save, and close the recordset.
rs.Open "select * from Authors", "dsn=Pubs;uid=sa;pwd=;"
rs.Save stm, adPersistXML
rs.Close
Set rs = nothing

' Put saved recordset into a string variable.
strRst = stm.ReadText(adReadAll)

' Examine, manipulate, or display the XML data.
...

シナリオ 3:

この例では、Recordset を XML として直接 Response オブジェクトに保存する ASP コードを示します。

...
<%
response.ContentType = "text/xml"

' Create and open a recordset.
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "select * from Authors", "dsn=Pubs;uid=sa;pwd=;"

' Save recordset directly into output stream.
rs.Save Response, adPersistXML

' Close recordset
rs.Close
Set rs = nothing
%>
...

シナリオ 4:

このシナリオでは、ASP コードで、ATG 形式の Recordset の内容をクライアントに書き出します。Cursor Service で、このデータ使用して接続されていない Recordset を作成することができます。

RDS DataControl の新しいプロパティの URL は、Recordset を生成する .asp ページをポイントします。これは、サーバー側の DataFactory オブジェクトまたはユーザー作成のビジネス オブジェクトを使用する RDS なしで、Recordset を取得できるということを示しています。したがって、RDS プログラミング モデルが著しく簡単になります。

http://server/directory/recordset.asp という名前のサーバー側のコード

<%
Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "select au_fname, au_lname, phone from Authors", "dsn=Pubs"
response.ContentType = "multipart/mixed"
rs.Save response, adPersistADTG
%>

クライアント側のコード

<HTML>
<HEAD>
<TITLE>RDS Query Page</TITLE>
</HEAD>
<body>
<CENTER>
<H1>Remote Data Service 2.5</H1>
<TABLE DATASRC="#DC1">
    <TR>
        <TD><SPAN DATAFLD="au_fname"></SPAN></TD>
        <TD><SPAN DATAFLD="au_lname"></SPAN></TD>
        <TD><SPAN DATAFLD="phone"></SPAN></TD>
    </TR>
</TABLE>
<BR>

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=DC1 HEIGHT=1 WIDTH = 1>
    <PARAM NAME="URL" VALUE="http://server/directory/recordset.asp">
</OBJECT>

</SCRIPT>
</BODY>
</HTML>

必要に応じて、クライアントで Recordset オブジェクトを使用することもできます。

...
function GetRs()
    {
    rs = CreateObject("ADODB.Recordset");
    rs.Open "http://server/directory/recordset.asp"
    DC1.SourceRecordset = rs;
    }
...


OLE DB Provider for Internet Publishing を用いた ADO の使用

ADO の Record オブジェクトと Stream オブジェクトを Microsoft OLE DB Provider for Internet Publishing (インターネット公開プロバイダ) と共に使用して、Microsoft FrontPage® によって提供される Web フォルダまたはファイルにアクセスし、操作することができます。ADO を使用して、URL にする Record、Stream、または Recordset のソースを指定することができます。その後、リソースをアップロード、ダウンロード、移動、コピー、および削除したり、リソースのプロパティを直接操作することができるようになります。

インターネット公開プロバイダと共に Records と Streams を使用するコード例については、「インターネット公開のシナリオ」を参照してください。

インターネット公開プロバイダは、Microsoft® Windows® 2000 と共にインストールされます。インターネット公開プロバイダの初期のバージョンは、Microsoft® Office 2000 および Microsoft® Internet Explorer 5.0 でも使用できました。

ADO をインターネット公開プロバイダに接続するには、3 つの方法があります。

  • 接続文字列に "URL=" を指定します。次に例を示します。

    objConn.Open "URL=http://servername"

    •

  •
接続文字列の Provider キーワードに MSDAIPP.DSO を指定します。次に例を示します。

objConn.Open "provider=MSDAIPP.DSO;data source=http://servername"

    •

  •
Connection オブジェクトの Provider プロパティに MSDAIPP.DSO を指定します。次に例を示します。

objConn.Provider = "MSDAIPP.DSO"

objConn.Open "http://servername"

注意   Provider 接続文字列キーワードまたは Provider プロパティのどちらかでプロバイダの値として明示的に MSDAIPP.DSO が指定されると、接続文字列に "URL=" を使用することはできません。そのようにした場合は、エラーが発生します。したがって、上に示したように単純に URL を指定してください。

    •

インターネット公開プロバイダ特有の詳細な情報については、Microsoft OLE DB Provider for Internet Publishing、または OLE DB Provider for Internet Publishing が一緒にインストールされたソース アプリケーションである Windows 2000、Office 2000、または Internet Explorer 5.0 が提供しているプロバイダ マニュアルを参照してください。


インターネット公開のシナリオ

ここで示すコード例では、ADO を Microsoft OLE DB Provider for Internet Publishing と共に使用する方法を示します。このシナリオ内で、Recordset、Record、および Stream オブジェクトを使用して、インターネット公開プロバイダで公開されたリソースのコンテンツを表示する、Visual Basic のアプリケーションを作成します。

このシナリオを作成するためには次の手順が必要です。

  • 手順 1: Visual Basic プロジェクトのセットアップ

  • 手順 2: Main リスト ボックスの初期化

  • 手順 3: Fields リスト ボックスへのデータ設定

  • 手順 4: Details テキスト ボックスへのデータ設定

次へ 手順 1： Visual Basic プロジェクトのセットアップ


手順 1: Visual Basic プロジェクトのセットアップ

このシナリオでは、システムに Microsoft Visual Basic 6.0 以降、ADO 2.5 以降、および Microsoft OLE DB Provider for Internet Publishing がインストールされていることを前提としています。

ADO プロジェクトを作成するには

  1. Microsoft Visual Basic で、新規の標準 EXE プロジェクトを作成します。

  2. [プロジェクト] メニューの [参照設定] をクリックします。

  3. [Microsoft ActiveX Data Objects 2.5 Library] を選択して、[OK] をクリックします。

Main フォームにコントロールを挿入するには

  1. Form1 に ListBox コントロールを追加します。Name プロパティに lstMain を設定します。

  2. Form1 に 別の ListBox コントロールを追加します。Name プロパティに lstDetails を設定します。

  3. Form1 に TextBox コントロールを追加します。Name プロパティに txtDetails を設定します。

次へ 手順 2： Main リスト ボックスの初期化


手順 2: Main リスト ボックスの初期化

グローバルな Record オブジェクトと Recordset オブジェクトを宣言するには

  • Form1 の (General) (Declarations) に次のコードを挿入します。

    Option Explicit

    Dim grec As Record

    Dim grs As Recordset

このコードで、このシナリオの後で使用する Record と Recordset へのグローバル オブジェクトへの参照を宣言します。

    •

URL に接続し、lstMain にデータを設定するには

  •
Form1 の Form Load イベント ハンドラに次のコードを挿入します。

Private Sub Form_Load()

    Set grec = New Record

    Set grs = New Recordset

    grec.Open "", "URL=http://servername/foldername/", , _

        adOpenIfExists Or adCreateCollection

    Set grs = grec.GetChildren

    While Not grs.EOF

        lstMain.AddItem grs(0)

        grs.MoveNext

    Wend

End Sub

このコードで、グローバルな Record オブジェクトと Recordset オブジェクトのインスタンスが作成されます。Record の grec が、ActiveConnection として指定された URL で開かれます。URL が存在する場合は開かれます。存在しない場合は、作成されます。このコードの "http://servername/foldername/" の部分は、ユーザーの環境にある有効な URL で置き換える必要があることに注意してください。

Recordset の grec が、Record の grec の子のオブジェクトに対して開かれます。次に lstMain が、URL に名前が公開されたリソースのファイルが設定されます。

    •

次へ    手順 3： Fields リスト ボックスへのデータ設定


手順 3: Fields リスト ボックスへのデータ設定

Fields リスト ボックスにデータを設定するには

lstMain の Click イベント ハンドラに次のコードを挿入します。

Private Sub lstMain_Click()
    Dim rec As Record
    Dim rs As Recordset
    Set rec = New Record
    Set rs = New Recordset
    grs.MoveFirst
    grs.Move lstMain.ListIndex
    lstDetails.Clear
    rec.Open grs
    Select Case rec.RecordType
        Case adCollectionRecord:
            Set rs = rec.GetChildren
            While Not rs.EOF
                lstDetails.AddItem rs(0)
                rs.MoveNext
            Wend
        Case adSimpleRecord:
            recFields rec, lstDetails, txtDetails

        Case adStructDoc:
    End Select

End Sub

このコードで、ローカルの Record および Recordset オブジェクト （それぞれ、rec と rs) が宣言され、インスタンスが作成されます。

lstMain 内で選択されたリソースに対応する行が、grs のカレント行になります。次に Details リスト ボックスがクリアされ、ソースとして grs のカレント行を持った rec が開かれます。

リソースが RecordType で指定されているようにコレクション レコードである場合は、ローカル Recordset の rs が、rec の子オブジェクトに対して開かれます。次に、lstDetails に rs の行から値が入力されます。

リソースが単純レコードである場合は、recFields が呼び出されます。recFields の詳細については、次の手順を参照してください。

リソースが構造ドキュメントである場合は、コードは実装されません。

次へ 手順 4： Details テキスト ボックスへのデータ設定


手順 4: Details テキスト ボックスへのデータ設定

Details テキスト ボックスにデータを設定するには

recFields という Sub ルーチンを作成し、次のコードを挿入します。

Sub recFields(r As Record, l As ListBox, t As TextBox)
    Dim f As Field
    Dim s As Stream
    Set s = New Stream
    Dim str As String

    For Each f In r.Fields
        l.AddItem f.Name & ": " & f.Value
    Next
    t.Text = ""
    If r!RESOURCE_CONTENTCLASS = "text/plain" Then
        s.Open r, adModeRead, adOpenStreamFromRecord
        str = s.ReadText(1)
        s.Position = 0
        If Asc(Mid(str, 1, 1)) = 63 Then '//63 = "?"
            s.Charset = "ascii"
            s.Type = adTypeText
        End If
        t.Text = s.ReadText(adReadAll)
    End If
End Sub

このコードで、recFields に渡された単純レコードのフィールドと値を使用して、lstDetails にデータを設定します。リソースがテキスト ファイルである場合は、テキスト Stream がリソース レコードから開かれます。このコードで、文字セットが ASCII であるかどうかが判断され、Stream の内容が txtDetails にコピーされます。


_ADO イベント モデルと同期および非同期処理

ADO イベント モデルでは、操作が始まる前または完了した後にその事をアプリケーションに通知する "イベント" を発行する、同期または非同期の ADO 操作をいくつかサポートしています。イベントの実体は、アプリケーション内に定義されたイベント ハンドラ ルーチンへの呼び出しです。

操作が始まる前に呼び出されるイベント ハンドラでは、操作のパラメータを検査または変更することができ、操作を取り消すか実行するかを決めることができます。

操作が完了した後に呼び出されるイベント ハンドラは、ADO が非同期操作をサポートするので、特に重要です。たとえば、非同期の Recordset.Open 操作を開始するアプリケーションには、操作が完了すると、実行完了のイベントによって終了したことが通知されます。

ADO イベント モデルを使用するとアプリケーションに何らかの負荷がかかりますが、ループを使用してオブジェクトの State プロパティを監視するなどの非同期操作に関連するほかのメソッドに比べて、このモデルの方がはるかに柔軟性があります。

ADO 内のイベントの詳細については、次のトピックを参照してください。

  • ADO イベント ハンドラの概要

  • イベントの型

  • イベント パラメータ

  • 複数のイベント ハンドラの共同作業

  • ADO/WFC 内の ADO のイベント

  • 言語別の ADO イベントのインスタンス作成


ADO イベント ハンドラの概要

ADO のイベントは、2 つのファミリに分類されます。ConnectionEvent ファミリは Connection オブジェクトの操作に関係し、RecordsetEvent ファミリは Recordset オブジェクトの操作に関係します。

  • ConnectionEvents - 接続に関するトランザクションの開始、コミット、またはロール バック時、Command の実行時、ConnectionEvent 操作中のエラー発生時、および Connection の開始または終了時に、イベントが発行されます。

  • RecordsetEvents - Recordset オブジェクト内での移動、Recordset の行内のフィールドの変更、Recordset の行の変更、サーバー側のカーソルによる Recordset のオープン/クローズ、または Recordset 内で何らかの変更が行われた場合のほかに、非同期のフェッチ操作に関連してもイベントが発行されます。

ADO イベント ハンドラの概要

次の表は、イベントとその説明の一覧です。

ConnectionEvent | 説明
BeginTransComplete、 CommitTransComplete、 RollbackTransComplete | トランザクション管理 - 接続に関する現在のトランザクションが開始されたこと、コミットされたこと、またはロールバックされたことを示す通知。
WillConnect、ConnectComplete、Disconnect | 接続管理 - 現在の接続がこれから開始されること、開始されたこと、または終了したことを示す通知。
WillExecute、ExecuteComplete | コマンド実行管理 - 接続に関する現在のコマンドの実行がこれから開始されること、または終了したことを示す通知。
InfoMessage | 情報 - 現在の操作についての追加情報があることを示す通知。

RecordsetEvent | 説明
FetchProgress、FetchComplete | 取得状況 - データ取得操作の進捗状況または取得操作が終了したことを示す通知。
WillChangeField、FieldChangeComplete | フィールド変更管理 - 現在のフィールドの値がこれから変更されること、または変更されたことを示す通知。
WillMove、MoveComplete 、EndOfRecordset | 移動管理 - Recordset 内のカレント行位置がこれから変更されること、変更されたこと、または Recordset の最後に達したことを示す通知。
WillChangeRecord、RecordChangeComplete | 行変更管理 - Recordset のカレント行内のいずれかがこれから変更されること、または変更されたことを示す通知。
WillChangeRecordset、RecordsetChangeComplete | Recordset 変更管理 - 現在の Recordset 内のいずれかがこれから変更されること、または変更されたことを示す通知。


イベントの型

Will イベント

操作の開始前に呼び出されるイベント ハンドラによって、操作パラメータの検査または変更を行う機会がユーザーに与えられます。その操作を取り消すか、または実行するかを決めることができます。これらのイベント ハンドラ ルーチンの名前は、通常 WillEvent (Event = イベント名) の形式になっています。

Complete イベント

操作が完了した後に呼び出されるイベント ハンドラによって、アプリケーションに操作の完了を通知することができます。また、保留中の操作が Will イベント ハンドラによって取り消されたときには、このイベント ハンドラに通知できます。これらのイベント ハンドラ ルーチンの名前は、通常 EventComplete (Event = イベント名) の形式になっています。

Will および Complete イベントは、通常、組み合わせて使用されます。

その他のイベント

名前の形式が WillEvent または EventComplete のどちらでもないその他のイベント ハンドラは、操作が終了したときにのみ呼び出されます。


イベント パラメータ

すべてのイベント ハンドラには、イベント ハンドラを制御するステータス パラメータがあります。Complete イベントの多くには、イベントを発生させた操作が成功したかどうかを報告するエラー パラメータと、操作が適用される ADO オブジェクトを識別するためのオブジェクト パラメータが含まれています。(ExecuteComplete イベントには、このイベントに関連する Command、Recordset、および Connection オブジェクト用のオブジェクト パラメータが実際に含まれています。）

パラメータは、保留中の操作で使用される Will イベントにも渡されます。これによって、パラメータを検査し、その操作を完了すべきかどうかを決定する機会がユーザーに与えられます。

イベント ハンドラの中には、イベントが発生した理由についての追加情報を提供する、理由パラメータを備えたハンドラもあります。

ステータス パラメータ

イベント ハンドラ ルーチンが呼び出されると、ステータス パラメータが次の情報値のいずれか 1 つに設定されます。

値 | 説明
adStatusOK | イベントを発生させた操作が成功したことを示します。
adStatusErrorsOccurred | イベントを発生させた操作が失敗したこと、または Will イベントが操作を取り消したことを示します。詳細については、エラー パラメータを参照してください。
adStatusCantDeny | Will イベントは、これから発生する操作を取り消すことができません。

イベント ハンドラ ルーチンが返される前に、ステータス パラメータを変更しないでそのままにしておくか、次の要求値のいずれか 1 つに設定します。

値 | 説明
adStatusUnwantedEvent | イベント ハンドラがこれ以降の通知を受け入れないようにします。
adStatusCancel | これから実行する操作の取り消しを要求します。

イベント ハンドラが呼び出されたときのステータス パラメータは、イベント型によって次の値のいずれか 1 つになります。

イベント型 | 値
Will | adStatusOK、adStatusCantDeny
Complete | adStatusOK、adStatusErrorsOccurred

イベント ハンドラが返されたときのステータス パラメータは、イベント型によって次の値のいずれか 1 つになります。

イベント型 | 値
Will | adStatusOK、adStatusCancel、adStatusUnwantedEvent、adStatusCantDeny
Complete | adStatusOK、adStatusUnwantedEvent

エラー パラメータ

エラー パラメータは、ステータス パラメータが adStatusErrorsOccurred になっている場合に、操作が失敗した理由についての詳細な説明を含む ADO Error オブジェクトを参照します。

オブジェクト パラメータ

オブジェクト パラメータは、操作が適用される ADO オブジェクトを参照します。(ExecuteComplete イベントには、この操作に関連する Command、Recordset、および Connection オブジェクト用のオブジェクト パラメータが実際に含まれています。）

注意 オブジェクト パラメータは、Microsoft Visual Basic には適用されません。各オブジェクトに別々のイベント ハンドラを作成する必要があります。

理由パラメータ

理由パラメータ adReason は、イベントが発生した理由についての追加情報を提供します。adReason パラメータが指定されたイベントが同じ操作によって数回呼び出されているときは、毎回異なった理由で呼び出されている可能性があります。

たとえば、WillChangeRecord イベント ハンドラは、レコードの挿入、削除、または修正の実行または元の状態に戻す操作のために呼び出されます。adReason パラメータをフィルタとして使用すると、特定のイベントのみを処理することができます。

adStatus パラメータ内に adStatusUnwantedEvent を返して、adReason パラメータが指定されていないイベント ハンドラがイベント通知の受け取りを停止するように指定する必要があります。ただし、adReason パラメータが指定されたイベント ハンドラは、それぞれ異なった理由によって、何らかの通知を受け取ることができます。したがって、異なった理由によって発生した通知ごとに、adStatusUnwantedEvent を返す必要があります。

たとえば、Microsoft® Visual Basic® でコーディングされた WillChangeRecord イベント ハンドラを使用していると想定します。これ以降の通知を受け取らない場合は、次のようにコーディングします。

adStatus = adStatusUnwantedEvent

ただし、行をこれから削除するイベントは処理しても、それ以外の理由の通知は受け取らない場合は、次のようにコーディングします。

if (adReason = adRsnDelete)
' Process an event for this reason.
...
else
' Stop receiving events for any other reason.
adStatus = adStatusUnwantedEvent
...


複数のイベント ハンドラの共同作業

ConnectionEvent および RecordsetEvent ファミリのイベント ハンドラは、実際にイベントを使用するしないに関係なく、すべて実装しておく必要があります。実装に必要な作業量は、使用するプログラミング言語によって異なります。詳細については、「言語別 ADO イベントのインスタンス作成」を参照してください。

Will および Complete イベント ハンドラは、組み合わせて、または単独で使用できます。

対のイベント ハンドラ

  • Will イベントが成功すると、次のようになります。

    Recordset オブジェクトには、対になった WillChangeField と FieldChangeComplete イベントがあります。アプリケーション内で、フィールドの値を変更しようとしているとします。WillChangeField イベント ハンドラが呼び出されます。ユーザーは、フィールドの変更を許可する指示を返すことができます。操作が終了すると、FieldChangeComplete イベントは操作が終了したことをアプリケーションに通知します。イベント ハンドラのステータス パラメータが操作の成功を報告します。

  • Will イベントで操作を取り消すと、次のようになります。

    同じアプリケーション内で、別のフィールドを変更するとします。WillChangeField イベント ハンドラが呼び出されます。何らかの理由でそのフィールドの変更を取り消すことにし、ステータス パラメータに adStatusCancel を返します。結果として、操作は完了しません。

    FieldChangeComplete イベントによって、操作が終了したことがユーザーに通知されます。このイベント ハンドラのステータス パラメータは adStatusErrorsOccurred に設定されます。エラー パラメータは Error オブジェクトを参照します。また、Error オブジェクトの Number プロパティは、操作が取り消されたことを示す ADO またはプロバイダの値に設定されます。

  • 複数の Will および Complete イベント ハンドラを同じ操作のために呼び出すことができます。複数の Will イベントが成功すると、次のようになります。

    Recordset オブジェクトには、対になった WillChangeField と FieldChangeComplete、WillChangeRecord と RecordChangeComplete の各イベントがあります。最初に、フィールドの値を変更します。WillChangeField イベント ハンドラが呼び出されるので、フィールドの変更を許可する指示を返します。

    次に、WillChangeRecord イベント ハンドラが呼び出されるので、操作を完了するように再び指示します。

    注意 通常は、ADO オブジェクトの特定のインスタンスに関係するすべての Will イベント ハンドラが呼び出されます。ただし、その呼び出しに関して特に決まった順序はありません。

    操作が完了すると、FieldChangeComplete および RecordChangeComplete イベント ハンドラが呼び出されます。

  • 複数の Will および Complete イベント ハンドラを同じ操作のために呼び出すことができますが、そのうちの 1 つが保留中の操作を取り消すことがあります。複数の Will イベントのうち、最後のイベントが操作を取り消すと、次のようになります。

    繰り返しますが、Recordset には、対になった WillChangeField と FieldChangeComplete、WillChangeRecord と RecordChangeComplete の各イベントがあります。最初に、フィールドの値を変更します。WillChangeField イベント ハンドラが呼び出されるので、フィールドの変更を許可する指示を返します。

    次に、WillChangeRecord イベント ハンドラが呼び出されます。フィールド内でフィールドの変更が正常に行われても、レコード全体にエラーが発生することが考えられます。フィールドの変更を許可できないことを示すため、adStatusCancel を返します。WillChangeField イベント ハンドラは、既にその操作を許可しています。

    WillChangeRecord イベント ハンドラによって取り消されたため、操作は完了しません。ステータス パラメータが adStatusErrorsOccurred に設定された FieldChangeComplete イベント ハンドラが呼び出されます。これにより、エラー パラメータが適切に設定されます。

    次に、同じくステータス パラメータが adStatusErrorsOccurred に設定された RecordChangeComplete イベント ハンドラが呼び出されます。対応する Complete イベントが Will イベントのために呼び出されます。

  • 複数の Will および Complete イベント ハンドラを同じ操作のために呼び出すことができますが、そのうちの 1 つが保留中の操作を取り消すことがあります。複数の Will イベントのうち、最後以外のイベントが操作を取り消すと、次のようになります。

    繰り返しますが、Recordset には、対になった WillChangeField と FieldChangeComplete、WillChangeRecord と RecordChangeComplete の各イベントがあります。最初に、フィールドの値を変更します。WillChangeField イベントが呼び出されるので、フィールドの変更を許可しないように指示する adStatusCancel を返します。これにより、操作は完了しません。FieldChangeComplete イベントは、操作がステータスおよびエラー パラメータが適切に設定されて終了したことをユーザーに通知します。

    ただし、WillChangeRecord (したがって RecordChangeComplete も同様に) イベント ハンドラは呼び出されません。これは、最初の Will イベントが操作を取り消したためです。通常は、ある Will イベントが操作を取り消した場合には、それ以外の Will イベント ハンドラが呼び出されることはありません。

対でないイベント ハンドラ

イベントの通知については、ステータス パラメータに adStatusUnwantedEvent を返すことでオフにすることができます。たとえば、最初に Complete イベント ハンドラが呼び出されたときに、adStatusUnwantedEvent を返したと想定します。その場合、それ以降は Will イベントのみを受け取るようになります。

単一の Will イベント ハンドラは、操作に使用するパラメータの検証に便利です。このイベント ハンドラで、操作パラメータの変更または操作の取り消しを行うことができます。

もう 1 つの方法として、Complete イベントによる通知を有効のままにしておきます。最初の Will イベント ハンドラが呼び出されたときに、adStatusUnwantedEvent を返します。その場合、それ以降は Complete イベントのみを受け取るようになります。

単一の Complete イベント ハンドラは、非同期操作の管理に便利です。非同期操作には、それぞれ適切な Complete イベントが関連付けられています。

たとえば、非常に大きな Recordset オブジェクトにデータを格納するために長い時間がかかる可能性があります。アプリケーションが適切に作成されていれば、"Recordset.Open(...,adAsyncExecute)" 操作を開始し、ほかの処理を続けることができます。Recordset にデータが格納されるときになって初めて、ExecuteComplete イベントによってユーザーに通知されます。

単一のイベント ハンドラと複数のオブジェクト

Microsoft Visual C++ のような柔軟性のあるプログラミング言語では、複数のオブジェクトからのイベントを 1 つのイベント ハンドラで処理するようにコーディングすることができます。たとえば、複数の Connection オブジェクトからのイベントを 1 つの Disconnect イベント ハンドラで処理させることができます。接続の 1 つが終了した場合、Disconnect イベント ハンドラが呼び出されます。イベント ハンドラのオブジェクト パラメータが対応する Connection オブジェクトに設定されるため、どの接続がイベントを発生させたかを判別できるようになっています。

注意 この手法は Visual Basic では使用できません。Visual Basic では 1 つのオブジェクトに対して 1 つのイベントしか関連付けできないためです。

複数のイベント ハンドラと単一の操作

1 つの ADO オブジェクトとその操作を、複数のイベントに関連付けることができます。たとえば、複数の WillChangeField イベントを作成して、それぞれのイベントに特定のフィールド検証作業を実行させることができます。フィールドが変更される直前に、1 つの Will イベントがそのフィールドの値を検証し、続いて別の Will イベントが異なる角度から検証することができます。

ただし、単一のイベント ハンドラですべての編集作業を単純に実行する方が一般的です。


ADO/WFC 内の ADO のイベント

ADO for Windows Foundation Classes (ADO/WFC) は ADO イベント モデルを基にして構築された、簡略化されたアプリケーション プログラミング インターフェイスです。通常、ADO/WFC は ADO のイベントを中断してイベント パラメータを単一のイベント クラスに統合してから、イベント ハンドラを呼び出します。

ADO/WFC 内での ADO イベントの使用

  1. イベントを処理するため、独自のイベント ハンドラを定義します。たとえば、ConnectionEvent ファミリの ConnectComplete イベントを処理する場合、次のコードが使用できます。
    public void onConnectComplete(Object sender,ConnectionEvent e)
{
    System.out.println("onConnectComplete:" + e);
}
  2. 作成したイベント ハンドラを表す "ハンドラ" オブジェクトを定義します。ハンドラ オブジェクトには、ConnectionEvent 型のイベントには ConnectEventHandler のデータ型、RecordsetEvent 型のイベントには RecordsetEventHandler のデータ型を定義します。たとえば、ConnectComplete イベント ハンドラについては次のようにコーディングします。
        ConnectionEventHandler handler =
        new ConnectionEventHandler(this, "onConnectComplete");

    ConnectionEventHandler コンストラクタの最初の引数は、2 番目の引数で名前を付けられたイベント ハンドラを含むクラスを参照します。

    また、Microsoft Visual J++ コンパイラも、次の同等の構文をサポートします。

        ConnectionEventHandler handler =
        new ConnectionEventHandler(this.onConnectComplete);

    単一の引数は、目的のクラス (this) と、そのクラス内のメソッド (onConnectComplete) を参照します。

  3. 作成したイベント ハンドラを、特定の型のイベントを処理するためのハンドラの一覧に追加します。メソッドには addOn EventName(handler) の形式の名前を使用します。

  4. ADO/WFC はすべての ADO イベント ハンドラを内部的に実装します。そのため、Connection または Recordset 操作で発生したイベントは ADO/WFC イベント ハンドラによって中断されます。

    ADO/WFC イベント ハンドラは、ADO/WFC ConnectionEvent クラスのインスタンス内に ADO ConnectionEvent パラメータを、または ADO/WFC RecordsetEvent クラスのインスタンス内に ADO RecordsetEvent パラメータを渡します。これらの ADO/WFC クラスは ADO イベント パラメータを統合します。つまり、各 ADO/WFC クラスは、すべての ADO ConnectionEvent または RecordsetEvent メソッドの固有のパラメータそれぞれに対して、データ メンバを 1 つずつ持ちます。

  5. 次に、ADO/WFC はイベント ハンドラを ADO/WFC イベント オブジェクトと共に呼び出します。たとえば、onConnectComplete ハンドラには次のようなシグネチャがあると想定します。
        public void onConnectComplete(Object sender,ConnectionEvent e)

    最初の引数はイベントを送信したオブジェクトの型です (Connection または Recordset)。2 番目の引数は ADO/WFC イベント オブジェクトです (ConnectionEvent または RecordsetEvent)。

    作成したイベント ハンドラのシグネチャは、ADO イベントに比べて単純です。ただし、イベントに適用されるパラメータとその応答方法を知るには、ADO イベント モデルを理解しておく必要があります。

  6. ADO イベントのため、ADO/WFC ハンドラから作成したイベント ハンドラに戻ります。ADO/WFC が関係する ADO/WFC イベントのデータ メンバを ADO イベント パラメータにコピーすると、ADO イベント ハンドラに戻ります。

  7. 処理が完了したら、ADO/WFC イベント ハンドラの一覧から作成したハンドラを削除します。メソッドには removeOn EventName(handler) の形式の名前を使用してください。


言語別の ADO イベントのインスタンス作成

プログラミング言語によって、ADO イベントのインスタンスの作成方法が異なります。次の例はいずれも ConnectComplete イベント ハンドラを作成します。

Visual Basic

Visual Basic で ADO イベントのインスタンスを作成するには、2 つの方法があります。どちらの方法においても、WithEvents キーワードを使用して宣言されたオブジェクト変数が Class モジュールの一部であることと、オブジェクトがモジュール内のすべてのコードの管理下にある適用範囲を持っていることが必要です。最初のインスタンス内では、イベント オブジェクトおよびそのオブジェクトと連携させる別のオブジェクトを作成します。(Form オブジェクトは、Visual Basic では Class です。)

Dim WithEvents connEvent as Connection
Dim conn as New Connection

Private Sub MySub()
    set connEvent = conn        ' Enable event support.
    conn.Open(...)
    ...
    set connEvent = Nothing    ' Disable event support.
    ...
End Sub

Private Sub connEvent_ConnectComplete(ByVal err as ADODB.Error, & _
 adStatus as ADODB.EventStatus, ByVal pConnection as ADODB.Connection)
    ' Check the error object only if adStatus
    ' equals adStatusErrorsOccurred.
    ...
End Sub

2 番目のインスタンスでは、1 つのオブジェクトのみが使用されます。

Dim WithEvents conn as New Connection

Private Sub MySub()
    conn.Open(...)
    ...
    set conn = Nothing    ' Disable event support.
    ...
End Sub

Private Sub conn_ConnectComplete(ByVal err as ADODB.Error, & _
 adStatus as ADODB.EventStatus, ByVal pConnection as ADODB.Connection)
    ' Check the error object only if adStatus
    ' equals adStatusErrorsOccurred.
    ...
End Sub

Visual C++

これは、Visual C++ での ADO イベントのインスタンス作成の方法を示す概略的な説明です。詳細については、「ADO イベント モデルの例 (VC++)」を参照してください。

ファイル adoint.h 内の ConnectionEventsVt および RecordsetEventsVt インターフェイスから派生したクラスを作成します。

class CConnEvent : public ConnectionEventsVt
{
    public:
    STDMETHODIMP InfoMessage(
            ADOError *pError,
            EventStatusEnum *adStatus,
            _ADOConnection *pConnection);
...
}

class CRstEvent : public RecordsetEventsVt
{
    public:
        STDMETHODIMP WillChangeField(
                LONG cFields,
                VARIANT Fields,
                EventStatusEnum *adStatus,
                _ADORecordset *pRecordset);
...
}

これらのイベント ハンドラ メソッドをそれぞれ、両方のクラスに実装します。それぞれのメソッドは単に S_OK の HRESULT を返すだけで十分です。ただし、イベント ハンドラが使用可能であることをメソッドに知らせると、既定ではこれらが連続して呼び出されます。代わりに、adStatus を adStatusUnwantedEvent に設定して、初回以降の通知を要求しないようにすることができます。

STDMETHODIMP CConnEvent::ConnectComplete(
            ADOError *pError,
            EventStatusEnum *adStatus,
            _ADOConnection *pConnection)
        {
        *adStatus = adStatusUnwantedEvent;
        return S_OK;
        }

イベント クラスは IUnknown から継承されるので、QueryInterface、AddRef、および Release メソッドも実装する必要があります。クラス コンストラクタおよびデストラクタも実装します。この部分のタスクを簡略化する最も使いやすい Visual C++ ツールを選んでください。

Recordset および Connection オブジェクトで、QueryInterface を IConnectionPointContainer および IConnectionPoint インターフェイスに対して発行して、イベント ハンドラが使用可能であることを通知します。次に、各クラスに IConnectionPoint::Advise を発行します。

たとえば、イベント ハンドラが使用できることを Recordset オブジェクトに通知することに成功した場合に True を返すブール型 (Boolean) 関数を使用していると想定します。

HRESULT    hr;
DWORD      dwEvtClass;
IConnectionPointContainer    *pCPC = NULL;
IConnectionPoint             *pCP = NULL;
CRstEvent                    *pRStEvent = NULL;
...
_RecordsetPtr                pRs;
pRs.CreateInstance(__uuidof(Recordset));
pRStEvent = new CRstEvent();
if (pRStEvent == NULL) return FALSE;
...
hr = pRs->QueryInterface(IID_IConnectionPointContainer, &pCPC);
if (FAILED(hr)) return FALSE;
hr = pCPC->FindConnectionPoint(IID_ADORecordsetEvents, &pCP);
pCPC->Release();    // Always Release now, even before checking.
if (FAILED(hr)) return FALSE;
hr = pCP->Advise(pRstEvent, &dwEvtClass);    //Turn on event support.
pCP->Release();
if (FAILED(hr)) return FALSE;
...
return TRUE;
...

この時点では、RecordsetEvent ファミリのイベントは有効状態になっていて、Recordset イベントが発生すると作成したメソッドが呼び出されます。

その後イベント ハンドラを無効状態にするときは、再び接続ポイントを取得し、IConnectionPoint::Unadvise メソッドを発行します。

...
hr = pCP->UnAdvise(dwEvtClass);    //Turn off event support.
pCP->Release();
if (FAILED(hr)) return FALSE;
...

インターフェイスの解放とクラス オブジェクトの破棄は、適切に行う必要があります。

Visual J++

import wfc.data.*;
public class MyClass
{
ConnectionEventHandler handler =
    new ConnectionEventHandler(this,"onConnectComplete");

    public void onConnectComplete(Object sender,ConnectionEvent e)
    {
        if (e.adStatus == AdoEnums.EventStatus.ERRORSOCCURRED)
            System.out.println("Connection failed");
        else
            System.out.println("Connection completed");
        return;
    }

    void main( void )
    {
        Connection conn = new Connection();

        conn.addOnConnectComplete(handler);     // Enable event support.
        conn.open("DSN=Pubs");
        conn.close();
        conn.removeOnConnectComplete(handler);  // Disable event support.
    }
}

Microsoft Visual Basic, Scripting Edition

VBScript はイベントをサポートしていません。


データ シェイプ

"データ シェイプ" は、データ ソースにクエリを実行して、2 つ以上の論理エンティティ間の親子関係 (階層) を表す Recordset を取得する手段です。階層関係に関する従来からある例の 1 つは、顧客と注文の関係です。データベース内の顧客ごとに、0 ～ 複数個の注文があります。正規の SQL には JOIN 構文を使用したデータ取得の方法がありますが、この方法は、指定された親子関係に対して返された各レコード内で冗長な親データが反復されるため、非効率的であり、結果は扱いにくい大きさになります。データ シェイプでは、親レコードセット内の単一親レコードを子レコードセット内の複数の子レコードに関連付けることで、JOIN の冗長性を避けることができます。

データ シェイプの構文には、ほかの機能もあります。親および子レコードセットのフィールドを記述する際に NEW キーワードを使用すると、基になるデータ ソースなしで新しい Recordset オブジェクトを作成することができます。この新しい Recordset オブジェクトに、データを入力し、永続して格納することができます。また、子フィールドでさまざまな計算または集計操作 (SUM、AVG、MAX など) を実行して、グループ化された子レコードから親の列の値を導き出すことで、親レコードセットを作成することができます。

データ シェイプの詳細については、次のトピックを参照してください。

  • データ シェイプの概要

  • データ シェイプに必要なプロバイダ

  • 一般的な Shape コマンド

  • Shape APPEND 句

  • Shape COMPUTE 句

  • 階層 Recordset の組み立て

  • 階層 Recordset 内の行へのアクセス

  • 正式な Shape 文法

  • Visual Basic for Applications の関数


データ シェイプの概要

次に、データ シェイプの概念、階層レコードセット、リシェイプ、孫の集計操作、および Shape コマンド構文について説明します。

データ シェイプ

データ シェイプでは、シェイプされた Recordset の列、列で示されるエンティティ間の関係、および Recordset にデータが入力される方法を定義することができます。

シェイプされた Recordset の列には、SQL Server などのデータ プロバイダからのデータ、別の Recordset への参照、Recordset の 1 つの行での計算から導き出される値、Recordset 全体にわたる 1 つの列に対する操作から導き出される値などを含めることができます。また、新規に作成された空の列も含めることができます。

ほかの Recordset への参照を含んでいる列の値を取得すると、ADO は関連付けられた実際の Recordset を自動的に返します。ほかの Recordset を含んでいる Recordset を、階層 Recordset と呼びます。階層 Recordset で、レコードセットを含んでいる "親" と、レコードセットに含まれる "子" の "親子" 関係を表します。Recordset への参照は、実際には "チャプタ" と呼ばれる子の部分集合への参照です。1 つの親が、複数の子 Recordset を参照することができます。

Shape コマンド構文によって、シェイプされた Recordset をプログラム的に作成できます。その後、プログラムから、または適切なビジュアル コントロールによって、Recordset のコンポーネントにアクセスできます。Shape コマンドは、ほかの ADO コマンド文字列と同じように発行されます。

Shape コマンド構文を使用して、2 とおりの方法で階層 Recordset オブジェクトを作成することができます。1 つは、子 Recordset を親 Recordset に追加する方法です。親と子には、少なくとも 1 つの共通の列が必要です。この共通の列では、親の行の列値と、子のすべての行の列値が同じです。

もう 1 つは、子 Recordset から親 Recordset を生成する方法です。親 Recordset には、子 Recordset を参照しているチャプタ列が必要です。親のほかの列は、子の列に対する集計操作、Recordset の 1 つの行に対する式の計算、BY キーワードを使用してグループ化する列の指定、または新しい空の列の追加によって、作成することができます。

子 Recordset のさらに子 Recordset を作成することを繰り返して、任意の深さまで階層 Recordset オブジェクトをネスト (入れ子に) することができます。

シェイプされた Recordset の各コンポーネントには、プログラムから、または適切なビジュアル コントロールによってアクセスできます。

Microsoft® は Shape コマンドを生成するビジュアル ツールと、階層カーソルを表示するビジュアル ツールを提供しています。各ビジュアル ツールについては、Visual Basic® のマニュアル「The Data Environment Designer」と、「Using the Microsoft Hierarchical FlexGrid Control」を参照してください。

リシェイプ

Shape コマンド句によって作成された Recordset には、通常は AS キーワードを使って "エイリアス" を与えることができます。シェイプされた Recordset のエイリアスを、まったく異なったコマンドで参照することができます。つまり、新しい Shape コマンド内で、以前シェイプされた Recordset を再使用、つまり "リシェイプ" することができます。この機能をサポートするために、ADO には、Reshape Name プロパティがあります。

リシェイプ機能には、主要な 2 つの関数があります。1 つは、既存の Recordset を新しい親 Recordset に関連付ける関数です。

例

. . .
rs1.Open "SHAPE {select * from Customers} " & _
            "APPEND ({select * from Orders} AS chapOrders " & _
            "RELATE CustomerID to CustomerID)", cn

rs2.Open "SHAPE {select * from Employees} " & _
            "APPEND (chapOrders RELATE EmployeeID to EmployeeID)", cn
. . .

もう 1 つは、"SHAPE <レコードセットのリシェイプ名>" の構文を使用して、既存の子 Recordset オプジェクトへのチャプタ化されていないアクセスを可能にする関数です。

注意 既存の Recordset に列を追加したり、パラメータ化された Recordset または挿入 COMPUTE 句内の Recordset オブジェクトをリシェイプしたり、リシェイプされる Recordset からの子孫の Recordset に集計操作を実行することはできません。リシェイプされる Recordset と新規の Shape コマンドの両方とも、同じ Connection を使う必要があります。

孫の集計

Shape コマンド句に作成されるチャプタ列には、通常は AS キーワードを使って、"チャプタ エイリアス名" を指定することができます。対象となる列を含んだ子を識別する完全修飾名で、シェイプされた Recordset のチャプタ内にあるどの列でも識別することができます。たとえば、親チャプタの chap1 が子チャプタの chap2 を含み、chap2 に総計列の amt がある場合、完全修飾名は、chap1.chap2.amt になります。この修飾名を、集計関数 (SUM、AVG、MAX、MIN、COUNT、STDEV、または ANY) への引数として使うことができます。

挿入 COMPUTE コマンドによるパラメータ化コマンド

典型的なパラメータ化された Shape APPEND コマンドには、クエリ コマンドで親 Recordset を作成する句と、パラメータ化されたクエリ コマンド、つまりパラメータのプレースホルダ (疑問符の "?") を含むコマンドで子 Recordset を作成する句があります。そのため、シェイプされた Recordset には、上位レベルに親、下位レベルに子の、2 つのレベルがあります。

子 Recordset を作成する句には、最も深くネストされた部分にパラメータ化されたクエリを含めることで、ネストされた Shape COMPUTE コマンドをいくつでも含めることができます。その結果、シェイプされた Recordset には複数のレベルができます。上位レベルには指定しただけの親ができ、下位レベルには指定しただけの子ができ、Shape COMPUTE コマンドによって生成された Recordsets の数だけ、挿入レベルができます。

この機能の典型的な使用例は、集計関数および Shape COMPUTE コマンドのグループ化機能を呼び出して、子 Recordset についての分析情報を保有する挿入 Recordset オブジェクトを作成することです。また、これはパラメータ化された Shape コマンドなので、親のチャプタ列にアクセスするたびに、新しい子 Recordset が取得されます。挿入レベルは子から導出されるので、再計算することができるようになります。

永続的な階層 Recordset

Save メソッドを呼び出して、ADTG または XML 形式のどちらかのファイルに、階層 Recordset を保存することができます。ただし、XML 形式のファイルに階層 Recordset を保存する場合には、2 つの制限事項があります。階層 Recordset に保留中の更新が含まれている場合は、XML 形式で保存できません。また、パラメータ化された階層 Recordset は保存できません。

データ シェイプ プロバイダについての詳細は、「Microsoft Data Shaping Service for OLE DB」(ADO) および「Data Shaping Service for OLE DB」を参照してください。


データ シェイプに必要なプロバイダ

データ シェイプには、通常 2 つのプロバイダが必要です。サービス プロバイダの Data Shaping Service for OLE DB はデータ シェイプ機能を提供し、OLE DB Provider for SQL Server などのデータ プロバイダはシェイプされた Recordset に入力するデータ行を供給します。

サービス プロバイダの名前は、Connection オブジェクトの Provider プロパティの値、または接続文字列のキーワード "Provider=" の値として指定することができます。

データ プロバイダの名前は、Data Shaping Service for OLE DB によって Connection オブジェクトの Properties コレクションに追加されるダイナミック プロパティ "Data Provider" の値か、接続文字列のキーワード "Data Provider=" の値として指定することができます。

たとえば、NEW キーワードで列が作成された Recordset のように、Recordset にデータが入力されない場合は、データ プロバイダは必要ありません。その場合は、"Data Provider=none" と指定します。

例

Dim cnn As New ADODB.Connection
cnn.Provider = "MSDataShape"
cnn.Open "Data Provider=MSDASQL;DSN=vfox;uid=sa;pwd=vfox;database=Pubs”


一般的な Shape コマンド

データ シェイプで、シェイプされた Recordset の列、列で示されるエンティティ間の関係、および Recordset にデータが入力される方法を定義します。

シェイプされた Recordset は、次のような種類の列で構成されます。

列の種類 | 説明
データ | データ プロバイダ、テーブル、または前にシェイプされた Recordset へのクエリ コマンドによって返された Recordset のフィールド。
チャプタ | "チャプタ (chapter)" と呼ばれる、別の Recordset への参照。チャプタ列を使うと、"親子" 関係を定義することができます。"親" はチャプタ列を含む Recordset、"子" はチャプタで表される Recordset になります。
集計 | 列の値は、子 Recordset のすべての行、またはすべての行を含んだ 1 つの列に "集計関数" を実行することで算出されます (次の表の集計関数を参照してください)。
計算式 | 列の値は、Recordset の同じ行にある複数の列に VBA (Visual Basic for Applications) 式を実行することで算出されます。式は、CALC 関数への引数です (次の表の計算式、および「Visual Basic for Applications の関数」を参照してください)。
新規 | 後からデータを入力することができる空のフィールド。この列は、NEW キーワードで定義されます (次の表の NEW キーワードを参照してください)。

Shape コマンドには、Recordset オブジェクトを返すデータ プロバイダへのクエリ コマンドを指定するための句を含めることができます。クエリの構文は、基になるデータ プロバイダの要件によって異なります。ADO では、特定のクエリ言語を使う必要はありませんが、通常は SQL (Structured Query Language) を使います。

2 つのテーブルを関連付けるために SQL の JOIN 句を使うことができますが、階層 Recordset を使うと、さらに効率的に情報を表すことができます。JOIN で作成された Recordset の各行には、テーブルから引き出した情報が繰り返し入力されます。階層 Recordset では、複数の子 Recordset オブジェクトのそれぞれに対して、1 つだけ親 Recordset が存在します。

Shape コマンドは、Recordset オブジェクトによって、または Command オブジェクトの CommandText プロパティを設定して Execute メソッドを呼び出すことによって、発行することができます。

Shape コマンドは、ネストすることができます。つまり、parent-command または child-command 自体を別の Shape コマンドにすることができます。

階層 Recordset 内の移動については、「階層 Recordset 内の行へのアクセス」を参照してください。

Shape コマンドの正しい構文については、「正式な Shape 文法」を参照してください。

集計関数、CALC 関数、NEW キーワード

データ シェイプは次の関数をサポートしています。操作される列を含むチャプタに割り当てる名前は、chapter-alias です。

column-alias は、column-name を含むチャプタを示す、各チャプタ列の名前をピリオド (.) で区切った、完全修飾名にすることができます。たとえば、親チャプタの chap1 が子チャプタの chap2 を含み、chap2 に総計列である amt がある場合、完全修飾名は、chap1.chap2.amt になります。

集計関数 | 説明
SUM(chapter-alias.column-name) | 指定された列のすべての値の合計を計算します。
AVG(chapter-alias.column-name) | 指定された列のすべての値の平均を計算します。
MAX(chapter-alias.column-name) | 指定された列の最大値を計算します。
MIN(chapter-alias.column-name) | 指定された列の最小値を計算します。
COUNT(chapter-alias[.column-name]) | 指定されたエイリアスまたは列の行数を数えます。
STDEV(chapter-alias.column-name) | 指定された列の標準偏差を計算します。
ANY(chapter-alias.column-name) | 列の値がすべての行で同じである、列の値です。

計算式 | 説明
CALC(expression) | 任意の式で計算しますが、CALC 関数を含む Recordset の列でのみ使用できます。Visual Basic for Applications の関数を使用した式を使うことができます。

NEW キーワード | 説明
NEW field-type [(width | scale | precision | error [, scale | error])] | 指定された型の空白の列を Recordset に追加します。

NEW キーワード付きで渡される field-type は、次のデータ型のどちらかにすることができます。

OLE DB のデータ型 | 同等の ADO のデータ型
DBTYPE_BSTR | adBSTR
DBTYPE_BOOL | adBoolean
DBTYPE_DECIMAL | adDecimal
DBTYPE_UI1 | adUnsignedTinyInt
DBTYPE_I1 | adTinyInt
DBTYPE_UI2 | adUnsignedSmallInt
DBTYPE_UI4 | adUnsignedInt
DBTYPE_I8 | adBigInt
DBTYPE_UI8 | adUnsignedBigInt
DBTYPE_GUID | adGuid
DBTYPE_BYTES | adBinary、AdVarBinary、adLongVarBinary
DBTYPE_STR | adChar、adVarChar、adLongVarChar
DBTYPE_WSTR | adWChar、adVarWChar、adLongVarWChar
DBTYPE_NUMERIC | adNumeric
DBTYPE_DBDATE | adDBDate
DBTYPE_DBTIME | adDBTime
DBTYPE_DBTIMESTAMP | adDBTimeStamp
DBTYPE_VARNUMERIC | adVarNumeric
DBTYPE_FILETIME | adFileTime
DBTYPE_ERROR | adError

新しいフィールドのデータ型が 10 進数の場合 (OLE DB では DBTYPE_DECIMAL、ADO では adDecimal) は、精度と位取りの値を指定する必要があります。

基になるデータ プロバイダへのコマンドの発行

SHAPE で始まらないすべてのコマンドは、データ プロバイダに渡されます。これは、"SHAPE {プロバイダ コマンド}" の形式の Shape コマンドを発行することと同じです。このようなコマンドで Recordset を作成する必要はありません。たとえば、"SHAPE {DROP TABLE MyTable}" は、データ プロバイダが "DROP TABLE" をサポートすることを想定した、完全に有効な Shape コマンドです。

この機能によって、通常のプロバイダ コマンドと Shape コマンドの両方が同じ接続とトランザクションを共有することができます。


Shape APPEND 句

Shape コマンドの APPEND 句で、列 (複数も可) を Recordset に追加します。ほとんどの場合、追加する列は、子 Recordset を参照するチャプタ列です。

構文

SHAPE [parent-command [[AS] parent-alias]]

APPEND ( column-list [ [[AS] child-alias]

[RELATE parent-column TO child-column], ... ] )

[[AS] chapter-alias]

[, ... ]

要素の説明

かっこ ("()") は必須のキーワードです。このかっこで、プロバイダ コマンドによって返された親 Recordset にチャプタ列が追加されます。

この句の要素には、次のものがあります。

parent-command

次のうちの 1 つです。または、parent-command をまったく指定しなくてもかまいません。

  • Recordset オブジェクトを返す波かっこ ("{}") で囲まれたプロバイダ コマンド。このコマンドは基になるデータ プロバイダに対して発行されるので、構文はプロバイダの要件によって異なります。ADO では、特定のクエリ言語を必要としませんが、通常は SQL 言語を使います。

  • かっこで囲まれた別の Shape コマンド。

  • TABLE キーワード。テーブル名がその後に続きます。

parent-alias

親 Recordset を参照するオプションのエイリアス。

column-list

次のうちの 1 つ以上です。

  • かっこで示すチャプタ列。通常は波かっこ ("{}") でプロバイダ コマンドを囲みます。

  • 前にシェイプされた既存の Recordset 名。

  • かっこで囲まれた別の Shape コマンド。

  • TABLE キーワード。テーブル名がその後に続きます。

  • 集計列。

  • 計算列。

  • NEW 句で作成された新しい列。

child-alias

子 Recordset を参照するエイリアス。

parent-column

parent-command で返される Recordset 内の列。

child-column

child-command で返される Recordset 内の列。

chapter-alias

親へ追加されたチャプタ列を参照するエイリアス。

...

"parent-column TO child-column" 句は、実際には、定義されたそれぞれの関係がカンマで区切られた一覧です。

...

APPEND キーワードの後の句は、実際には各句がカンマで区切られた一覧であり、親へ追加される別の列が定義されます。

非パラメータ化コマンドの操作

parent-command がある場合はそれが発行され、親 Recordset が返されます。次に child-command が発行され、子 Recordset が返されます。

たとえば、parent-command で Customers テーブルからある会社の顧客の Recordset を取得し、child-command で Orders テーブルから顧客全員の注文の Recordset を取得することができます。

SHAPE {SELECT * FROM Customers}
   APPEND ({SELECT * FROM Orders} AS chapOrders
   RELATE customerID TO customerID)

パラメータ化されていない親子関係の場合、親と子の Recordset オブジェクトは、共通の列を持っていて互いに関連付けられている必要があります。このような列は、最初に parent-column、次に child-column という順序で、RELATE 句に指定します。それぞれの列は、対応する Recordset オブジェクト内で別の名前にすることができますが、意味のある関係を指定するために、同じ情報を参照させる必要があります。たとえば、Customers および Orders Recordset オブジェクトの両方に、customerID フィールドを持たせることができます。

データ シェイプによって、チャプタ列が親 Recordset に追加されます。チャプタ列の値は、RELATE 句の条件を満たしている、子 Recordset の行への参照です。つまり、指定された親行の parent-column にある値と、子チャプタのすべての行の child-column にある値は、同じです。複数の TO 句が同じ RELATE 句で使用された場合は、AND 演算子によって暗黙的に結合されます。

チャプタ列の参照にアクセスした場合、ADO は参照によって表された Recordset を自動的に取得します。パラメータ化されていないコマンドでは、子 Recordset 全体が取得されても、"チャプタ" は行の部分集合を表すだけであることに注意してください。

追加された列に chapter-alias がない場合、自動的に名前が作成されます。列に対応する Field オブジェクトは Recordset オブジェクトの Fields コレクションに追加され、データ型が adChapter になります。

階層 Recordset 内の移動については、「階層 Recordset 内の行へのアクセス」を参照してください。

パラメータ化コマンドの操作

大きな子 Recordset を処理する場合、特に、親 Recordset のサイズと比べて大きいにもかかわらず、わずかな子チャプタにアクセスするだけの場合は、パラメータ化コマンドを使用する方が効率的です。

"非パラメータ化コマンド" では、親および子 Recordsets の全部を取得し、チャプタ列を親に追加してから、親の行それぞれに対して関連する子チャプタへの参照を割り当てます。

"パラメータ化コマンド" では、親 Recordset 全体を取得しますが、チャプタ列にアクセスするときにのみチャプタの Recordset を取得します。この取得方法の違いが、パフォーマンスに大きく影響します。

たとえば、次のように指定することができます。

SHAPE {SELECT * FROM customer}
   APPEND ({SELECT * FROM orders WHERE cust_id = ?}
   RELATE cust_id TO PARAMETER 0)

親テーブルと子テーブルに、共通の列名の cust_id があります。child-command には、RELATE 句の参照先 ("...PARAMETER 0") へのプレースホルダ (?) が指定されています。

注意 PARAMETER 句は、Shape コマンドの構文にのみ関係があります。ADO の Parameter オブジェクトまたは Parameters コレクションのどちらにも関連付けられません。

パラメータ化された Shape コマンドが実行されると、次のようになります。

  1. parent-command が実行され、customer テーブルから親 Recordset が返されます。

  2. チャプタ列が親 Recordset に追加されます。

  3. 親行のチャプタ列がアクセスされると、customer.cust_id 列の値が orders.cust_id のプレースホルダと置き換えられ、child-command が実行されます。

  4. Orders テーブルから、orders.cust_id 列の値と customer.cust_id 列の値が一致するすべての行が取得されます。既定の動作では、親 Recordset へのすべての参照が解除されるまで、子 Recordset はクライアントのキャッシュに入れられます。この動作を変更するには、Recordset のダイナミック プロパティである Cache Child Rows を False に設定します。

  5. 取得された子の列への参照 (つまり、子 Recordset の "チャプタ") が、親 Recordset のカレント行のチャプタ列に置かれます。

  6. 別の行のチャプタ列がアクセスされると、手順 3. ～ 5. が繰り返されます。

既定では、Cache Child Rows ダイナミック プロパティは True に設定されています。キャッシングの動作は、クエリのパラメータ値によって変化します。単一パラメータが指定されたクエリの場合、指定されたパラメータ値に対応する子のレコードセットは、その値を持つ子に対する次の要求があるまで、キャッシュに入れられます。次のコードは、このことを示しています。

...
SCmd = "SHAPE {select * from customer} " & _
         "APPEND({select * from orders where cust_id = ?} " & _
         "RELATE cust_id TO PARAMETER 0) AS chpCustOrder"
Rst1.Open sCmd, Cnn1
Set RstChild = Rst1("chpCustOrder").Value
Rst1.MoveNext      ' Next cust_id passed to Param 0, & new rs fetched
                   ' into RstChild.
Rst1.MovePrev      ' RstChild now holds cached rs, saving round trip.
...

2 つ以上のパラメータが指定されたクエリの場合は、すべてのパラメータ値がキャッシュに入れられた値と等しいときにのみ、キャッシュに入れられた子が使用されます。

混合型コマンド

混合型コマンドとは、部分的にパラメータ化されたコマンドです。次に例を示します。

SHAPE {select * from plants}
   APPEND( {select * from customers where country = ?}
           RELATE PlantCountry TO PARAMETER 0,
             PlantRegion TO CustomerRegion )

混合型コマンドのキャッシング動作は、通常のパラメータ化コマンドの場合と同じです。

挿入 Shape COMPUTE 句

次の例のように、Shape COMPUTE コマンドが任意の数だけネストされた中に、パラメータ化された Shape コマンドのパラメータ化コマンドを埋め込むことができます。

SHAPE {select au_lname, state from authors} APPEND
   ((SHAPE
      (SHAPE
         {select * from authors where state = ?} rs
      COMPUTE rs, ANY(rs.state) state, ANY(rs.au_lname) au_lname
      BY au_id) rs2
   COMPUTE rs2, ANY(rs2.state) BY au_lname)
RELATE state TO PARAMETER 0)


Shape COMPUTE 句

Shape COMPUTE 句で、親 Recordset が生成されます。その列は、子 Recordset への参照で構成されます。オプションで、列の内容をチャプタ、新規、または計算結果にしたり、子の Recordset で集計関数を実行した結果または前にシェイプされた Recordset にすることができます。また、オプションの BY 句で指定された子 Recordset からの任意の列にすることができます。

構文

SHAPE child-command [AS] child-alias

COMPUTE child-alias [[AS] name], [appended-column-list]

[BY grp-field-list]

要素の説明

この句の要素は次の通りです。

child-command

次の 1 つから構成されます。

  • 子の Recordset オブジェクトを返す波かっこ ({}) で囲まれたクエリ コマンド。このコマンドは基になるデータ プロバイダに対して発行されるので、構文はプロバイダの要件によって異なります。ADO では、特定のクエリ言語を必要としませんが、通常は SQL 言語を使います。

  • 前にシェイプされた既存の Recordset 名。

  • 別の Shape コマンド。

  • TABLE キーワード。テーブル名がその後に続きます。

child-alias

child-command によって返される Recordset を参照するために使用されるエイリアス。child-alias は、COMPUTE 句の列の一覧に必須です。また、親と子の Recordset オブジェクトの関係を定義します。

appended-column-list

各要素が生成された親オブジェクト内の列を定義する一覧。各要素には、チャプタ列、新規の列、計算列、または子 Recordset で実行された集計関数の結果の値のどちらかが含まれます。

grp-field-list

親および子の Recordset オブジェクト内の列の一覧。子 Recordset内で行をどのようにグループ化するかを指定します。

grp-field-list 内のそれぞれの列に対して、親および子の Recordset オブジェクトには対応する列があります。親 Recordset のそれぞれの行に対して、grp-field-list の列には一意の値が含まれています。親の行によって参照される子 Recordset は、grp-field-list の列の値が親の行と同じである子の行のみから構成されます。

COMPUTE 句に BY 句がない場合は、子 Recordset 全体の集計値を含む単一の親行が存在します。BY 句がある場合は、複数の親行があり、それぞれ子 Recordset の参照および集計値が含まれている可能性があります。

操作

child-command がプロバイダに発行され、プロバイダは子 Recordset を返します。

COMPUTE 句で、子 Recordset への参照、1 つ以上の集計、計算式、または新規の列である親 Recordset を指定します。BY 句がある場合、定義する列も親 Recordset に追加されます。BY 句で、子 Recordset の行をグループ化する方法を指定します。

たとえば、State (州)、City (都市)、Population (人口) のフィールドで構成される、Demographics テーブルがあると想定します (人口の値は一例です)。

State | City | Population
WA | Seattle | 700,000
OR | Medford | 200,000
OR | Portland | 600,000
CA | Los Angeles | 900,000
CA | San Diego | 400,000
WA | Tacoma | 500,000
OR | Corvallis | 300,000

ここで、次の Shape コマンドを発行します。

rst.Open  "SHAPE {select * from demographics} AS rs "  & _
          "COMPUTE rs, SUM(rs.population) BY state", _
           objConnection

このコマンドは、シェイプされた Recordset を 2 つのレベルで開きます。親レベルは、集計列 (SUM(rs.population))、子 Recordset (rs) の参照列、および子 Recordset (state) をグループ化した列を伴って生成された Recordset です。子レベルは、クエリ コマンド (select * from demographics) によって返された Recordset です。

子 Recordset の詳細行は State (州) でグループ化されますが、特に決まった整列の順番はありません。つまり、グループはアルファベット順または数字順に並ぶわけではありません。

これで、開かれている親 Recordset 内を移動し、子の詳細 Recordset オブジェクトにアクセスできるようになります。「階層 Recordset 内の行へのアクセス」を参照してください。

親および子の詳細 Recordset の結果

親

SUM (rs.Population) | rs | State
1,300,000 | child1 への参照 | CA
1,200,000 | child2 への参照 | WA
1,100,000 | child3 への参照 | OR

Child1

State | City | Population
CA | Los Angeles | 900,000
CA | San Diego | 400,000

Child2

State | City | Population
WA | Seattle | 700,000
WA | Tacoma | 500,000

Child3

State | City | Population
OR | Medford | 200,000
OR | Portland | 600,000
OR | Corvallis | 300,000


階層 Recordset の組み立て

次の例では、データ シェイプの文法を使用して親、子、および孫のレコードセットの列を定義することによって、基になるデータ ソースなしに階層 Recordset を組み立てる方法を示します。

階層 Recordset を組み立てるには、Connection オブジェクトの Open メソッドの接続文字列パラメータで、Provider の値に Microsoft Data Shaping Service for OLE DB (MSDataShape) を指定し、Data Provider の値に "NONE" を指定する必要があります。詳細については、「データ シェイプに必要なプロバイダ」を参照してください。

Dim cn As New ADODB.Connection
Dim rsCustomers As New ADODB.Recordset

cn.Open "Provider=MSDataShape;Data Provider=NONE;"

strShape = _
"SHAPE APPEND NEW adInteger AS CustID," & _
            " NEW adChar(25) AS FirstName," & _
            " NEW adChar(25) AS LastName," & _
            " NEW adChar(12) AS SSN," & _
            " NEW adChar(50) AS Address," & _
         " ((SHAPE APPEND NEW adChar(80) AS VIN_NO," & _
                        " NEW adInteger AS CustID," & _
                        " NEW adChar(20) AS BodyColor, " & _
                     " ((SHAPE APPEND NEW adChar(80) AS VIN_NO," & _
                                    " NEW adChar(20) AS Make, " & _
                                    " NEW adChar(20) AS Model," & _
                                    " NEW adChar(4) AS Year) " & _
                        " AS VINS RELATE VIN_NO TO VIN_NO))" & _
            " AS Vehicles RELATE CustID TO CustID) "

rsCustomers.Open strShape, cn, adOpenStatic, adLockOptimistic, -1

Recordset がいったん組み立てられると、そこにデータを入力したり、操作したり、ファイルに保存することができるようになります。


階層 Recordset 内の行へのアクセス

次の例で、階層 Recordset 内の行へのアクセスに必要な手順を示します。

  1. authors および titleauthors テーブルの Recordset オブジェクトが、author ID によって関連付けられます。

  2. 外側のループで、各著作者の姓名、州、および ID が表示されます。

  3. 各行に対して追加された Recordset が Fields コレクションから取得され、rstTitleAuthor に割り当てられます。

  4. 内側のループで、追加された Recordset の各行からの 4 つのフィールドが表示されます。

(StayInSync プロパティが説明の目的で FALSE に設定されているので、外側ループのそれぞれの反復で、チャプタの変化を明らかに観察できます。ただし、手順 2. にある最初の行の前に手順 3. の割り当て作業を移動すると、割り当てが 1 回だけで済むので、より効率的になります。その後 StayInSync プロパティを True に設定すると、rst が新しい行に移動するときには常に、rstTitleAuthor が暗黙的および自動的に、対応するチャプタに変化します。)

例

Sub datashape()
    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim rstTitleAuthor As New ADODB.Recordset

    cnn.Provider = "MSDataShape"
    cnn.Open    "Data Provider=SQLOLEDB;" & _
                "Data Source=SRV;User Id=sa;Password=;Database=Pubs"
' STEP 1
    rst.StayInSync = FALSE
    rst.Open    "SHAPE  {select * from authors} "  & _
                "APPEND ({select * from titleauthor} " & _
                "RELATE au_id TO au_id) AS chapTitleAuthor", _
                cnn
' STEP 2
    While Not rst.EOF
        Debug.Print    rst("au_fname"), rst("au_lname"), _
                       rst("state"), rst("au_id")
' STEP 3
        Set rstTitleAuthor = rst("chapTitleAuthor").Value
' STEP 4
        While Not rstTitleAuthor.EOF
            Debug.Print rstTitleAuthor(0), rstTitleAuthor(1), _
                        rstTitleAuthor(2), rstTitleAuthor(3)
            rstTitleAuthor.MoveNext
        Wend
        rst.MoveNext
    Wend
End Sub


正式な Shape 文法

次に、すべての Shape コマンドの作成における正式な文法を示します。

  • 文法的に必須の項は、角かっこ (<>) で区切られたテキスト文字列です。

  • オプションの項は、角かっこ ([ ]) で区切られます。

  • パイプ記号 ("|") は、代替項目であることを示します。

  • 省略符号 ("...") は、繰り返し代替項目であることを示します。

  • Alpha は、英字による文字列であることを示します。

  • Digit は、数字による文字列であることを示します。

  • Unicode-digit は、Unicode 数字による文字列であることを示します。

その他のすべての項はリテラルです。

項 定義
<shape-command>

SHAPE [<table-exp> [[AS] <alias>]][<shape-action>]

<table-exp>

{<native-sql-statement>} |
(<shape-command>) |
TABLE <quoted-name> |
<quoted-name>

<shape-action>

APPEND <aliased-field-list> |
COMPUTE <aliased-field-list> [BY <field-list>]

<aliased-field-list>

<aliased-field> [, <aliased-field...>]

<aliased-field>

<field-exp> [[AS] <alias>]

<field-exp>

(<relation-exp>) |
<calculated-exp> |
<aggregate-exp> |
<new-exp>

<relation_exp>

<table-exp> [[AS] <alias>]
    RELATE <relation-cond-list>

<relation-cond-list>

<relation-cond> [, <relation-cond>...]

<relation-cond>

<field-name> TO <child-ref>

<child-ref>

<field-name> |
PARAMETER <param-ref>

<param-ref>

<number>

<field-list>

<field-name> [, <field-name>]

<aggregate-exp>

SUM(<qualified-field-name>) |
AVG(<qualified-field-name>) |
MIN(<qualified-field-name>) |
MAX(<qualified-field-name>) |
COUNT(<alias> | <qualified-field-name>) |
STDEV(<qualified-field-name>) |
ANY(<qualified-field-name>)

<calculated-exp>

CALC(<expression>)

<qualified-field-name>

<alias>.[<alias>...]<field-name>

<alias>

<quoted-name>

<field-name>

<quoted-name> [[AS] <alias>]

<quoted-name>

"<string>" |
'<string>' |
[<string>] |
<name>

<name>

alpha [ alpha | digit | _ | # ...]

<number>

digit [digit...]

<new-exp>

NEW <field-type> [(<number> [, <number>])]

<field-type>

OLE DB または ADO のデータ型

<string>

unicode-char [unicode-char...]

<expression>

同じ行でオペランドがほかの非 CALC 列の VBA (Visual Basic for Application) 式


Visual Basic for Applications の関数

次の Visual Basic for Applications の関数は、データ シェイプの CALC 式内で使用することができます。

Abs | Asc | Atn | CBool | CByte | CCur
CDate | CDbl | Chr | ChrB | ChrW | Chr$
ChrB$ | CInt | CLng | Cos | CSng | CStr
Cvar | CVDate | CVErr | Date | Date$ | DateAdd
DateDiff | DatePart | DateSerial | DateValue | Day | DDB
Error | Error$ | Exp | Fix | Format | Format$
FV | Hex | Hex$ | Hour | IIF | InStr
Int | IPmt | IRR | IsDate | IsEmpty | IsError
IsNull | IsNumeric | IsObject | LCase | LCase$ | Left
LeftB | Left$ | LeftB$ | Len | Log | LTrim
LTrim$ | Mid | Mid$ | Minute | MIRR | Month
Now | NPer | NPV | Oct | Oct$ | Pmt
PPmt | PV | QBColor | Rate | RGB | Right
RightB | Right$ | RightB$ | Rnd | RTrim | RTrim$
Second | Sgn | Sin | SLN | Space | Space$
Sqr | Str | Str$ | StrComp | StrConv | String
String$ | SYD | Tan | Time | Time$ | Timer
TimeSerial | TimeValue | Trim | Trim$ | TypeName | UCase
UCase$ | Val | VarType | Weekday | Year |


DataFactory のカスタマイズ

リモート データ サービス (Remote Data Service : RDS) には、3 階層のクライアント/サーバー システムでデータ アクセスを簡単に行う手段があります。クライアントのデータ コントロールで、リモート データ ソース上でクエリを実行するための接続文字列とコマンド文字列のパラメータを指定します。または、更新を実行するための接続文字列と Recordset オブジェクトのパラメータを指定します。

パラメータは、リモート データ ソースでデータ アクセス操作を実行するサーバー プログラムに渡されます。RDS には、RDSServer.DataFactory オブジェクトという既定のサーバー プログラムがあります。この RDSServer.DataFactory は、クエリで作成された Recordset オブジェクトをクライアントに返します。

ただし、RDSServer.DataFactory が実行できるのは、クエリと更新に制限されています。接続文字列またはコマンド文字列の検証または処理は、実行できません。

ADO を使用して、DataFactory が "ハンドラ" という別の種類のサーバー プログラムと連携して動作するように指定できます。ハンドラで、データ ソースへのアクセスに使用される前の、クライアント接続文字列とコマンド文字列を変更できます。さらにハンドラによって、データ ソースとの間でデータを読み書きするためのクライアントの能力を制御するアクセス権を設定することができます。

ハンドラがクライアントのパラメータとアクセス権の変更に使用するパラメータは、カスタマイズ ファイルの各セクションに指定します。

DataFactory オブジェクトのカスタマイズの詳細については、次のトピックを参照してください。

  • カスタマイズ ファイルの概要

  • カスタマイズ ファイルの Connect セクション

  • カスタマイズ ファイルの SQL セクション

  • カスタマイズ ファイルの UserList セクション

  • カスタマイズ ファイルの Logs セクション

  • クライアントに必要な設定

  • カスタム ハンドラの作成


カスタマイズ ファイルの概要

カスタマイズ ファイルの各セクション ヘッダーは、型とパラメータを角かっこ ([ ]) で囲んだものになっています。4 種類のセクションは、connect、sql、userlist、または logs のリテラル文字列で示されます。パラメータは、リテラル文字列、既定値、ユーザー指定の識別子のいずれかです。または、パラメータを何も指定しない場合もあります。

各セクションは、次のセクション ヘッダーのいずれかで区分されます。

[ connect    default        ]
[ connect    identifier    ]
[ sql            default        ]
[ sql            identifier    ]
[ userlist    identifier    ]
[ logs                        ]

セクション ヘッダーには次の要素があります。

要素 | 説明
connect | 接続文字列を変更するリテラル文字列。
sql | コマンド文字列を変更するリテラル文字列。
userlist | 特定のユーザーのアクセス権を変更するリテラル文字列。
logs | 操作上のエラーを記録するログ ファイルを指定するリテラル文字列。
default | 識別子が指定されていない、または検出されない場合に使用されるリテラル文字列。
identifier 接続文字列またはコマンド文字列内の文字列と一致する文字列。
  • セクション ヘッダーに connect があり、識別文字列が接続文字列内にある場合は、このセクションが使用されます。

  • セクション ヘッダーに sql があり、識別文字列がコマンド文字列内にある場合は、このセクションが使用されます。

  • セクション ヘッダーに userlist があり、識別文字列が connect セクションの識別子と一致する場合は、このセクションが使用されます。

DataFactory はハンドラを呼び出し、クライアントのパラメータを渡します。ハンドラは、適切なセクション ヘッダー内の文字列と一致する識別子を求めて、クライアント パラメータ内のすべての文字列を検索します。一致する文字列が見つかると、そのセクションの内容がクライアント パラメータに適用されます。

各セクションは次の状況下で使用されます。

  • connect セクションは、クライアントの接続文字列のキーワード、"Data Source=value" の値の部分が connect セクションの識別子に一致した場合に使用されます。

  • sql セクションは、クライアントのコマンド文字列が sql セクションの識別子と一致する文字列を含んでいる場合に使用されます。

  • connect または sql セクションは、一致する識別子が存在しない場合に既定のパラメータを使って使用されます。

  • userlist セクションは、userlist セクションの識別子が connect セクションの識別子と一致した場合に使用されます。一致した場合、userlist セクションの内容が connect セクションが管理している接続に適用されます。

  • 接続文字列またはコマンド文字列と一致する識別子が、どの connect または sql セクション ヘッダーにも存在せず、また、既定パラメータを使用する connect または sql セクション ヘッダーが存在しない場合、クライアント文字列がそのまま使用されます。

  • logs セクションは、DataFactory の操作中にいつでも使用できます。


カスタマイズ ファイルの Connect セクション

ハンドラの既定の動作では、すべての接続が拒否されます。connect セクションで、この動作の例外を指定します。たとえば、connect セクションが 1 つもなかったり、あっても空の場合、既定では接続は行われません。

connect セクションには、次のものを含めることができます。

  • この接続で実行できる既定の読み書き操作を指定する、既定のアクセス エントリ。このセクションに既定のアクセス エントリが存在しない場合、このセクションは無視されます。

  • クライアントの接続文字列を置き換える新しい接続文字列。

構文

既定のアクセス エントリの形式は、次のとおりです。

Access=accessRight

置き換える接続文字列エントリの形式は、次のとおりです。

Connect=connectionString

要素 | 説明
Connect | これが接続文字列のエントリであることを示すリテラル文字列。
connectionString | クライアントの接続文字列すべてを置き換える文字列。
Access | これがアクセス エントリであることを示すリテラル文字列。
accessRight 次のアクセス権のいずれかを指定します。
  • NoAccess - ユーザーはデータ ソースにアクセスできません。

  • ReadOnly - ユーザーはデータ ソースを読み取ることができます。

  • ReadWrite - ユーザーはデータ ソースに読み書きできます。

何らかの接続を行う場合 (その結果、既定のハンドラ動作を無効にする場合) は、connect default セクションのアクセス エントリを Access=ReadWrite に設定して、その他の connect identifier セクションを削除するか、注釈を付けます。


カスタマイズ ファイルの SQL セクション

sql セクションには、クライアントのコマンド文字列を置き換える新規 SQL 文字列を含めることができます。このセクションに SQL 文字列がない場合、このセクションは無視されます。

新規 SQL 文字列は "パラメータ化" できる場合があります。つまり、sql セクションの SQL 文字列にあるパラメータ ('?' 記号で指定) は、クライアントのコマンド文字列内の "識別子" に対応する引数 (かっこに囲まれたカンマ区切りの一覧で指定) で置き換えることができます。識別子と引数の一覧は、関数呼び出しのような動作をします。

たとえば、クライアントのコマンド文字列を "CustomerByID(4)"、SQL セクション ヘッダーを [SQL CustomerByID]、新規 SQL セクション文字列を "SELECT * FROM Customers WHERE CustomerID = ?" とします。ハンドラは "SELECT * FROM Customers WHERE CustomerID = 4" を生成し、この文字列をデータ ソースのクエリに使用します。

新規 SQL ステートメントが Null 文字列 ("") の場合、このセクションは無視されます。

新規 SQL ステートメント文字列が有効なステートメントでない場合、ステートメントの実行は失敗します。また、クライアント パラメータは無視されます。この性質を次のように指定して意図的に使用し、すべてのクライアント SQL コマンドを "無効" にすることができます。

[SQL default]
SQL = " "

構文

置き換える SQL 文字列エントリの形式は、次のとおりです。

SQL=sqlString

要素 | 説明
SQL | これが SQL セクション エントリであることを示すリテラル文字列。
sqlString | クライアント文字列を置き換える SQL 文字列。


カスタマイズ ファイルの UserList セクション

userlist セクションは、同じセクションの identifier パラメータによって、connect セクションと関連付けられています。

このセクションには、指定されたユーザーに対してアクセス権を指定する "ユーザー アクセス エントリ" を含めることができます。このユーザー アクセス エントリによって、対応する connect セクションの "既定のアクセス エントリ" が上書きされます。

構文

ユーザー アクセス エントリの形式は、次のとおりです。

userName=accessRights

要素 | 説明
userName | この接続を使用しているユーザーの "ユーザー名"。有効なユーザー名は IIS の [サービス マネージャ] ダイアログ ボックスで設定されます。
accessRights 次のアクセス権のいずれかを指定します。
  • NoAccess - ユーザーはデータ ソースにアクセスできません。

  • ReadOnly - ユーザーはデータ ソースを読み取ることができます。

  • ReadWrite - ユーザーはデータ ソースに読み書きできます。


カスタマイズ ファイルの Logs セクション

logs セクションには、DataFactory の操作中に発生したエラーを記録するファイル名を指定する、ログ ファイル エントリを含めることができます。

構文

ログ ファイル エントリの形式は、次のとおりです。

err=FileName

要素 | 説明
err | これがログ ファイル エントリであることを示すリテラル文字列。
FileName | 完全パスとファイル名。通常のファイル名は、c:\msdfmap.log です。

ログ ファイルには、各エラーのユーザー名、HRESULT、発生日時が含まれます。


クライアントに必要な設定

独自の DataFactory ハンドラを使用するには、次のように指定します。

  • Connection オブジェクトの Provider プロパティ、または Connection オブジェクトの接続文字列の "Provider=" キーワードに、"Provider=MS Remote" を指定します。

  • CursorLocation プロパティを adUseClient に設定します。

  • RDS.DataControl オブジェクトの Handler プロパティ、または Recordset オブジェクトの接続文字列の "Handler=" キーワードに、使用するハンドラの名前を指定します。ただし、Connection オブジェクトの接続文字列にハンドラを設定することはできません。

    RDS は、MSDFMAP.Handler という名前の既定のハンドラをサーバーに提供します。既定のカスタマイズ ファイルは、MSDFMAP.INI という名前です。

例

MSDFMAP.INI に次のセクションがあり、AdvWorks というデータ ソース名が既に定義されていると想定します。

[connect CustomerDataBase]
Access=ReadWrite
Connect="DSN=AdvWorks"

[sql CustomerById]
SQL="SELECT * FROM Customers WHERE CustomerID = ?"

次のコード片は Visual Basic で記述されています。

RDS.DataControl バージョン

Dim dc as New RDS.DataControl
Set dc.Handler = "MSDFMAP.Handler"
Set dc.Server = "http://YourServer"
Set dc.Connect = "Data Source=CustomerDatabase"
Set dc.SQL = "CustomerById(4)"
dc.Refresh

Recordset バージョン

Dim rs as New ADODB.Recordset
rs.CursorLocation = adUseClient

Handler プロパティまたはキーワード、Provider プロパティまたはキーワード、および CustomerByld と CustomerDatabase 識別子を指定します。その後、Recordset オブジェクトを開きます。

rs.Open "CustomerById(4)", "Handler=MSDFMAP.Handler;" & _
    "Provider=MS Remote;Data Source=CustomerDatabase;" & _
    "Remote Server=http://YourServer"


カスタム ハンドラの作成

既定の RDS サポートを使用する IIS サーバー管理者がユーザーの要求とアクセス権に対する管理を強化する場合は、独自のハンドラを作成することができます。

MSDFMAP.Handler は、IDataFactoryHandler インターフェイスを実装しています。

IDataFactoryHandler インターフェイス

このインターフェイスには、GetRecordset と Reconnect の 2 つのメソッドがあります。どちらのメソッドでも、CursorLocation プロパティを adUseClient に設定する必要があります。

どちらのメソッドでも、"Handler=" キーワード内の最初のカンマの後に引数を指定します。たとえば、"Handler=progid,arg1,arg2;" では引数文字列 "arg1,arg2" を渡し、"Handler=progid" では Null 引数を渡します。

GetRecordset メソッド

このメソッドは、データ ソースにクエリを実行し、指定された引数を使用して新規 Recordset オブジェクトを作成します。Recordset は、adLockBatchOptiimistic を設定して開く必要があります。また、非同期で開いてはいけません。

引数

conn 接続文字列です。

args ハンドラ用の引数です。

query クエリを作成するためのコマンド テキストです。

ppRS Recordset を返す場所を示すポインタです。

Reconnect メソッド

このメソッドはデータ ソースを更新します。このメソッドで新規 Connection オブジェクトが作成され、指定した Recordset が添付されます。

引数

conn 接続文字列です。

args ハンドラ用の引数です。

pRS Recordset オブジェクトです。

msdfhdl.idl

次は、msdfhdl.idl ファイル内の IDataFactoryHandler 用のインターフェイス定義です。

[
  uuid(D80DE8B3-0001-11d1-91E6-00C04FBBBFB3),
  version(1.0)
]
library MSDFHDL
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");

    // TLib : Microsoft ActiveX Data Objects 2.0 Library
    // {00000200-0000-0010-8000-00AA006D2EA4}
    #ifdef IMPLIB
    importlib("implib\\x86\\release\\ado\\msado15.dll");
    #else
    importlib("msado20.dll");
    #endif

    [
      odl,
      uuid(D80DE8B5-0001-11d1-91E6-00C04FBBBFB3),
      version(1.0)
    ]
    interface IDataFactoryHandler : IUnknown
    {
HRESULT _stdcall GetRecordset(
        [in] BSTR conn,
        [in] BSTR args,
        [in] BSTR query,
        [out, retval] _Recordset **ppRS);

// DataFactory will use the ActiveConnection property
// on the recordset after calling Reconnect.
    HRESULT _stdcall Reconnect(
        [in] BSTR conn,
        [in] BSTR args,
        [in] _Recordset *pRS);
    };
};


ADO API リファレンス

ここには、ADO と RDS のオブジェクト、コレクション、プロパティ、ダイナミック プロパティ、メソッド、イベント、および列挙に関するトピックが含まれています。詳細については、特定のトピックをキーワードで検索するか、次のトピックを参照してください。

  • ADO オブジェクト モデル

  • ADO オブジェクト

  • ADO コレクション

  • ADO プロパティ

  • ADO ダイナミック プロパティ

  • ADO メソッド

  • ADO イベント

  • ADO 列挙定数

  • ADO エラー


ADO オブジェクト モデル

次の図は、ADO オブジェクトとそのコレクションです。詳細については、オブジェクトまたはコレクションをクリックしてください。


ADO オブジェクト

これらのオブジェクト間の関係については、「ADO オブジェクト モデル」を参照してください。

各オブジェクトは、対応するコレクションに格納できます。たとえば、Error オブジェクトは Errors コレクションに格納できます。詳細については、「ADO コレクション」、またはコレクションの各トピックを参照してください。

ADO オブジェクトの概要

オブジェクト | 説明
Command | データ ソースに対して実行する、特定のコマンドの定義です。
Connection | データ ソースへの接続を表します。
DataControl (RDS) | データ クエリ Recordset を 1 つ以上のコントロール (テキスト ボックス、グリッド コントロール、コンボ ボックスなど) とバインドして、Web ページに Recordset データを表示します。
DataFactory (RDS Server) | 指定されたデータ ソースの読み取り/書き込みデータ アクセス権をクライアント側アプリケーションに提供するメソッドを実装します。
DataSpace (RDS) | 中間層にあるカスタム ビジネス オブジェクトにクライアント側プロキシを作成します。
Error | プロバイダが関係した単一の操作に関連したデータ アクセス エラーの詳細情報を格納しています。
Field | 共通のデータ型を持つデータの列を表します。
Parameter | パラメータ クエリまたはストアド プロシージャに基づく、Command オブジェクトに関連付けられたパラメータまたは引数を表します。
Property | プロバイダで定義される ADO オブジェクトの動的特性を表します。
Record | Recordset の行、またはファイル システム内のディレクトリやファイルを表します。
Recordset | ベース テーブルからのレコード セット全体、またはコマンドの実行によって返された結果を表します。Recordset オブジェクトは、常にレコードセット内の 1 つのレコードのみをカレント レコードとして参照します。
Stream | データのバイナリまたはテキスト ストリームを表します。


Command オブジェクト (ADO)

Command オブジェクト

データ ソースに対して実行する、特定のコマンドの定義です。

解説

Command オブジェクトを使うと、データベースへのクエリを実行して Recordset オブジェクト内のレコードを返したり、一括操作を実行したり、データベース構造の操作を行うことができます。プロバイダの機能によっては、Command オブジェクトのコレクション、メソッド、またはプロパティを参照したときにエラーが発生する場合があります。

Command オブジェクトのコレクション、メソッド、プロパティを使って、次の操作を行うことができます。

  • CommandText プロパティを使って、コマンドの実行可能なテキスト (たとえば SQL ステートメント) を定義します。

  • Parameter オブジェクトと Parameters コレクションを使って、パラメータ クエリまたはストアド プロシージャの引数を定義します。

  • Execute メソッドを使ってコマンドを実行して、適切であれば Recordset オブジェクトを返します。

  • パフォーマンスの最適化のために、コマンドを実行する前に CommandType プロパティを使ってコマンドの種類を指定します。

  • Prepared プロパティを使って、準備またはコンパイルされたバージョンのコマンドを実行する前に、プロバイダが保存するかどうかを制御します。

  • CommandTimeout プロパティを使って、プロバイダがコマンドを実行するまでの待機時間を秒単位で設定します。

  • ActiveConnection プロパティを設定して、開いている接続と Command オブジェクトを関連付けます。

  • Name プロパティを設定して、関連付けられた Connection オブジェクトに対するメソッドとして Command オブジェクトを識別します。

  • データを取得するため、Recordset オブジェクトの Source プロパティに Command オブジェクトを渡します。

    注意 Command オブジェクトを使わずにクエリを実行するには、クエリ文字列を Connection オブジェクトの Execute メソッド、または Recordset オブジェクトの Open メソッドに渡します。ただし、コマンド テキストを永続させて再実行する場合、またはクエリ パラメータを使う場合は、Command オブジェクトが必要です。

定義済みの Connection オブジェクトとは関係なく Command オブジェクトを作成するには、ActiveConnection プロパティに有効な接続文字列を設定します。この場合も Connection オブジェクトが作成されますが、そのオブジェクトは、オブジェクト変数には代入されません。ただし、同じ接続に複数の Command オブジェクトを関連付ける場合は、Connection オブジェクトを明示的に作成して開く必要があります。この操作により、Connection オブジェクトがオブジェクト変数に代入されます。Command オブジェクトの ActiveConnection プロパティをこのオブジェクト変数に設定しない場合、同じ接続文字列を使っても、Command オブジェクトごとに新規 Connection オブジェクトが作成されます。

Command オブジェクトを実行するには、関連付けられた Connection オブジェクトで Name プロパティを使って呼び出します。Command オブジェクトの ActiveConnection プロパティには Connection オブジェクトを設定します。Command オブジェクトがパラメータを持つ場合は、引数として値をメソッドに渡します。

同じ接続で 2 つ以上の Command オブジェクトが実行されたときに、いずれかの Command オブジェクトが出力パラメータを持つストアド プロシージャの場合は、エラーが発生します。それぞれの Command オブジェクトを実行するには、別の接続を使用するか、ほかのすべての Command オブジェクトの接続を解除します。

Parameters コレクションは、Command オブジェクトの既定メンバです。したがって、次の 2 つのコード ステートメントは等価です。

objCmd.Parameters.Item(0)
objCmd(0)


Connection オブジェクト (ADO)

Connection オブジェクト

データ ソースへの接続を表します。

解説

Connection オブジェクトはデータ ソースとの固有のセッションを表します。クライアント/サーバー データベース システムの場合、このオブジェクトはサーバーへの実際のネットワーク接続に対応します。プロバイダがサポートする機能によっては、Connection オブジェクトの一部のコレクション、メソッド、またはプロパティが使用できない場合があります。

Connection オブジェクトのコレクション、メソッド、およびプロパティを使って、次の操作を行うことができます。

  • ConnectionString プロパティ、ConnectionTimeout プロパティ、Mode プロパティを使って、接続を開く前に接続設定を行います。ConnectionString は、Connection オブジェクトの既定プロパティです。

  • CursorLocation プロパティを設定して、Cursor Service for OLE DB を呼び出し、一括更新をサポートします。

  • DefaultDatabase プロパティを使って、接続する既定のデータベースを設定します。

  • IsolationLevel プロパティを使って、接続上で開いているトランザクションの分離レベルを設定します。

  • Provider プロパティを使って、OLE DB プロバイダを指定します。

  • Open メソッドと Close メソッドを使って、データ ソースへの物理的な接続および切断を行います。

  • 接続した状態で Execute メソッドを使ってコマンドを実行し、CommandTimeout プロパティを使って実行を設定します。

    注意 Command オブジェクトを使わずにクエリを実行するには、クエリ文字列を Connection オブジェクトの Execute メソッドに渡します。ただし、コマンド テキストを永続させて再実行する場合、またはクエリ パラメータを使う場合は、Command オブジェクトが必要です。

  • BeginTrans メソッド、CommitTrans メソッド、RollbackTrans メソッド、および Attributes プロパティを使って、開いている接続上のトランザクションを管理します。プロバイダがネストされたトランザクションをサポートする場合は、それも管理の対象になります。

  • Errors コレクションを使って、データ ソースから返されたエラーを調べます。

  • Version プロパティを使って、使用中の ADO 実装のバージョンを取得します。

  • OpenSchema メソッドを使って、データベースのスキーマ情報を取り出します。

Connection オブジェクトは、定義済みのオブジェクトとは関係なく作成できます。

コマンドまたはストアド プロシージャは、Connection オブジェクトのネイティブ メソッドとして実行できます。

コマンドを実行するには、Command オブジェクトの Name プロパティを使ってコマンドに名前を付けます。Command オブジェクトの ActiveConnection プロパティに目的の接続を設定します。その後、Connection オブジェクトのメソッドとして使われるコマンド名、次にパラメータ、その次に返される行がある場合は Recordset オブジェクトを指定して、ステートメントを発行します。Recordset プロパティを設定して、結果の Recordset をカスタマイズします。次に例を示します。

Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
...
cnn.Open "..."
cmd.Name = "yourCommandName"
cmd.ActiveConnection = cnn
...
'Your command name, any parameters, and an optional Recordset.
cnn.yourCommandName "parameter", rst

ストアド プロシージャを実行するには、Connection オブジェクトのメソッドとして使われるストアド プロシージャ名、次にパラメータを指定して、ステートメントを発行します。ADO では、できる範囲でパラメータの型を指定します。次に例を示します。

Dim cnn As New ADODB.Connection
...
'Your stored procedure name and any parameters.
cnn.sp_yourStoredProcedureName "parameter"


DataControl オブジェクト (RDS)

データ クエリ Recordset を 1 つ以上のコントロール (テキスト ボックス、グリッド コントロール、コンボ ボックスなど) にバインドして、Web ページに Recordset データを表示します。

構文

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="DataControl" HEIGHT=1 WIDTH = 1>
    <PARAM NAME="Connect" VALUE="DSN=DSNName;UID=usr;PWD=pw;">
    <PARAM NAME="Server" VALUE="http://awebsrvr">
    <PARAM NAME="SQL" VALUE="QueryText">
</OBJECT>

解説

RDS.DataControl オブジェクトのクラス ID は、BD96C556-65A3-11D0-983A-00C04FC29E33 です。

注意 RDS.DataSpace オブジェクトまたは RDS.DataControl オブジェクトの読み取り不能エラーが発生した場合は、クラス ID が正しいかどうか確認してください。これらのオブジェクトのクラス ID は、Version 1.0 および 1.1 から変更されています。

基本的には、設定する必要があるのは RDS.DataControl オブジェクトの SQL プロパティ、Connect プロパティ、および Server プロパティのみです。これらの設定により、既定のビジネス オブジェクトである RDSServer.DataFactory が自動的に呼び出されます。

カスタム ビジネス オブジェクトで機能を代用できるので、RDS.DataControl のすべてのプロパティは省略可能です。

注意 複数の結果を求めるクエリを実行すると、最初の Recordset のみが返されます。複数の結果セットが必要な場合は、それぞれに独自の DataControl を割り当ててください。複数の結果を求めるクエリの例を次に示します。

"Select * from Authors, Select * from Topics"

RDS.DataControl オブジェクトの使用時に、接続文字列に "DFMode=20;" を追加すると、データ更新時のサーバーのパフォーマンスを向上させることができます。この設定の場合、サーバーの RDSServer.DataFactory オブジェクトの実行モードはリソースに負担の少ないモードになります。ただし、この設定では次の操作ができなくなります。

  • パラメータ クエリの実行

  • Execute メソッドを呼び出す前のパラメータまたは列情報の取得

  • Transact Updates を True に設定

  • 行のステータスの取得

  • Resync メソッドの呼び出し

  • Update Resync プロパティによる更新 (明示的または自動的)

  • Command オブジェクトまたは Recordset プロパティの設定

  • adCmdTableDirect の使用

既定では、RDS.DataControl オブジェクトは非同期モードで実行します。アプリケーションを同期モードで実行する必要がある場合は、次の例のように、ExecuteOptions パラメータは adcExecSync に、FetchOptions パラメータは adcFetchUpFront に設定してください。

<SCRIPT LANGUAGE=VBSCRIPT>
Const adcExecSync = 1
Const adcFetchUpFront = 1
?
</SCRIPT>
<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID="DataControl" HEIGHT=1 WIDTH = 1>
   <PARAM NAME="Connect" VALUE="DSN=DSNName;UID=usr;PWD=pw;">
   <PARAM NAME="Server" VALUE="http://awebsrvr">
   <PARAM NAME="SQL" VALUE="QueryText">
   <PARAM NAME="ExecuteOptions" VALUE="adcExecSync">
   <PARAM NAME="FetchOptions" VALUE="adcFetchUpFront">
</OBJECT>

1 つのクエリの結果を 1 つ以上のビジュアル コントロールにリンクするには、1 つの RDS.DataControl オブジェクトを使います。たとえば、"氏名"、"住所"、"本籍地"、"年齢"、"役職" などの顧客データを要求するクエリを記述するとします。この場合、1 つの RDS.DataControl オブジェクトを使って、顧客の氏名、年齢、および住所を 3 つの別々のテキスト ボックスに、役職をチェック ボックスに、そしてすべてのデータをグリッド コントロールに表示させることができます。

複数のクエリの結果を異なるビジュアル コントロールとリンクするには、別々の RDS.DataControl オブジェクトを使います。たとえば、1 つのクエリを顧客の情報の取得に使い、2 つ目のクエリを顧客が購入した商品の情報の取得に使うとします。この場合、最初のクエリの結果を 3 つのテキスト ボックスと 1 つのチェック ボックスに、2 番目のクエリの結果をグリッド コントロールに表示できます。既定のビジネス オブジェクト (RDSServer.DataFactory) を使う場合は、次の操作を行う必要があります。

  • Web ページに 2 つの RDS.DataControl オブジェクトを追加します。

  • 2 つの RDS.DataControl オブジェクトの各 SQL プロパティにクエリを記述します。最初の RDS.DataControl オブジェクトには顧客情報を要求する SQL クエリを記述し、2 番目には顧客が購入した商品の一覧を要求するクエリを記述します。

  • 連結コントロールの各 OBJECT タグに DATAFLD 値を指定して、各ビジュアル コントロールに表示するデータの値を設定します。

1 つの Web ページに OBJECT タグで埋め込むことのできる RDS.DataControl オブジェクトの数に制限はありません。

Web ページに RDS.DataControl オブジェクトを定義する場合は、余分な空白ができることを避けるため、1 などの 0 以外の値を Height 値と Width 値に使います。

RDS クライアント コンポーネントは、Internet Explorer 4.0 に組み込まれています。したがって、RDS.DataControl オブジェクト タグに CODEBASE パラメータを指定する必要はありません。

Internet Explorer 4.0 以降では、アパートメント モデル コントロールとしてマークされている場合にのみ、HTML コントロールおよび ActiveX® コントロールを使ってデータとバインドできます。

Microsoft Visual Basic ユーザーの方へ RDS.DataControl オブジェクトは、Web ベースのアプリケーションにのみ利用します。Visual Basic クライアント アプリケーションには必要ありません。


DataFactory オブジェクト (RDSServer)

この既定のサーバー側ビジネス オブジェクトは、指定されたデータ ソースへの読み取り/書き込みデータ アクセス権をクライアント側アプリケーションに提供するメソッドを実装しています。

解説

RDSServer.DataFactory オブジェクトは、クライアントの要求を受け取るサーバー側オートメーション オブジェクトとして設計されています。インターネット上では、このオブジェクトは Web サーバーに常駐し、ADISAPI コンポーネントによりインスタンス化されます。RDSServer.DataFactory オブジェクトは、指定されたデータ ソースへの読み取り/書き込みアクセス権を提供しますが、確認ロジックおよびビジネス ルール ロジックは含まれていません。

RDSServer.DataFactory オブジェクトおよび RDS.DataControl オブジェクトの両方で利用できるメソッドを使用する場合、RDS は既定で RDS.DataControl のメソッドを使います。この場合、RDSServer.DataFactory が汎用サーバー側ビジネス オブジェクトとして使われる、基本的なプログラミング方法があることを前提としています。

Web アプリケーションでタスク固有のサーバー側プロセスを処理する場合、RDSServer.DataFactory をカスタム ビジネス オブジェクトに置き換えることができます。

Query や CreateRecordset などの RDSServer.DataFactory メソッドを呼び出すサーバー側ビジネス オブジェクトを作成することもできます。これは、従来の RDS の技術に加えて、ビジネス オブジェクトに機能を追加する場合に便利です。

RDSServer.DataFactory オブジェクトのクラス ID は、9381D8F5-0288-11D0-9501-00AA00B911A5 です。


DataSpace オブジェクト (RDS)

中間層にあるカスタム ビジネス オブジェクトに、クライアント側 プロキシを作成します。

解説

RDS には、中間層にあるビジネス オブジェクトとクライアント側コンポーネント間の通信用に、ビジネス オブジェクト プロキシが必要です。プロキシを利用すると、プロセスの境界やコンピュータの境界を超えて、アプリケーションの Recordset データのパッケージ化、非パッケージ化、トランスポート (マーシャリング) を容易に実行できます。

RDS は、RDS.DataSpace オブジェクトの CreateObject メソッドを使って、ビジネス オブジェクト プロキシを作成します。対応する中間層ビジネス オブジェクトのインスタンスの作成時には、必ずビジネス オブジェクト プロキシが動的に作成されます。RDS がサポートするプロトコルは、HTTP、HTTPS (HTTP Secure Sockets)、DCOM、およびインプロセス (クライアント コンポーネントおよびビジネス オブジェクトが同じコンピュータに常駐する) です。

注意 RDS.DataSpace オブジェクトが HTTP プロトコルまたは HTTPS プロトコルを使う場合、RDS は、"ステートレス" の状態で動作します。つまり、クライアント要求に関する情報はサーバーが応答すると削除されます。

ビジネス オブジェクト プロキシが存在する間、ビジネス オブジェクトも存在するようにみえますが、実際には、ビジネス オブジェクトは要求に応答が返されると削除されます。要求を発行すると (つまりメソッドをビジネス オブジェクトで呼び出すと)、プロキシはサーバーへの新規接続を開き、サーバーはビジネス オブジェクトの新規インスタンスを作成します。ビジネス オブジェクトが要求に応答した後、サーバーはビジネス オブジェクトを削除し、接続を閉じます。

この動作は、ビジネス オブジェクトのプロパティまたは変数を使って、ある要求から別の要求にデータを渡すことはできないことを意味しています。そのため、状態データを保持するには、ファイルやメソッド引数など、ほかの方法を利用する必要があります。

RDS.DataSpace オブジェクトのクラス ID は、BD96C556-65A3-11D0-983A-00C04FC29E36 です。


Error オブジェクト (ADO)

Error オブジェクト

プロバイダが関係した単一の操作に関連したデータ アクセス エラーの詳細情報を格納しています。

解説

ADO オブジェクトの操作では、1 つ以上のプロバイダ エラーが発生することがあります。エラーが発生するたびに、1 つ以上の Error オブジェクトが Connection オブジェクトの Errors コレクションに格納されます。別の ADO 操作によってエラーが発生すると、Errors コレクションは消去され、Errors コレクションに新規 Error オブジェクトが格納されます。

注意 各 Error オブジェクトは、ADO エラーではなく、特定のプロバイダ エラーを示します。ADO エラーは実行時例外処理メカニズムに公開されます。たとえば、Microsoft Visual Basic では、ADO 固有のエラーは On Error イベントを発生させ、Error オブジェクトに表示されます。ADO エラーの全一覧については、「ErrorValueEnum」を参照してください。

各エラーの詳細については、次に示す Error オブジェクトのプロパティを参照してください。

  • エラーの文字列を含む Description プロパティ。これは既定のプロパティです。

  • エラー定数の長整数型 (Long) の値を含む Number プロパティ。

  • エラー発生源のオブジェクトを識別する Source プロパティ。このプロパティは、データ ソースへの要求後、Errors コレクションに複数の Error オブジェクトが存在する場合に特に便利です。

  • SQL データ ソースの情報を提供する SQLState プロパティと NativeError プロパティ。

プロバイダ エラーが発生すると、Connection オブジェクトの Errors コレクションに格納されます。ADO では単一の ADO 操作で発生する複数のエラーの生成がサポートされているため、プロバイダ固有のエラー情報を参照できます。エラー ハンドラ内のさまざまなエラー情報を取得するには、言語または環境に適したエラー トラップ機能を使い、ネストされたループを使って、Errors コレクション内の各 Error オブジェクトのプロパティを列挙します。

Microsoft Visual Basic ユーザーおよび VBScript ユーザーの方へ 有効な Connection オブジェクトが存在しない場合、Error オブジェクトからエラー情報を取得します。

プロバイダと同様に、ADO は新しいエラーを発生させる可能性がある呼び出しを行う前に、OLE Error Info オブジェクトを消去します。ただし、Connection オブジェクトの Errors コレクションが消去され、入力されるのは、プロバイダで新しいエラーが生成されたときか、Clear メソッドを呼び出したときのみです。

プロパティとメソッドの中には、Errors コレクションに Error オブジェクトとして表示される警告を返しても、プログラムの実行を停止しないものがあります。Recordset オブジェクトで Resync メソッド、UpdateBatch メソッド、または CancelBatch メソッドを呼び出す前、Connection オブジェクトで Open メソッドを呼び出す前、または Recordset オブジェクトで Filter プロパティを設定する前は、Errors コレクションで Clear メソッドを呼び出します。この操作により、Errors コレクションの Count プロパティを取得して、返された警告があるかどうかを確認できます。


Field オブジェクト (ADO)

Field オブジェクト

共通のデータ型を持つデータの列を表します。

解説

各 Field オブジェクトは Recordset 内の列に対応します。カレント レコードのデータを設定したり返すには、Field オブジェクトの Value プロパティを使います。プロバイダが公開する機能によっては、Field オブジェクトの一部のコレクション、メソッド、またはプロパティが使用できない場合があります

Field オブジェクトのコレクション、メソッドおよびプロパティを使って、次の操作を実行できます。

  • Name プロパティを使って、フィールド名を返します。

  • Value プロパティを使って、フィールド内のデータを表示または変更します。Value は、Field オブジェクトの既定プロパティです。

  • Type プロパティ、Precision プロパティ、および NumericScale プロパティを使って、フィールドの基本特性を返します。

  • DefinedSize プロパティを使って、宣言されたフィールド サイズを返します。

  • ActualSize プロパティを使って、指定されたフィールド内の実際のデータ サイズを返します。

  • Attributes プロパティおよび Properties コレクションを使って、指定されたフィールドがサポートしている機能の種類を識別します。

  • AppendChunk メソッドおよび GetChunk メソッドを使って、長バイナリ型または長文字型データを含むフィールドの値を操作します。

  • プロバイダがバッチ更新をサポートしている場合、OriginalValue プロパティおよび UnderlyingValue プロパティを使って、バッチ更新時に起こるフィールド値の競合を解決します。

すべてのメタデータ プロパティ (Name、Type、DefinedSize、Precision、および NumericScale) は、Field オブジェクトの Recordset を開く前に利用できます。Recordset を開く前に設定すると、動的にフォームを作成する場合に便利です。


Parameter オブジェクト (ADO)

Parameter オブジェクト

パラメータ クエリまたはストアド プロシージャに基づく、Command オブジェクトに関連付けられたパラメータまたは引数を表します。

解説

多くのプロバイダは、パラメータ化コマンドをサポートしています。このコマンドでは、目的のアクションは一度だけ定義でき、変数 (またはパラメータ) でコマンドの詳細を変更します。たとえば、SQL SELECT ステートメントでは、パラメータを使って、WHERE 句の照合条件を定義したり、SORT BY 句で指定する列名を定義します。

Parameter オブジェクトは、パラメータ クエリに関連付けられたパラメータ、またはストアド プロシージャの入出力引数および戻り値を表します。プロバイダが公開する機能によっては、Parameter オブジェクトの一部のコレクション、メソッド、またはプロパティが使用できない場合があります。

Parameter オブジェクトのコレクション、メソッド、およびプロパティを使って、次の操作を実行できます。

  • Name プロパティを使って、パラメータ名を設定したり取得します。

  • Value プロパティを使って、パラメータ値を設定したり取得します。Value は、Parameter オブジェクトの既定プロパティです。

  • Attributes プロパティ、Direction プロパティ、Precision プロパティ、NumericScale プロパティ、Size プロパティ、および Type プロパティを使って、パラメータの特性を設定したり取得します。

  • AppendChunk メソッドを使って、長バイナリ型または文字型データをパラメータに渡します。

呼び出すストアド プロシージャまたはパラメータ クエリに関連付けられたパラメータの名前とそのプロパティが明らかな場合、CreateParameter メソッドを使って適切なプロパティ設定を持つ Parameter オブジェクトを作成し、Append メソッドを使ってそれらを Parameters コレクションに追加することができます。この操作により、Parameters コレクションで Refresh メソッドを呼び出してプロバイダからパラメータ情報を取得するというリソースに負担のかかる操作をしなくても、パラメータ値を設定したり取得することができます。


Property オブジェクト (ADO)

Property オブジェクト

プロバイダで定義される ADO オブジェクトの動的特性を表します。

解説

ADO オブジェクトには、ビルトイン プロパティとダイナミック プロパティという 2 種類のプロパティがあります。

ビルト イン プロパティは ADO に実装され、MyObject.Property 構文を使って、すべての新規オブジェクトですぐに利用できます。ただし、オブジェクトの Properties コレクション内の Property オブジェクトとして表示されないので、値の変更は可能ですが、特性を修正することはできません。

ダイナミック プロパティは基になるデータ プロバイダで定義され、適切な ADO オブジェクトの Properties コレクションに表示されます。たとえば、プロバイダ固有のプロパティで、Recordset オブジェクトがトランザクションまたは更新をサポートするかどうかを表すことができます。これらの追加プロパティは、その Recordset オブジェクトの Properties コレクションに Property オブジェクトとして表示されます。ダイナミック プロパティを参照するには、Properties コレクションで MyObject.Properties(0) または MyObject.Properties("Name") 構文を使います。

どちらのプロパティも削除はできません。

ダイナミック Property オブジェクトには、次の 4 つのビルトイン プロパティがあります。

  • Name プロパティは、プロパティを識別する文字列です。

  • Type プロパティは、プロパティのデータ型を指定する整数です。

  • Value プロパティは、プロパティ設定を含むバリアント型の値です。Value は、Property オブジェクトの既定プロパティです。

  • Attributes プロパティは、プロバイダ固有の特性を表す長整数型の値です。


Record オブジェクト (ADO)

Record オブジェクト

Recordset の行、またはファイル システム内のディレクトリやファイルを表します。

解説

Record オブジェクトに関連付けられたフィールドは、Record オブジェクトの Fields コレクションで表示できます。ADO では、Recordset、SafeArray、および Record オブジェクトの Fields コレクションのスカラ値などのオブジェクト値の列を利用できます。

Record オブジェクトが Recordset の行を表す場合、元の Recordset に返すことができます。

Record オブジェクトでは、ツリー構造の名前空間のモデルを作成できます。ツリー内のノードは、関連付けられた列を持つ Record オブジェクトを表します。列は、そのノードの属性とその他の関連情報を表します。Record オブジェクトは、ツリー構造のリーフ ノードと非リーフ ノードの両方を表すことができます。非リーフ ノードは、その子ノードとしてほかのノードを持っていますが、リーフ ノードは子ノードを持ちません。リーフ ノードは、常にデータのバイナリ/テキスト ストリームを格納しています。非リーフ ノードも、関連付けられた既定のバイナリ/テキスト ストリームを格納している場合があります。Record オブジェクトのプロパティでノードの種類を識別します。

また、Record オブジェクトは、階層構造のデータ間を移動するもう 1 つの手段でもあります。Record オブジェクトを作成して、それを大規模なツリー構造の特定のサブツリーのルートにすると、新しい Record オブジェクトは子ノードとして開くことができます。

ファイルまたはディレクトリ ("リソース") は、絶対 URL で一意に識別します。Connection オブジェクトは、絶対 URL で Record オブジェクトを開いたときに暗黙的に作成され、その Record オブジェクトに設定されます。Connection オブジェクトは、ActiveConnection プロパティで、Record オブジェクトに明示的に設定できます。Connection オブジェクトでアクセスできるファイルおよびディレクトリにより、Record 操作が発生する "コンテキスト" が定義されます。

データを修正または移動する Record オブジェクトのメソッドでは、相対 URL も利用できます。相対 URL では、絶対 URL または Connection オブジェクト コンテキストを起点としてリソースを検索します。

Connection オブジェクトは各 Record オブジェクトに関連付けられています。したがって、Connection オブジェクトのトランザクション メソッドを呼び出せば、Record オブジェクトの操作をトランザクションの一部にすることもできます。

Record オブジェクトは ADO イベントをサポートしていないので、通知には応答しません。

Record オブジェクトのコレクションおよびプロパティを使って、次の操作を実行できます。

  • ActiveConnection プロパティを使って、関連付けられた Connection オブジェクトを設定したり取得します。

  • Mode プロパティを使って、アクセス権限を示します。

  • ParentURL プロパティを使って、Record が表すリソースを格納しているディレクトリの URL を返します。

  • Source プロパティを使って、Record の派生元の絶対 URL、相対 URL、または Recordset を示します。

  • State プロパティを使って、Record の現在のステータスを示します。

  • RecordType プロパティを使って、Record の種類が "単純なドキュメント"、"コレクション ドキュメント"、または "構造ドキュメント" のどれであるかを示します。

  • Cancel メソッドを使って、非同期操作の実行を停止します。

  • Close メソッドを使って、データ ソースと Record との関連付けを解除します。

  • CopyRecord メソッドを使って、Record が表すファイルまたはディレクトリを別の場所にコピーします。

  • DeleteRecord メソッドを使って、Record が表すファイル、ディレクトリ、またはサブディレクトリを削除します。

  • GetChildren メソッドを使って、Record が表すエンティティのサブディレクトリおよびファイルを表す行を格納している Recordset を開きます。

  • MoveRecord メソッドを使って、Record が表すファイル、ディレクトリ、またはサブディレクトリを別の場所に移動 (名前変更) します。

  • Open メソッドを使って、Record を既存のデータ ソースに関連付けたり、新規ファイルまたは新規ディレクトリを作成します。


Recordset オブジェクト (ADO)

Recordset オブジェクト

ベース テーブルのレコード セット全体、またはコマンドの実行によって返された結果を表します。Recordset オブジェクトでは、常にレコードセット内の 1 つのレコードのみをカレント レコードとして参照します。

解説

Recordset オブジェクトを使って、プロバイダからのデータを操作します。ADO の使用時には、Recordset オブジェクトを使ってほとんどのデータ処理を行います。すべての Recordset オブジェクトは、レコード (行) およびフィールド (列) で構成されます。プロバイダがサポートする機能によっては、一部の Recordset メソッドまたはプロパティが使用できない場合があります。

ADODB.Recordset は、Recordset オブジェクトの作成時に使う ProgID です。古い ADOR.Recordset ProgID を参照する既存のアプリケーションはリコンパイルしなくても機能しますが、新しく開発されたアプリケーションでは、ADODB.Recordset を参照するようにしてください。

ADO では、4 種類のカーソル タイプを定義しています。

  • 動的カーソル - ほかのユーザーによる追加、変更、および削除の確認をしたり、ブックマークを使用しないで Recordset 内であらゆる種類の移動を行ったり、プロバイダがブックマークをサポートする場合はブックマークを利用することができます。

  • キーセット カーソル - 動的カーソルと同様のはたらきをしますが、ほかのユーザーによるレコードの追加の確認、およびほかのユーザーが削除したレコードへのアクセスはできません。ほかのユーザーが変更したデータは表示できます。常にブックマークが使用できるため、Recordset 内でのあらゆる種類の移動が可能です。

  • 静的カーソル - データの検索またはレポートの作成に使用するための、レコード セットの静的コピーを提供します。常にブックマークが使用できるため、Recordset 内でのあらゆる種類の移動が可能です。ほかのユーザーによる追加、変更、または削除は確認できません。クライアント側 Recordset オブジェクトを開くときに使用できる唯一のカーソル タイプです。

  • 前方スクロール カーソル - Recordset 内で前方向スクロールのみできます。ほかのユーザーによる追加、変更、または削除は確認できません。Recordset のスクロールが 1 度だけで済む場合は、このカーソルを使うとパフォーマンスが向上します。

Recordset オブジェクトのカーソル タイプを選択するには、Recordset オブジェクトを開く前に CursorType プロパティを設定するか、Open メソッドを使って CursorType 引数を渡します。一部のカーソル タイプしかサポートしていないプロバイダもあります。詳細については、プロバイダのマニュアルを参照してください。カーソル タイプを指定しない場合、既定では前方スクロール カーソルが開きます。

CursorLocation プロパティを adUseClient に設定して Recordset オブジェクトを開く場合、返された Recordset オブジェクトでは、Field オブジェクトの UnderlyingValue プロパティは無効になります。Microsoft SQL Server と連動する Microsoft ODBC Provider for OLE DB などのプロバイダを利用する場合、Open メソッドを使って接続文字列を渡すと、定義済みの Connection オブジェクトとは関係なく、Recordset オブジェクトを作成できます。この場合も Connection オブジェクトが作成されますが、そのオブジェクトは、オブジェクト変数には代入されません。ただし、同じ接続で複数の Recordset オブジェクトを開く場合は、Connection オブジェクトを明示的に作成して開く必要があります。この操作により Connection オブジェクトがオブジェクト変数に代入されます。このオブジェクト変数を使わずに Recordset オブジェクトを開いた場合、同じ接続文字列を渡しても、新規 Recordset オブジェクトごとに新規 Connection オブジェクトが作成されます。

Recordset オブジェクトは必要なだけ作成できます。

Recordset オブジェクトを開くと、カレント レコードが最初のレコードの位置に移動し、BOF プロパティおよび EOF プロパティが False に設定されます。レコードが存在しない場合は、BOF プロパティおよび EOF プロパティの設定値が True になります。

プロバイダが必要な機能をサポートしている場合、カレント レコードは、MoveFirst メソッド、MoveLast メソッド、MoveNext メソッド、MovePrevious メソッド、Move メソッド、AbsolutePosition プロパティ、AbsolutePage プロパティ、および Filter プロパティを使って移動できます。前方スクロール タイプの Recordset オブジェクトは、MoveNext メソッドのみをサポートします。Move メソッドを使って各レコードの参照または Recordset の列挙を行う場合、BOF プロパティおよび EOF プロパティを使えば、Recordset オブジェクトの先頭または末尾を超えているかどうかを確認できます。

Recordset オブジェクトは、即時更新とバッチ更新の 2 種類の更新方法をサポートしています。即時更新では、Update メソッドを呼び出すと、データへのすべての変更が直ちに、基になるデータ ソースに書き込まれます。また、AddNew メソッドおよび Update メソッドを使って値の配列をパラメータとして渡すと、1 レコード中の複数のフィールドを同時に更新できます。

プロバイダがバッチ更新をサポートしている場合、UpdateBatch メソッドを使うと、データベースに対する 1 回の呼び出しを行うだけで、プロバイダで 1 つ以上のレコードの変更をキャッシュし、送信することができます。この操作は AddNew メソッド、Update メソッド、および Delete メソッドによる変更に適用できます。UpdateBatch メソッドを呼び出した後で Status プロパティを使い、データの競合があるかどうかを調べて問題があれば解決することができます。

注意 Command オブジェクトを使わずにクエリを実行するには、クエリ文字列を Recordset オブジェクトの Open メソッドに渡します。ただし、コマンド テキストを永続させて再実行する場合、またはクエリ パラメータを使う場合は、Command オブジェクトが必要です。

Mode プロパティは、アクセス権限を制御します。

Fields コレクションは、Recordset オブジェクトの既定メンバです。したがって、次の 2 つのコード ステートメントは等価です。

Debug.Print objRs.Fields.Item(0)  ' Both statements print
Debug.Print objRs(0)              '  the Value of Item(0).


Stream オブジェクト (ADO)

Stream オブジェクト

データのバイナリまたはテキスト ストリームを表します。

解説

ファイル システムまたは電子メール システムなどの階層化されたツリー構造では、ファイルや電子メールの内容を格納した既定のバイナリ/テキスト ストリームを Record に関連付けることができます。これらのデータ ストリームを格納したフィールドまたはレコードは、Stream オブジェクトを使って操作できます。Stream オブジェクトは次の方法で取得できます。

  • バイナリ データまたはテキスト データを格納したオブジェクト (通常はファイル) を指定する URL で取得します。このようなオブジェクトには、単純なドキュメント、構造ドキュメントを表す Record オブジェクト、またはフォルダがあります。

  • Record オブジェクトに関連付けられた既定の Stream オブジェクトを開いて取得します。Record オブジェクトが開いているときにその Record オブジェクトに関連付けられた既定のストリームを取得すると、ストリームを開くときに起こるラウンドトリップを避けることができます。

  • Stream オブジェクトをインスタンス化して取得します。このような Stream オブジェクトは、アプリケーション用のデータの保存に利用できます。URL に関連付けられた Stream、または Record の既定の Stream とは異なり、インスタンス化した Stream は、既定では基になるソースに関連付けられていません。

Stream オブジェクトのコレクションおよびプロパティを使って、次の操作を実行できます。

  • Open メソッドを使って、Record または URL から Stream を開きます。

  • Close メソッドを使って、Stream を閉じます。

  • Write メソッドまたは WriteText メソッドを使って、バイトまたはテキストを Stream に入力します。

  • Read メソッドまたは ReadText メソッドを使って、Stream からバイトを読み取ります。

  • Flush メソッドを使って、基になるオブジェクトに ADO バッファにある Stream データを書き込みます。

  • CopyTo メソッドを使って、Stream の内容を別の Stream にコピーします。

  • SkipLine メソッドおよび LineSeparator プロパティを使って、ソース ファイルから行を読み取る方法を制御します。

  • EOS プロパティおよび SetEOS メソッドを使って、ストリーム位置の末尾を判別または設定します。

  • SaveToFile メソッドおよび LoadFromFile メソッドを使って、ファイル内のデータを保存および復元します。

  • Charset プロパティを使って、Stream の保存に使う文字セットを指定します。

  • Cancel メソッドを使って、非同期 Stream の実行を停止します。

  • Size プロパティを使って、Stream 内のバイト数を数えます。

  • Position プロパティを使って、Stream 内の現在の位置を制御します。

  • Type プロパティを使って、Stream 内のデータ型を判別します。

  • State プロパティを使って、Stream の現在の状態 (開いている、閉じている、または実行中) を判別します。

  • Mode プロパティを使って、Stream のアクセス モードを指定します。


ADO コレクション

これらのコレクションと ADO オブジェクトの関係については、「ADO オブジェクト モデル」を参照してください。

各コレクションには、対応するオブジェクトを格納できます。たとえば、Error オブジェクトは Errors コレクションに格納できます。オブジェクトの詳細については、「ADO オブジェクト」、またはオブジェクトの特定の項目を参照してください。

ADO コレクションの概要

コレクション | 説明
Errors | プロバイダ関連の 1 つのエラーに対応して作成される Error オブジェクトすべてを格納します。
Fields | Recordset オブジェクトのすべての Field オブジェクトを格納します。
Parameters | Command オブジェクトのすべての Parameter オブジェクトを格納します。
Properties | 1 つのオブジェクトの特定のインスタンスに対する Property オブジェクトをすべて格納します。


Errors コレクション (ADO)

Errors コレクション

1 つのプロバイダ関連エラーが発生したプロバイダに対応して作成される Error オブジェクトすべてを格納します。

解説

ADO オブジェクトの操作では、1 つ以上のプロバイダ エラーが発生することがあります。エラーが発生するたびに、Connection オブジェクトの Errors コレクションに 1 つ以上の Error オブジェクトが格納されます。さらに別の ADO 操作でエラーが発生すると、Errors コレクションは消去され、新規 Error オブジェクト セットが Errors コレクションに格納されます。

各 Error オブジェクトは、ADO エラーではなく、プロバイダ エラーを表します。ADO エラーは実行時例外処理メカニズムに公開されます。たとえば、Microsoft Visual Basic では、ADO 固有のエラーは onError イベントを発生させ、Err オブジェクトに現れます。

エラーが発生しない ADO 操作は Errors コレクションに影響を与えません。Errors コレクションを手動で消去するには Clear メソッドを使います。

Errors コレクションにある Error オブジェクト セットは、1 つのステートメントに対応して発生したすべてのエラーについて記述します。Errors コレクションで特定のエラーを列挙することにより、エラー処理ルーチンでより正確にエラーの原因と発生源を確定し、適切な回復手段を実行できます。

プロパティとメソッドの中には、Errors コレクションの Error オブジェクトとして警告を返しても、プログラムの実行を停止しないものがあります。Recordset オブジェクトで Resync メソッド、UpdateBatch メソッド、または CancelBatch メソッドを呼び出す前、Connection オブジェクトで Open メソッドを呼び出す前、または Recordset オブジェクトに Filter プロパティを設定する前に、Errors コレクションで Clear メソッドを呼び出してください。そして、Errors コレクションの Count プロパティを取得して、返された警告を確認することができます。

注意 1 回の ADO 操作で複数のエラーが生成される仕組みの詳細については、Error オブジェクトのトピックを参照してください。


Fields コレクション (ADO)

Fields コレクション

Recordset オブジェクトまたは Record オブジェクトのすべての Field オブジェクトを格納します。

解説

Recordset オブジェクトには、Field オブジェクトで構成される Fields コレクションが格納されています。各 Field オブジェクトは Recordset 内の列に対応します。Refresh メソッドをコレクションで呼び出せば、Recordset を開く前に Fields コレクションを作成できます。注意 Field オブジェクトの使用方法の詳細については、Field オブジェクトのトピックを参照してください。

Fields コレクションには Append メソッドと Update メソッドがあります。Append メソッドは、一時的に Field オブジェクトを作成し、コレクションに追加します。Update メソッドは、追加や削除を確定します。

Record オブジェクトには、2 つの特別フィールドがあり、FieldEnum 定数を使ってインデックスを付けることができます。1 つの定数は、Record の既定ストリームを格納するフィールドにアクセスし、もう 1 つの定数は、Record の絶対 URL 文字列を格納するフィールドにアクセスします。

プロバイダによっては (Microsoft OLE DB Provider for Internet Publishing など) Record または Recordset に利用できるフィールド サブセットが Fields に入力されるものもあります。その他のフィールドは、名前で参照されたり、コードでインデックスが付けられるまで、コレクションに追加されません。

存在しないフィールドを名前で参照すると、adFieldPendingInsert の Status で新規 Field オブジェクトが Fields コレクションに追加されます。Update を呼び出すと、プロバイダがサポートしていれば、データ ソースに新規フィールドが作成されます。


Parameters コレクション (ADO)

Parameters コレクション

Command オブジェクトのすべての Parameter オブジェクトを格納します。

解説

Command オブジェクトには、Parameter オブジェクトで構成される Parameters コレクションがあります。

Command オブジェクトの Parameters コレクションで Refresh メソッドを使うと、Command オブジェクトで指定されたストアド プロシージャまたはパラメータ クエリに関するプロバイダ サイドのパラメータ情報を取得することができます。ストアド プロシージャの呼び出し、またはパラメータ クエリをサポートしないプロバイダの場合、Parameters コレクション上で Refresh メソッドを呼び出すとエラーになります。

独自の Parameter オブジェクトを定義せず、Refresh メソッドを呼び出す前に Parameters コレクションにアクセスした場合、ADO は自動的にメソッドを呼び出し、コレクションを作成します。

呼び出すストアド プロシージャまたはパラメータ クエリに関連付けられたパラメータのプロパティがわかっている場合、プロバイダへの呼び出しを最小限にすれば、パフォーマンス面で有利です。これには、CreateParameter メソッドを使って適切なプロパティ設定を持つ Parameter オブジェクトを作成し、Append メソッドを使ってそれらを Parameters コレクションに追加します。こうすれば、プロバイダを呼び出してパラメータ情報を取り出さなくても、パラメータ値を設定して返すことができます。また、パラメータ情報を提供しないプロバイダに書き込む場合にパラメータを使用できるようにするには、このメソッドを使って Parameters コレクションを手動で作成する必要があります。必要に応じて、Delete メソッドを使用して Parameters コレクションから Parameter オブジェクトを削除します。


Properties コレクション (ADO)

Properties コレクション

1 つのオブジェクトの特定のインスタンスの Property オブジェクトをすべて格納します。

解説

ADO オブジェクトの中には、Property オブジェクトで構成される Properties コレクションを持つものがあります。各 Property オブジェクトは、プロバイダに固有の ADO オブジェクトの特性に対応します。

注意 Property オブジェクトの使用方法の詳細については、Property オブジェクトのトピックを参照してください。


ADO プロパティ

ADO プロパティの概要

プロパティ | 説明
AbsolutePage | カレント レコードが存在するページを示します。
AbsolutePosition | Recordset オブジェクト内のカレント レコードの位置を表す値の並びを示します。
ActiveCommand | 関連付けられた Recordset オブジェクトを作成した Command オブジェクトを示します。
ActiveConnection | 指定した Command オブジェクト、Recordset オブジェクト、または Record オブジェクトが、現在どの Connection オブジェクトに属するかを示します。
ActualSize | フィールド値の実際の長さを示します。
Attributes | オブジェクトの １ つ以上の特性を示します。
BOF、EOF | BOF は、カレント レコードの位置が Recordset オブジェクトの最初のレコードより前にあることを示します。 EOF は、カレント レコードの位置が Recordset オブジェクトの最後のレコードより後にあることを示します。
Bookmark | Recordset オブジェクトでカレント レコードを一意に識別するブックマークを示します。また、Recordset オブジェクトのカレント レコードに、有効なブックマークで識別されるレコードを設定します。
CacheSize | メモリにローカルにキャッシュされた Recordset オブジェクトのレコード数を示します。
CharSet | テキスト Stream の内容を変換する文字セットを示します。
CommandText | プロバイダに送るコマンド文字列を示します。
CommandTimeout | 実行しようとしたコマンドを中止してエラーを発生させるまでの待機時間を示します。
CommandType | Command オブジェクトの型を示します。
Connect (RDS) | クエリおよび更新操作が実行されるデータベース名を示します。
ConnectionString | データ ソースとの接続に必要な情報を示します。
ConnectionTimeout | 接続操作を中止して、エラーを発生させるまでの待機時間を示します。
Count | コレクション内のオブジェクト数を示します。
CursorLocation | カーソル サービスの場所を示します。
CursorType | Recordset オブジェクトで使われているカーソルのタイプを示します。
DataMember | DataSource プロパティによるオブジェクト参照から取得するデータ メンバ名を示します。
DataSource | Recordset オブジェクトとして表されるデータを格納しているオブジェクトを示します。
DefaultDatabase | Connection オブジェクトの既定データベースを示します。
DefinedSize | Field オブジェクトのデータ容量を示します。
Description | Error オブジェクトを示します。
Direction | Parameter が、入力パラメータ、出力パラメータ、またはその両方を表すかどうか、あるいはストアド プロシージャからの戻り値であるかどうかを示します。
EditMode | カレント レコードの編集ステータスを示します。
EOS | 現在の位置がストリームの末尾かどうかを示します。
ExecuteOptions (RDS) | 非同期実行ができるかどうかを示します。
FetchOptions (RDS) | 非同期フェッチの種類を示します。
Filter | Recordset のデータに対するフィルタを示します。
FilterColumn (RDS) | フィルタ抽出条件を評価する列を示します。
FilterCriterion (RDS) | フィルタ値に使う評価演算子を表します。
FilterValue (RDS) | レコードをフィルタ抽出する値を示します。
Handler (RDS) | RDSServer.DataFactory の機能と、"ハンドラ"が使うパラメータを拡張する、サーバー側のカスタマイズ プログラム ("ハンドラ") の名前を示します。
HelpContext、HelpFile | Error オブジェクトに関連付けられたヘルプ ファイルとトピックを示します。 HelpContextID - ヘルプ ファイルのトピックのコンテキスト ID を長整数型 (Long) の値で返します。 HelpFile - ヘルプ ファイルへの完全なパスを示す文字列型 (String) の値を返します。
Index | Recordset オブジェクトに対して現在有効なインデックス名を表します。
InternetTimeout (RDS) | 要求がタイムアウトするまでの待機時間をミリ秒単位で示します。
IsolationLevel | Connection オブジェクトの分離レベルを示します。
Item | コレクションの特定のメンバを名前またはインデックスで示します。
LineSeparator | テキスト Stream オブジェクトで行区切り文字に使うバイナリ文字を示します。
LockType | 編集時にレコードに適用されるロックの種類を示します。
MarshalOptions | どのレコードがサーバーにマーシャリングされるかを示します。
MaxRecords | クエリから Recordset に返される最大レコード数を示します。
Mode | Connection オブジェクト、Record オブジェクト、または Stream オブジェクトのデータの変更権限を示します。
Name | オブジェクトの名前を示します。
NativeError | 指定された Error オブジェクトでプロバイダ固有のエラー コードを示します。
Number | Error オブジェクトを一意に識別する数値を示します。
NumericScale | Parameter オブジェクトまたは Field オブジェクトの整数値を示します。
OriginalValue | 変更前のレコード内に存在する Field 値を示します。
PageCount | Recordset オブジェクトに含まれるデータのページ数を示します。
PageSize | Recordset の 1 ページを構成するレコード数を示します。
ParentURL | カレント Record オブジェクトの親 Record を指定する絶対 URL 文字列を示します。
Position | Stream オブジェクト内の現在の位置を示します。
Precision | Parameter オブジェクトの数値型 (Numeric) の値、または数値型の Field オブジェクトの精度を示します。
Prepared | 実行前に、コンパイルされたバージョンのコマンドを保存するかどうかを示します。
Provider | Connection オブジェクトのプロバイダ名を示します。
ReadyState (RDS) | DataControl オブジェクトがデータを取得して Recordset オブジェクトに格納するときの、進行状況を示します。
RecordCount | Recordset オブジェクト内のレコード数を示します。
Recordset、SourceRecordset (RDS) | カスタム ビジネス オブジェクトから返された Recordset オブジェクトを示します。
RecordType | Record オブジェクトの型を示します。
Server (RDS) | Internet Information Services (IIS) 名と通信プロトコルを示します。
Size | Parameter オブジェクトの最大サイズをバイト数または文字数で示します。
Size (ADO Stream) | ストリームの合計サイズをバイト数で示します。
Sort | Recordset がソートされる 1 つ以上のフィールド名と、各フィールドが昇順または降順のどちらでソートされるかを示します。
SortColumn (RDS) | どの列でレコードをソートするかを示します。
SortDirection (RDS) | ソート順序が昇順と降順のどちらであるかを示します。
Source (ADO Error) | エラーの発生源のオブジェクト名またはアプリケーション名を示します。
Source (ADO Record) | Record オブジェクトを表すエンティティを示します。
Source (ADO Recordset) | Recordset オブジェクトのデータのソースを示します。
SQL (RDS) | Recordset を取得するためのクエリ文字列を示します。
SQLState | 所定の Error オブジェクトの SQL 状態を示します。
State | 対象になるオブジェクトが開いているか閉じているかを示します。 非同期メソッドを実行しているすべての対象オブジェクトについて、そのオブジェクトが現在、接続、実行、またはフェッチのどの状態であるかを示します。
Status (ADO Field) | Field オブジェクトのステータスを示します。
Status (ADO Recordset) | バッチ更新またはほかの一括操作に関するカレント レコードの状態を示します。
StayInSync | 親の行が変更された場合、基になる子のレコード (つまり、"チャプタ") への参照を変更するかどうかを、階層 Recordset オブジェクト内に示します。
Type | Parameter オブジェクト、Field オブジェクト、または Property オブジェクトの操作の種類またはデータ型を示します。
Type (ADO Stream) | Stream (バイナリまたはテキスト) にあるデータの型を示します。
UnderlyingValue | データベース内の Field オブジェクトの現在の値を示します。
URL (RDS) | 相対 URL または絶対 URL を格納する文字列を示します。
Value | Field オブジェクト、Parameter オブジェクト、または Property オブジェクトに代入された値を示します。
Version | ADO のバージョン番号を示します。


AbsolutePage プロパティ (ADO)

AbsolutePage プロパティ

カレント レコードがあるページを示します。

設定値と戻り値

1 から Recordset オブジェクトのページ数 (PageCount) までの値を長整数型 (Long) で設定します。また、値の取得も可能です。あるいは、PositionEnum の値の 1 つを返します。

解説

カレント レコードのページ番号を確認するには、AbsolutePage プロパティを使います。Recordset オブジェクトを一連のページに論理的に分割するには、PageSize プロパティを使います。各ページには PageSize と同じ数のレコードが存在します。ただし、最終ページのレコード数は PageSize の値より小さい場合があります。プロバイダが必要な機能をサポートしていないと、このプロパティは利用できません。

AbsolutePosition プロパティと同様に AbsolutePage の値は 1 から始まります。カレント レコードが Recordset の最初のレコードのときは、値が 1 になります。特定のページの最初のレコードに移動するには、このプロパティを設定します。総ページ数を調べるには PageCount プロパティを確認します。


AbsolutePosition プロパティ (ADO)

AbsolutePosition プロパティ

Recordset オブジェクト内のカレント レコードの位置を表す値の並びを示します。

設定値と戻り値

1 から Recordset オブジェクトのレコード数 (RecordCount) までの長整数型 (Long) の値を設定します。また、値の取得も可能です。あるいは、PositionEnum の値の 1 つを返します。

解説

AbsolutePosition プロパティを使うと、Recordset オブジェクト内の位置に基づいて特定のレコードに移動すること、またはカレント レコードの位置を決定することができます。プロバイダが必要な機能をサポートしていないと、このプロパティは利用できません。

AbsolutePage プロパティと同様に、AbsolutePosition の値は 1 から始まります。カレント レコードが Recordset の最初のレコードのとき、値が 1 になります。Recordset の総レコード数を調べるには、RecordCount プロパティを確認します。

AbsolutePosition プロパティを設定すると、カレント キャッシュに存在するレコードが対象であっても、指定のレコードで始まる新しいレコード群がキャッシュに再度ロードされます。このレコード群のサイズは CacheSize プロパティで決まります。

注意 AbsolutePosition プロパティで、レコード番号の代用はできません。レコードの位置は、上位のレコードを削除すると変更されます。また、Recordset オブジェクトを再びクエリしたり開いたときに、レコードが AbsolutePosition の値と同じになるとは限りません。所定の位置を保持し、そして戻るにはブックマークを使います。ブックマークは、すべての型の Recordset オブジェクト間で位置を決定できる唯一の方法です。


ActiveCommand プロパティ (ADO)

ActiveCommand プロパティ

関連付けられた Recordset オブジェクトを作成した Command オブジェクトを示します。

戻り値

Command オブジェクトを含むバリアント型 (Variant) の値を返します。既定は Null オブジェクトへの参照です。

解説

ActiveCommand プロパティは読み取り専用です。

Command オブジェクトを使わずにカレント Recordset を作成する場合、Null オブジェクトへの参照が返されます。

Recordset オブジェクトの結果しか得られない場合、このプロパティを使い、関連付けられた Command オブジェクトを検索します。


ActiveConnection プロパティ (ADO)

ActiveConnection プロパティ

指定した Command オブジェクト、Recordset オブジェクト、または Record オブジェクトが、現在どの Connection オブジェクトに属するかを示します。

設定値と戻り値

接続が切断された場合は接続定義を格納する文字列型 (String) の値、また、接続が開かれている場合はカレントの Connection オブジェクトを格納したバリアント型 (Variant) の値を設定します。また、値の取得も可能です。既定は Null オブジェクトへの参照です。ConnectionString プロパティを参照してください。

解説

指定された Command オブジェクトを実行する Connection オブジェクト、または指定された Recordset を開くための Connection オブジェクトを探すには、ActiveConnection プロパティを使います。

コマンド

Command オブジェクトでは、ActiveConnection プロパティは読み取り/書き込みになります。

このプロパティに開いている Connection オブジェクトまたは有効な接続文字列を設定する前に、Command オブジェクトで Execute メソッドを呼び出すと、エラーが発生します。

Microsoft Visual Basic ActiveConnection プロパティに Nothing を設定すると、現在の Connection から Command オブジェクトが分離され、プロバイダはデータ ソース上で関連するリソースを解放します。この設定の後で、Command オブジェクトを同じまたは別の Connection オブジェクトに関連付けることができます。プロバイダによっては、先にプロパティに Nothing を設定することなく、ある Connection から別の Connection にプロパティ設定を変更できます。

Command オブジェクトの Parameters コレクションにプロバイダから提供されるパラメータがあり、ActiveConnection プロパティに Nothing またはほかの Connection オブジェクトを設定すると、コレクションの内容は消去されます。手動で Parameter オブジェクトを作成し、それを使って Command オブジェクトの Parameters コレクションの値を入力すると、ActiveConnection プロパティに Nothing またはほかの Connection オブジェクトを設定しても、Parameters コレクションはそのまま変わりません。

Command オブジェクトに関連付けられた Connection オブジェクトを閉じると、ActiveConnection プロパティは Nothing に設定されます。このプロパティに閉じられた Connection オブジェクトを設定するとエラーが発生します。

Recordset

開いている Recordset オブジェクト、または Source プロパティに有効な Command オブジェクトが設定されている Recordset オブジェクトの場合、ActiveConnection プロパティは読み取り専用になります。それ以外の場合は読み取り/書き込みです。

このプロパティには、有効な Connection オブジェクトまたは有効な接続文字列を設定できます。この場合、プロバイダはこの定義を使って新規 Connection オブジェクトを作成し、接続を開きます。加えて、プロバイダがこのプロパティに新規 Connection オブジェクトを設定することがあります。これは、Connection オブジェクトにアクセスして詳細エラー情報があるかどうかを調べたり、ほかのコマンドを実行できるようにするためです。

Open メソッドの ActiveConnection 引数を使って Recordset オブジェクトを開くと、ActiveConnection プロパティはその引数の値を継承します。

Recordset オブジェクトの Source プロパティに有効な Command オブジェクト変数を設定した場合、Recordset の ActiveConnection プロパティは、Command オブジェクトの ActiveConnection プロパティの設定値を継承します。

Remote Data Service での使用 クライアント側 (ADOR) の Recordset オブジェクトでこのプロパティを使う場合、このプロパティに設定できるのは接続文字列または Nothing (Microsoft Visual Basic または Visual Basic, Scripting Edition の場合) だけです。

Record

Record オブジェクトを閉じるとこのプロパティは読み取り/書き込みになり、接続文字列または開かれた Connection オブジェクトに対する参照が格納されます。Record オブジェクトを開くとこのプロパティは読み取り専用になり、開かれた Connection オブジェクトに対する参照が格納されます。

URL から Record オブジェクトを開くと、Connection オブジェクトが無条件で作成されます。既存の開かれた Connection オブジェクトと共に、Record を開くには、Connection オブジェクトをこのプロパティに割り当てるか、Open メソッドを呼び出す際のパラメータとして Connection オブジェクトを使います。既存の Record や Recordset から開いた Record は、Record オブジェクトや Recordset オブジェクトの Connection オブジェクトに自動的に割り当てられます。


ActualSize プロパティ (ADO)

ActualSize プロパティ

フィールド値の実際の長さを示します。

設定値と戻り値

長整数型 (Long) の値を返します。プロバイダによっては、このプロパティが BLOB データのための予約されたスペースとして設定されていることがあります。その場合の既定値は 0 です。

解説

ActualSize プロパティは、Field オブジェクトの値の実際の長さを返すときに使います。ActualSize プロパティはすべてのフィールドで読み取り専用です。Field オブジェクトの値の長さがわからない場合、ActualSize プロパティは adUnknown を返します。

次の例でわかるように、ActualSize プロパティと DefinedSize プロパティは別のものです。たとえば、宣言された adVarChar 型の Field オブジェクトで、長さの最大値が 50 文字の場合、DefinedSize プロパティ値には 50 が返されますが、ActualSize プロパティ値には、カレント レコードとしてフィールドに保存されたデータの長さが返されます。DefinedSize が 255 バイトを超える Fields は、可変長列として処理されます。


Attributes プロパティ (ADO)

Attributes プロパティ

オブジェクトの １ つ以上の特性を示します。

設定値と戻り値

長整数型 (Long) の値を設定します。また、値の取得も可能です。

Connection オブジェクトの場合、Attributes プロパティは読み取り/書き込みで、その値には、1 つ以上の XactAttributeEnum 値の和が設定されます。既定値は 0 です。

Parameter オブジェクトの場合、Attributes プロパティは読み取り/書き込みで、その値には、1 つ以上の ParameterAttributesEnum 値の和が設定されます。既定値は adParamSigned です。

Field オブジェクトの場合、Attributes プロパティには、1 つ以上の FieldAttributeEnum 値の和が設定されます。通常は、読み取り専用ですが、Record の Fields コレクションに追加された新規 Field オブジェクトの場合、Field の Value プロパティが指定されていて、Fields コレクションの Update メソッドの呼び出しによる新規 Field の追加にデータ プロバイダが成功した場合に限り、Attributes は読み取り/書き込み専用になります。

Property オブジェクトの場合、Attributes プロパティは読み取り専用で、その値には、1 つ以上の PropertyAttributesEnum 値の和が設定されます。

解説

Connection オブジェクト、Parameter オブジェクト、Field オブジェクト、または Property オブジェクトの特性を設定、または返すには、Attributes プロパティを使います。

複数の属性を設定する場合、該当する定数の和を設定することができます。同時に設定できない定数の和をプロパティ値に設定すると、エラーが発生します。

Remote Data Service での使用 このプロパティはクライアント側の Connection オブジェクトでは使えません。


BOF、EOF プロパティ (ADO)

BOF、EOF プロパティ

  • BOF - カレント レコードの位置が Recordset オブジェクトの最初のレコードより前にあることを示します。

  • EOF - カレント レコードの位置が Recordset オブジェクトの最後のレコードより後にあることを示します。

戻り値

BOF および EOF プロパティは、ブール型 (Boolean) の値を返します。

解説

BOF プロパティと EOF プロパティは、Recordset オブジェクトにレコードが格納されているか、またはレコード間を移動したときに Recordset オブジェクトの制限を超えたかどうかを確認するときに使います。

BOF プロパティは、カレント レコードの位置が最初のレコードより前にある場合は True (-1) を返し、カレント レコードの位置が最初のレコード上またはそれ以降にある場合は False (0) を返します。

EOF プロパティは、カレント レコードの位置が最後のレコードより後にある場合は True を返し、カレント レコードの位置が最後のレコード上またはそれ以前にある場合は False を返します。

BOF または EOF プロパティが True の場合、カレント レコードはありません。

レコードが存在しない Recordset オブジェクトでは、BOF プロパティと EOF プロパティは True に設定され、Recordset オブジェクトの RecordCount プロパティの設定値が 0 になります。少なくとも 1 つのレコードが格納された Recordset オブジェクトを開くと、最初のレコードがカレント レコードになり、BOF プロパティと EOF プロパティは False になります。

Recordset オブジェクトで最後に残ったレコードを削除しても、カレント レコードの位置を移動するまで BOF および EOF プロパティは False のままです。

次の表では、BOF プロパティと EOF プロパティの設定値の組み合わせと、利用できる Move メソッドの種類を示します。

 | MoveFirst、MoveLast | MovePrevious、Move < 0 | Move 0 | MoveNext、Move > 0
BOF=True、 EOF=False | 使用可能 | エラー | エラー | 使用可能
BOF=False、 EOF=True | 使用可能 | 使用可能 | エラー | エラー
両方が True | エラー | エラー | エラー | エラー
両方が False | 使用可能 | 使用可能 | 使用可能 | 使用可能

Move メソッドが使えても、そのメソッドによるレコードの位置決めが成功するとは限りません。メソッドが使えるとは、指定された Move メソッドを呼び出してもエラーが発生しなかったことを意味するだけです。

次の表は、さまざまな Move メソッドを呼び出しても、レコードの位置決めが行えない場合に、BOF プロパティと EOF プロパティで設定される値を示します。

 | BOF | EOF
MoveFirst、MoveLast | True に設定 | True に設定
Move 0 | 変化なし | 変化なし
MovePrevious、Move < 0 | True に設定 | 変化なし
MoveNext、Move > 0 | 変化なし | True に設定


Bookmark プロパティ (ADO)

Bookmark プロパティ

Recordset オブジェクトのカレント レコードを一意で識別するブックマークを示し、Recordset オブジェクトのカレント レコードに、有効なブックマークで識別されるレコードを設定します。

設定値と戻り値

有効なブックマークと評価されるバリアント型 (Variant) の式を設定します。また、値の取得も可能です。

解説

Bookmark プロパティを使ってカレント レコードの位置を保存し、そのレコードにいつでも戻ることができます。ブックマークは、ブックマーク機能をサポートする Recordset オブジェクトでのみ利用できます。

Recordset オブジェクトを開くとき、各レコードには固有のブックマークが割り当てられます。カレント レコードのブックマークを保存するには、Bookmark プロパティの値を変数に代入します。ほかのレコードに移動した後、ブックマークを保存したレコードにすぐに戻るには、Recordset オブジェクトの Bookmark プロパティにその変数を設定しておきます。

ブックマーク値を参照できない場合があります。たとえば、同じレコードを参照しながらも、異なる値を持つ 2 つのブックマークなどのブックマークは直接比較することはできません。

Clone メソッドを使って Recordset オブジェクトのコピーを作成した場合、Recordset オブジェクトの Bookmark プロパティの設定値はコピー元とコピー先で同じになるため、同じように利用できます。ただし、同じソースまたはコマンドから作成されていても、異なる Recordset オブジェクトからのブックマークに互換性はありません。

Remote Data Service での使用 クライアント側 Recordset オブジェクトでは、Bookmark プロパティは常に利用できます。


CacheSize プロパティ (ADO)

CacheSize プロパティ

ローカル メモリにキャッシュされた Recordset オブジェクトのレコード数を示します。

設定値と戻り値

0 より大きい長整数型 (Long) の値を設定します。また、値の取得も可能です。既定値は 1 です。

解説

プロバイダがバッファに保存するレコード数、およびローカル メモリに一度に取り込むレコード数を制御するには、CacheSize プロパティを使います。たとえば、CacheSize が 10 の場合、最初に Recordset オブジェクトが開くと、プロバイダは最初の 10 個のレコードをローカル メモリに取り込みます。Recordset オブジェクトを移動する間、プロバイダはローカル メモリ バッファからデータを返します。キャッシュ内の最後のレコードを通過すると、プロバイダは次の 10 個のレコードをデータ ソースからキャッシュに取り込みます。

このプロパティの値は、Recordset オブジェクトが開いている間に変更できますが、変更した値は、次にデータ ソースからキャッシュへ取り込むレコード数に対してのみ適用されます。プロパティ値を変更しただけでは、現在のキャッシュの内容は変更されません。

取り込めるレコード数が CacheSize の指定値より少なくても、プロバイダは残りのレコードを返し、エラーにはなりません。

CacheSize プロパティは 0 には設定できません。エラーになります。

ほかのユーザーがソース データを同時に変更しても、キャッシュから取り込まれたレコードには反映されません。キャッシュに格納されているすべてのデータを強制的に更新するには、Resync メソッドを使います。

CacheSize に 1 を超える値を設定して、レコードを取得した後に削除を行った場合、移動メソッド (Move、MoveFirst、MoveLast、MoveNext、MovePrevious) を実行すると、削除レコードに移動します。最初のフェッチ後の削除は、削除された行からデータ値にアクセスするまで、データ キャッシュには反映されません。ただし、CacheSize に 1 を設定すると、削除行をフェッチできなくなるのでこの問題は解消できます。


Charset プロパティ (ADO)

Charset プロパティ

テキスト Stream の内容の変換先の文字セットを示します。

設定値と戻り値

Stream の内容を変換する先の文字セットを指定する文字列型 (String) 値を設定します。また、値の取得も可能です。既定値は "Unicode" です。利用できる値は、インターネット文字セット文字列としてインターフェイスで渡すことのできる通常の文字列です ("iso-8859-1"、"Windows-1252" など)。システムが認識できる文字セット文字列の一覧については、Windows レジストリの HKEY_CLASSES_ROOT\MIME\Database\Charset のサブキーを参照してください。

解説

テキスト Stream オブジェクトでは、テキスト データは Unicode で保存されます。Charset プロパティは、Stream から読み取られるデータを指定文字セットに変換します。同様に、指定文字セットで Stream に書き込まれるデータは、Unicode に変換されて Stream オブジェクトに格納されます。

開かれた Stream の場合、現在の Position が Stream (0) の先頭にないと、Charset には設定できません。

Charset は、テキスト Stream オブジェクト (Type は adTypeText) にだけ使います。Type が adTypeBinary の場合、このプロパティは無視されます。


CommandText プロパティ (ADO)

CommandText プロパティ

プロバイダに送るコマンド文字列を示します。

設定値と戻り値

SQL ステートメント、テーブル名、相対 URL、またはストアド プロシージャの呼び出しなど、プロバイダのコマンドを含む文字列型 (String) の値を設定します。また、値の取得も可能です。既定値は "" (長さ 0 の文字列) です。

解説

Command オブジェクト内のコマンド テキストを設定または値を取得するには、CommandText プロパティを使います。通常は SQL ステートメントを使いますが、ストアド プロシージャの呼び出しなど、プロバイダが認識する、ほかの種類のコマンド ステートメントでもかまいません。SQL ステートメントは、特定の文法またはプロバイダのクエリ プロセッサがサポートするバージョンである必要があります。

Command オブジェクトの Prepared プロパティに True が設定されていて、CommandText プロパティを設定する際に、開いている接続に Command オブジェクトがバインドされている場合、Execute メソッドまたは Open メソッドを呼び出すとクエリ (つまり、プロバイダが保存するコンパイルされたクエリ) が準備されます。

CommandType プロパティの設定値によっては、CommandText プロパティが変更される場合があります。CommandText プロパティはいつでも読み出すことができ、ADO がコマンド実行中に使う実際のコマンド テキストの参照も可能です。

ファイルやディレクトリなどのリソースを指定する相対 URL を設定したり値を取得するには、CommandText プロパティを使います。絶対 URL で明示的に指定した位置や、開かれた Connection オブジェクトで暗黙的に指定された位置に対してリソースは相対的です。


CommandTimeout プロパティ (ADO)

CommandTimeout プロパティ

実行しようとしたコマンドを中止してエラーを発生させるまでの待機時間を示します。

設定値と戻り値

コマンド実行が完了するまでの待機時間を秒単位で示す長整数型 (Long) の値を設定します。また、値の取得も可能です。既定値は 30 です。

解説

ネットワーク トラフィックやサーバーの過負荷により実行が遅れている Execute メソッドの呼び出しの取り消しを行えるようにするには、Connection オブジェクトまたは Command オブジェクトの CommandTimeout プロパティを使います。コマンドの実行が完了する前に CommandTimeout プロパティで設定された時間が経過すると、エラーが発生してコマンドが取り消されます。プロパティに 0 を設定すると、コマンド実行が完了するまで無限に待機します。コードを書き込むプロバイダとデータ ソースが CommandTimeout 機能をサポートしていることを確認してください。

Connection オブジェクトの CommandTimeout 設定は、同じ Connection 上の Command オブジェクトの CommandTimeout 設定に影響しません。つまり、Command オブジェクトの CommandTimeout プロパティは、Connection オブジェクトの CommandTimeout の値を継承しません。

Connection オブジェクトでは、CommandTimeout プロパティは Connection が開かれた後も、読み取り/書き込みができます。


CommandType プロパティ (ADO)

CommandType プロパティ

Command オブジェクトの型を示します。

設定値と戻り値

１ つ以上の CommandTypeEnum 値を設定します。また、値の取得も可能です。内部処理を最小限に抑えてパフォーマンスを向上させるには、ExecuteOptionEnum の adExecuteNoRecords 定数を利用します。この定数は単独で使うことはありません。常に adCmdText または adCmdStoredProc と組み合わせて使います (adCmdText+adExecuteNoRecords など)。adExecuteNoRecords を Open メソッドまたはそのメソッドが使う Command オブジェクトと併用するとエラーになります。

解説

CommandText プロパティの評価を最適化するには、CommandType プロパティを使います。

CommandType プロパティの値が adCmdUnknown (既定値) の場合、パフォーマンスが低下することがあります。これは、CommandText プロパティの型が SQL ステートメント、ストアド プロシージャ、またはテーブル名のいずれかであるかを調べるためにプロバイダを呼び出す必要があるためです。使っているコマンドの種類が明らかな場合は、CommandType プロパティを設定することにより、該当するコードに直接移動することができます。CommandType プロパティが CommandText プロパティのコマンドの種類と一致しない場合に Execute メソッドを呼び出すと、エラーが発生します。


Connect プロパティ (RDS)

クエリおよび更新操作が実行されるデータベース名を示します。

Connect プロパティは、デザイン時に RDS.DataControl オブジェクトの OBJECT タグ内で、または実行時にスクリプト コード (たとえば、VBScript) 内で設定できます。

構文

デザイン時: <PARAM NAME="Connect" VALUE="ConnectionString">

実行時: DataControl.Connect = "ConnectionString"

パラメータ

ConnectionString 有効な接続文字列を指定します。接続文字列全般の説明については、ConnectionString プロパティかプロバイダのマニュアルを参照してください。

注意 RDS.DataControl のプロバイダとして MS Remote を指定すると、4 層で実行されます。3 層を超える状況の動作については未確認なので避けてください。

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。


ConnectionString プロパティ (ADO)

ConnectionString プロパティ

データ ソースとの接続に必要な情報を示します。

設定値と戻り値

文字列型 (String) の値を設定します。また、値の取得も可能です。

解説

ConnectionString プロパティを使って、セミコロンで区切られた一連の argument = value ステートメントを含む詳細な接続文字列を渡してデータ ソースを指定します。

ADO は ConnectionString プロパティで 5 種類の引数をサポートしています。その他の引数は ADO で処理されずに直接プロバイダに渡されます。ADO がサポートする引数を次に示します。

引数 | 説明
Provider= | 接続用のプロバイダ名を指定します。
File Name= | 設定済みの接続情報を格納したプロバイダ固有のファイル （たとえば、永続データ ソース オブジェクトなど） の名前を指定します。
Remote Provider= | クライアント側の接続を開く際に使うプロバイダ名を指定します。(RDS のみ。)
Remote Server= | クライアント側の接続を開く際に使う、サーバーのパス名を指定します。(RDS のみ。)
URL= | ファイルやディレクトリなどのリソースを識別する絶対 URL として接続文字列を指定します。

ConnectionString プロパティを設定して Connection オブジェクトを開いた後で、ADO で定義された引数名が、プロバイダで該当する引数名にマップされるなど、プロバイダがプロパティの内容を変更する場合があります。

ConnectionString プロパティは、Open メソッドの ConnectionString 引数に使われた値を自動的に継承します。したがって、Open メソッドの呼び出しでは現在の ConnectionString プロパティを無視できます。

File Name 引数により関連のあるプロバイダが呼び出されるため、Provider 引数と File Name 引数の両方を渡すことはできません。

接続が閉じている場合の ConnectionString プロパティは読み取り/書き込みになっていますが、接続が開いている場合は読み取り専用になります。

ConnectionString プロパティで引数が重複しても無視されます。引数では、最後のインスタンスが適用されます。

RDS での使用 クライアント側の Connection オブジェクトで使う場合、ConnectionString プロパティに指定できるのは Remote Provider パラメータと Remote Server パラメータだけです。


ConnectionTimeout プロパティ (ADO)

ConnectionTimeout プロパティ

接続操作を中止して、エラーを発生させるまでの待機時間を示します。

設定値と戻り値

接続が開くまでの待機時間を秒単位で示す長整数型 (Long) の値を設定します。また、値の取得も可能です。既定値は 15 です。

解説

ネットワーク トラフィックやサーバーの過負荷が原因で接続に時間がかかる場合、接続を中止する必要があります。この場合は、Connection オブジェクトで ConnectionTimeout プロパティを使います。接続が確立される前に ConnectionTimeout プロパティで設定した時間が経過した場合、エラーが発生して接続が取り消されます。このプロパティに 0 を設定した場合は、接続が確立されるまで無限に待機します。コードを書き込むプロバイダが、ConnectionTimeout 機能をサポートしていることを確認してください。

接続が閉じている場合、ConnectionTimeout プロパティは読み取り/書き込みになっています。接続が開いている場合は読み取り専用になります。


Count プロパティ (ADO)

Count プロパティ

コレクション内のオブジェクト数を示します。

戻り値

長整数型 (Long) の値を返します。

解説

Count プロパティは、コレクション内のオブジェクトの数を調べるために使います。

コレクションのメンバは 0 から順に番号が割り当てられるため、ループを使う場合は常に 0 から始めて、Count プロパティより 1 小さい値で終わらせる必要があります。Microsoft Visual Basic を使っていて、ループ内で Count プロパティをチェックせずにコレクションのメンバを指定するには、For Each...Next コマンドを使います。

Count プロパティが 0 の場合、コレクションにはオブジェクトが含まれていないことを意味します。


CursorLocation プロパティ (ADO)

CursorLocation プロパティ

カーソル サービスの場所を示します。

設定値と戻り値

CursorLocationEnum 値のいずれか 1 つに設定可能な長整数型 (Long) の値を設定します。また、値の取得も可能です。

解説

このプロパティで、プロバイダにアクセス可能なさまざまなカーソル ライブラリの中からカーソル サービスを選択します。通常は、クライアント側カーソル ライブラリ、またはサーバー側カーソル ライブラリから選択します。

このプロパティ設定は、プロパティが設定された後に確立された接続のみに作用します。CursorLocation プロパティを変更しても既存の接続には影響しません。

Execute メソッドが返すカーソルは、この設定を継承します。Recordset オブジェクトは関連付けられた接続からこの設定を自動的に継承します。

このプロパティは、Connection または閉じている Recordset 上では読み取り/書き込みで、開いている Recordset 上では読み取り専用です。

RDS での使用 クライアント側の Recordset オブジェクトまたは Connection オブジェクトで使う場合、CursorLocation プロパティは adUseClient にのみ設定できます。


CursorType プロパティ (ADO)

CursorType プロパティ

Recordset オブジェクトで使うカーソル タイプを示します。

設定値と戻り値

CursorTypeEnum の値を設定します。また、値の取得も可能です。既定値は adOpenForwardOnly です。

解説

CursorType プロパティでは、Recordset オブジェクトを開くときに使うカーソル タイプを指定します。

CursorLocation プロパティに adUseClient が設定されている場合、adUseStatic の設定しかサポートされません。サポートされていない値が設定された場合でも、エラーは発生しません。サポート タイプの中の近似 CursorType で代用されます。

要求したカーソル タイプをプロバイダがサポートしていない場合、ほかのカーソル タイプが返ります。Recordset オブジェクトが開いているとき、CursorType プロパティは実際に使われているカーソル タイプに合わせて変更されます。返されたカーソル特有の機能を調べるには、Supports メソッドを使います。Recordset を閉じると、CursorType プロパティは元の設定値に戻ります。

次の表では、各カーソル タイプに要求されるプロバイダの機能 (Supports メソッドの定数によって識別されます) を示します。

Recordset に使う CursorType | Supports メソッドが True を返す定数
adOpenForwardOnly | なし
adOpenKeyset | adBookmark、adHoldRecords、adMovePrevious、adResync
adOpenDynamic | adMovePrevious
adOpenStatic | adBookmark、adHoldRecords、adMovePrevious、adResync

注意 動的カーソルまたは前方スクロール タイプのカーソルで Supports (adUpdateBatch) が True を返すことがありますが、バッチ更新はキーセット カーソルまたは静的カーソルで行ってください。バッチ更新に必要な Cursor Service for OLE DB を有効にするには、LockType プロパティに adLockBatchOptimistic を、CursorLocation プロパティに adUseClient を設定します。

CursorType プロパティは、Recordset が閉じている場合は読み取り/書き込み、開いている場合は読み取り専用になります。

RDS での使用 クライアント側の Recordset オブジェクトで使う場合、CursorType プロパティは adOpenStatic にのみ設定できます。


DataMember プロパティ (ADO)

DataMember プロパティ

DataSource プロパティによるオブジェクトへの参照から取得するデータ メンバ名を示します。

設定値と戻り値

文字列型 (String) の値を設定します。また、値の取得も可能です。名前に大文字と小文字の区別はありません。

解説

Data Environment でデータ連結コントロールを作成するとき、このプロパティを使います。Data Environment は、Recordset オブジェクトとして表される、名前付きオブジェクト ("データ メンバ") を含むデータのコレクション (データ ソース) を管理します。

DataMember プロパティと DataSource プロパティは連動して使われる必要があります。

DataSource プロパティに指定されたどのオブジェクトが Recordset オブジェクトになるかを DataMember プロパティで指定します。Recordset オブジェクトはこのプロパティの設定前に閉じておきます。DataSource プロパティの前に DataMember プロパティが設定されていない場合、または DataMember 名が、DataSource プロパティに指定されているオブジェクトによって認識されない場合、エラーが発生します。

使用例

Dim rs as New ADODB.Recordset
rs.DataMember = "Command"     'Name of the rowset to bind to
Set rs.DataSource = myDE      'Name of the object containing an IRowset


DataSource プロパティ (ADO)

DataSource プロパティ

Recordset オブジェクトとして表されるデータを格納しているオブジェクトを示します。

解説

Data Environment でデータ連結コントロールを作成するときに、このプロパティを使います。Data Environment は、Recordset オブジェクトとして表される、名前付きオブジェクト ("データ メンバ") を含むデータのコレクション (データ ソース) を管理します。

DataMember プロパティと DataSource プロパティは連動して使われる必要があります。

オブジェクトへの参照には、IDataSource インターフェイスを実装し、IRowset インターフェイスを組み込みます。

使用例

Dim rs as New ADODB.Recordset
rs.DataMember = "Command"     'Name of the rowset to bind to
Set rs.DataSource = myDE      'Name of the object containing an IRowset


DefaultDatabase プロパティ (ADO)

DefaultDatabase プロパティ

Connection オブジェクトの既定のデータベースを示します。

設定値と戻り値

プロバイダで使用可能なデータベース名を評価する文字列型 (String) の値を設定します。また、値の取得も可能です。

解説

特定の Connection オブジェクトの既定のデータベース名を設定、または値を取得するには DefaultDatabase プロパティを使います。

既定のデータベースがある場合、そのデータベース上のオブジェクトにアクセスするには不適切な SQL 構文である場合があります。DefaultDatabase プロパティで指定されたデータベース以外のデータベース上のオブジェクトにアクセスするには、オブジェクト名を目的のデータベース名で修飾する必要があります。接続時に、プロバイダは DefaultDatabase プロパティに既定のデータベース情報を書き込みます。プロバイダの中には接続時に 1 つのデータベースしかアクセスできないものがあり、その場合、DefaultDatabase プロパティは変更できません。

データ ソースとプロバイダによっては、この機能をサポートせず、エラーまたは空文字列を返す場合があります。

RDS での使用 このプロパティは、クライアント側の Connection オブジェクトでは使用できません。


DefinedSize プロパティ (ADO)

DefinedSize プロパティ

Field オブジェクトのデータ容量を示します。

戻り値

バイト数でフィールドの定義サイズを反映する長整数型 (Long) の値を返します。

解説

Field オブジェクトのデータ許容量を調べるには、DefinedSize プロパティを使います。

DefinedSize プロパティと ActualSize プロパティは異なるプロパティです。たとえば、宣言タイプが adVarChar で DefinedSize プロパティ値が 50、1 文字を格納した Field オブジェクトがあるとします。このオブジェクトが返す ActualSize プロパティ値は、1 文字をバイト数で表した長さです。


Description プロパティ (ADO)

Description プロパティ

Error オブジェクトの説明です。

戻り値

エラーの内容を表す文字列型 (String) を返します。

解説

エラーの簡単な説明を得るには、Description プロパティを使います。処理が不可能なエラーや困難なエラーは、このプロパティを表示してユーザーに警告します。文字列は、ADO またはプロバイダから返されます。

エラー テキストは、プロバイダから ADO に渡されます。ADO は、受け取ったプロバイダ エラーまたは警告ごとに Error オブジェクトを Errors コレクションに追加します。プロバイダが渡すエラーを調べるには、Errors コレクションを列挙します。


Direction プロパティ (ADO)

Direction プロパティ

Parameter が入力パラメータと出力パラメータのどちらか、またはその両方を表すのか、あるいはストアド プロシージャからの戻り値であるかどうかを示します。

設定値と戻り値

ParameterDirectionEnum の値を設定します。また、値の取得も可能です。

解説

プロシージャとのパラメータのやり取りの方法を指定するには、Direction プロパティを使います。Direction プロパティは読み取り/書き込みになっています。このため、この情報を返したり、指定できないプロバイダを使うときでも、このパラメータ情報を取得しようとしたために ADO が例外呼び出しを発生させるということがないように処理を記述できます。

プロバイダの中には、ストアド プロシージャのパラメータの方向を確認できないものがあります。この場合は、クエリを実行する前に Direction プロパティを設定します。


EditMode プロパティ (ADO)

EditMode プロパティ

カレント レコードの編集ステータスを示します。

戻り値

EditModeEnum 値を返します。

解説

ADO は、カレント レコードに関連付けられた編集バッファを使います。このプロパティは、このバッファに対して変更が加えられたかどうか、または新規レコードが作成されたかどうかを示します。カレント レコードの編集状態を調べるには、EditMode プロパティを使います。編集プロセスが中断された場合に保留中の変更があるかどうかを確認して、Update メソッドまたは CancelUpdate メソッドを使う必要があるかどうかを判定できます。

さまざまな編集条件における EditMode プロパティの詳細な記述については、AddNew メソッドを参照してください。

注意 EditMode ではカレント レコードがないと有効値は返されません。EditMode では、BOF または EOF が TRUE の場合にだけ、あるいはカレント レコードが削除された場合にだけエラーが返されます。


EOS プロパティ (ADO)

EOS プロパティ

現在の位置がストリームの末尾かどうかを示します。

戻り値

現在の位置がストリームの末尾かどうかを示すブール型 (Boolean) の値を返します。ストリームにバイトがなくなると EOS は True を返し、現在の位置の後にもバイトがあると False を返します。

ストリーム位置の末尾を設定するには、SetEOS メソッドを使います。現在の位置を確認するには、Position プロパティを使います。


ExecuteOptions プロパティ (RDS)

非同期実行ができるかどうかを示します。

設定値と戻り値

次のいずれかの値を設定します。また、値の取得も可能です。

定数 | 説明
adcExecSync | 次回の Recordset の更新を同期的に実行します。
adcExecAsync | 既定値です。次回の Recordset の更新を非同期的に実行します。

注意 これらの定数を使うクライアント側の各実行可能ファイルは、その定数を宣言する必要があります。C:\Program Files\Common Files\System\MSADC フォルダの Adcvbs.inc ファイルから、定数の宣言をコピーして貼り付けることができます。

解説

ExecuteOptions に adcExecAsync が設定されている場合、RDS.DataControl オブジェクトの Recordset における次の Refresh 呼び出しは非同期的に実行されます。

RDS.DataControl オブジェクトの Recordset を変更する可能性のある別の非同期操作の実行中に、Reset、Refresh、SubmitChanges、CancelUpdate、または Recordset を呼び出そうとすると、エラーになります。

非同期操作中にエラーが発生すると、RDS.DataControl オブジェクトの ReadyState 値は adcReadyStateLoaded から adcReadyStateComplete に変更され、Recordset プロパティの値は Nothing を維持します。


FetchOptions プロパティ (RDS)

非同期フェッチの種類を示します。

設定値と戻り値

次のいずれかの値を設定します。また、値の取得も可能です。

定数 | 説明
adcFetchUpFront | Recordset のすべてのレコードは、制御がアプリケーションに返される前にフェッチされます。アプリケーションで Recordset を処理するには、Recordset 全体をフェッチする必要があります。
adcFetchBackground | レコードの最初のバッチをフェッチし終わると、制御をアプリケーションに戻すことができます。Recordset を読み取って、最初のバッチでフェッチできなかったレコードにアクセスできるのは、要求されているレコードのフェッチが終わり、制御がアプリケーションに戻ってからです。
adcFetchAsync | 既定値です。レコードがバックグラウンドでフェッチされるとき、制御は直ちにアプリケーションに戻ります。まだフェッチされていないレコードをアプリケーションが読み取ろうとすると、要求されているレコードに最も近いレコードが読み取られ、制御がすぐに戻り、現在の Recordset の最終位置に到達したことを示します。たとえば、MoveLast の呼び出しでは、Recordset を更新中のレコードがあっても、カレント レコードの位置は実際にフェッチされたレコードの最後の位置に移動します。

注意 これらの定数を使うクライアント側の各実行可能ファイルは、その定数を宣言する必要があります。C:\Program Files\Common Files\System\MSADC フォルダの Adcvbs.inc ファイルから、定数の宣言をコピーして貼り付けることができます。

解説

Web アプリケーションでは、より高いパフォーマンスを得るため、一般には adcFetchAsync (既定値) を使います。コンパイルされたクライアント アプリケーションでは、一般には adcFetchBackground を使います。


Filter プロパティ (ADO)

Filter プロパティ

Recordset のデータに対するフィルタを示します。

設定値と戻り値

次の中から 1 つを含む、バリアント型 (Variant) の値を設定します。また、値の取得も可能です。

  • 検索文字列 - AND 演算子または OR 演算子で連結された、1 つ以上の句で構成される文字列です。

  • ブックマーク配列 - Recordset オブジェクトのレコードを指示する固有のブックマーク値の配列です。

  • FilterGroupEnum 値です。

解説

Filter プロパティは、Recordset オブジェクトで特定のレコードを抽出するときに使います。フィルタをかけた後の Recordset がカレント カーソルになります。AbsolutePosition、AbsolutePage、RecordCount、PageCount など、カレント カーソルに基づいて値を返すその他のプロパティが影響を受けます。これは、Filter プロパティに特定の値を設定すると、カレント レコードが新しい値を満たす最初のレコードに移動するからです。

検索文字列は、FieldName-Operator-Value 形式の句で構成されます (例: "LastName = 'Smith'")。AND や OR で句どうしを組み合わせれば、複合句を作成できます (例: "LastName = 'Smith' AND FirstName = 'John'" または "LastName = 'Smith' OR LastName = 'Jones'")。検索文字列を指定するには、次の点に注意してください。

  • FieldName は、Recordset の有効なフィールド名とします。フィールド名にスペースを含める場合は、名前を角かっこで囲みます。

  • Operator には次の中から 1 つを選択して使用します。<、>、<=、>=、<>、=、または LIKE。

  • Value は、フィールド値と比較される値 (たとえば、'Smith'、#8/24/95#、12.345、または $50.00) のことです。文字列には引用符を、日付にはシャープ記号 (#) を使います。数値では、小数点、ドル記号、および指数表記を使えます。Opeartor が LIKE の場合、Value にワイルドカードを使えます。使えるワイルドカードはアスタリスク (*) と百分率記号 (%) のみとし、文字列の最後に指定します。Value に Null は使えません。

    注意 単一引用符 (') をフィルタ Value に組み込むには、2 つの単一引用符を使って 1 つの単一引用符を表します。たとえば、O'Malley にフィルタを設定するには、検索文字列は、"col1 = 'O''Malley'" とします。フィルタ値の先頭と末尾に単一引用符を組み込むには、シャープ記号 (#) で文字列を囲みます。たとえば、'1' にフィルタを設定するには、検索文字列は "col1 = #'1'#" とします。

  • AND と OR には優先順位はありません。句はかっこでグループにまとめることができます。ただし、次のように、OR で句を結合してできた句のグループを、AND を使ってさらに別の句と結合することはできません。
    (LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'

  •
この場合は、フィルタを次のように構成します。
    (LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')

    •

  •
LIKE を使った句では、LastName Like '*mit*' のように、パターンの始めと終わりにワイルドカードを指定できます。または、LastName Like 'Smit*' のように、パターンの終わりにだけ使うこともできます。
    •

フィルタ定数を使うと、バッチ更新モードでレコード間に競合が発生しても、最後の UpdateBatch メソッドの呼び出しで変更されたレコードだけを表示するなどの方法で、簡単に解消できます。

たとえば、レコードがほかのユーザーによって既に削除されている場合など、基になるデータとの競合が原因で、Filter プロパティの設定に失敗する場合があります。この場合、プロバイダは Errors コレクションに警告を返しますが、プログラムの実行は停止しません。要求したすべてのレコードで競合が発生した場合にのみ、実行時エラーが発生します。競合が発生したレコードの位置を調べるには、Status プロパティを使います。

Filter プロパティに長さ 0 の文字列 ("") を設定すると、adFilterNone 定数を使った場合と同じ結果が得られます。

Filter プロパティを設定すると、Recordset 内のレコードで、フィルタ処理済みのサブセット内の最初のレコードにカレント レコードの位置が移動します。同様に、Filter プロパティを消去すると、カレント レコードの位置は Recordset の最初のレコードに移動します。

Filter プロパティに使う配列の作成に利用するブックマーク値については、Bookmark プロパティを参照してください。


FilterColumn プロパティ (RDS)

フィルタ選択条件を評価する列を示します。

構文

DataControl.FilterColumn = String

パラメータ

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

String フィルタ選択条件を評価する列を指定する文字列型 (String) の値を指定します。フィルタ選択条件は FilterCriterion プロパティで指定します。

解説

SortColumn プロパティ、SortDirection プロパティ、FilterValue プロパティ、FilterCriterion プロパティ、および FilterColumn プロパティは、クライアント側のキャッシュ上で、ソート機能およびフィルタ機能を提供します。ソート機能では、列の値でレコードが並べ替えられます。フィルタ機能は、完全な Recordset をキャッシュに維持したまま、検索の抽出条件に基づいてレコードのサブセットを表示します。Reset メソッドは、抽出条件を実行し、現在の Recordset を更新可能な Recordset に置き換えます。


FilterCriterion プロパティ (RDS)

フィルタ値に使う評価演算子を表します。

構文

DataControl.FilterCriterion = String

パラメータ

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

String レコードに FilterValue の評価演算子を指定する文字列型 (String) の値を指定します。次のいずれかを指定します。<、<=、>、>=、=、または <>。

解説

SortColumn プロパティ、SortDirection プロパティ、FilterValue プロパティ、FilterCriterion プロパティ、および FilterColumn プロパティは、クライアント側のキャッシュ上で、ソート機能およびフィルタ機能を提供します。ソート機能では、列の値でレコードが並べ替えられます。フィルタ機能は、完全な Recordset をキャッシュに維持したまま、検索の抽出条件に基づいてレコードのサブセットを表示します。Reset メソッドは、抽出条件を実行し、現在の Recordset を更新可能な Recordset に置き換えます。

演算子 "!=" は FilterCriterion では無効です。"<>" を使います。

フィルタ プロパティとソート プロパティを両方設定して Reset メソッドを呼び出すと、行セットでは最初にフィルタが実行され、次にソートが実行されます。昇順ソートでは Null 値が最初に、降順ソートでは Null 値が最後になります (昇順が既定の動作です)。


FilterValue プロパティ (RDS)

レコードをフィルタ抽出する値を示します。

構文

DataControl.FilterValue = String

パラメータ

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

String レコードのフィルタ抽出用のデータ値 (たとえば 'Programmer' または 125) を表す文字列型 (String) の値を指定します。

解説

SortColumn プロパティ、SortDirection プロパティ、FilterValue プロパティ、FilterCriterion プロパティ、および FilterColumn プロパティは、クライアント側のキャッシュ上で、ソート機能とフィルタ機能を提供します。ソート機能では、列の値でレコードが並べ替えられます。フィルタ機能は、完全な Recordset をキャッシュに維持したまま、検索の抽出条件に基づいてレコードのサブセットを表示します。Reset メソッドは、抽出条件を実行し、現在の Recordset を更新可能な Recordset に置き換えます。

Null 値は型の不一致エラーになります。


Handler プロパティ (RDS)

RDSServer.DataFactory の機能と、"ハンドラ" が使うパラメータを拡張する、サーバー側のカスタマイズ プログラム (ハンドラ) の名前を示します。

構文

DataControl.Handler = String

パラメータ

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

String ハンドラ名と、カンマで区切られたパラメータ (たとえば、"handlerName,parm1,parm2,...,parm N") をすべて含む文字列型 (String) の値を指定します。

解説

このプロパティは、カスタマイズをサポートします。この機能には、CursorLocation プロパティに adUseClient を設定する必要があります。

ハンドラの名前とパラメータは、カンマ (",") で区切ります。String 内にセミコロン (";") が含まれていると、予期できない結果が発生する場合があります。また、IDataFactoryHandler インターフェイスをサポートしていれば、独自のハンドラを作成できます。

既定のハンドラ名は MSDFMAP.Handler であり、この既定パラメータは MSDFMAP.INI という名のカスタマイズ ファイルです。このプロパティは、サーバー管理者が作成した別のカスタマイズ ファイルを呼び出すときに使います。

Handler プロパティを設定せずに ConnectionString プロパティにハンドラとパラメータを指定するには、"Handler=handlerName,parm1,parm2,...;" と指定します。


HelpContext、HelpFile プロパティ (ADO)

HelpContext、HelpFile プロパティ

Error オブジェクトに関連するヘルプ ファイルおよびヘルプ トピックを示します。

戻り値

  • HelpContextID - ヘルプ ファイルのトピックのコンテキスト ID を長整数型 (Long) の値で返します。

  • HelpFile - ヘルプ ファイルへの完全なパスを示す文字列型 (String) の値を返します。

解説

HelpFile プロパティでヘルプ ファイルが指定されている場合、HelpContext プロパティを使って特定のヘルプ トピックを自動的に表示できます。該当するヘルプ トピックがない場合、HelpContext プロパティは 0 を返し、HelpFile プロパティは長さ 0 の文字列 ("") を返します。


Index プロパティ (ADO)

Index プロパティ

Recordset オブジェクトに対して現在有効なインデックス名を示します。

設定値と戻り値

文字列型 (String) の値を、インデックス名として設定します。また、値の取得も可能です。

解説

Index プロパティで指定したインデックスは、Recordset オブジェクトの基になるベース テーブルで、事前に宣言しておきます。つまり、インデックスは ADOX Index オブジェクトとしてプログラム的に宣言しておくか、ベース テーブルの作成時に宣言しておきます。

インデックスを設定できないと、実行時エラーが発生します。次の条件では、Index プロパティは設定できません。

  • WillChangeRecordset イベント ハンドラまたは RecordsetChangeComplete イベント ハンドラ内

  • Recordset が操作を実行中 (State プロパティで判定できます)

  • Filter プロパティでフィルタに Recordset が設定済み

Recordset が閉じていれば、Index プロパティは正常に設定できますが、基になるプロバイダがインデックスをサポートしていない場合は、Recordset が正常に開かなかったり、インデックスを使えないことがあります。

インデックスを設定すると、現在の行の位置が変化することがあります。その場合、AbsolutePosition プロパティが更新され、WillChangeRecordset イベント、RecordsetChangeComplete イベント、WillMove イベント、および MoveComplete イベントが生成されます。

インデックスを設定し、LockType プロパティが adLockPessimistic または adLockOptimistic の場合、UpdateBatch 操作が暗黙的に実行されます。これによって、カレントと、影響下のグループが解放されます。既存のフィルタがすべて解放され、現在の行の位置は、並べ替えられた Recordset の最初の行に移動します。

Index プロパティは、Seek メソッドと併用します。基になるプロバイダが Index プロパティをサポートしていない場合、したがって Seek メソッドをサポートしていない場合は、代わりに Find メソッドを使ってください。Recordset オブジェクトがインデックスをサポートしているかどうかを調べるには、Supports(adIndex) メソッドを使います。

共にインデックスを扱いますが、組み込みの Index プロパティは、ダイナミック Optimize プロパティとは無関係です。


InternetTimeout プロパティ (RDS)

要求がタイムアウトするまでの待機時間をミリ秒単位で示します。

設定値と戻り値

要求がタイムアウトになるまでのミリ秒数単位の時間を表す長整数型 (Long) 値を設定します。また、値の取得も可能です。

解説

このプロパティは HTTP または HTTPS プロトコルで送信された要求にのみ適用されます。

3 層環境で要求すると、実行が終了するまで数分間かかることがあります。このプロパティを使って長時間かかる要求に対する待機時間を指定します。


IsolationLevel プロパティ (ADO)

IsolationLevel プロパティ

Connection オブジェクトの分離レベルを示します。

設定値と戻り値

IsolationLevelEnum の値を設定します。また、値の取得も可能です。既定値は adXactChaos です。

解説

IsolationLevel プロパティでは、Connection オブジェクトの分離レベルを設定します。設定値は、次に BeginTrans メソッドを呼び出すまで有効になりません。要求した分離レベルを使えない場合、プロバイダはその次に高い分離レベルを返します。

IsolationLevel プロパティは読み取り/書き込みになっています。

RDS での使用 クライアント側 Connection オブジェクトで使う場合、IsolationLevel プロパティは adXactUnspecified にのみ設定できます。

ユーザーはクライアント側のキャッシュ上の、接続されていない Recordset オブジェクトで作業するため、マルチユーザーの場合は問題になることがあります。たとえば、2 人のユーザーが同じレコードを更新しようとした際、RDS は単純に先に操作を行ったユーザーの更新を受け付けます。2 番目のユーザーの更新要求はエラーになって失敗します。


Item プロパティ (ADO)

Item プロパティ

コレクションの特定のメンバをその名前またはインデックスで示します。

構文

Set object = collection.Item (Index )

戻り値

オブジェクトへの参照を返します。

パラメータ

Index コレクション内のオブジェクト名またはインデックスと評価されるバリアント型 (Variant) の値を指定します。

解説

コレクション内の特定のオブジェクトを返すには、Item プロパティを使います。コレクション内で Item が Index 引数に対応するオブジェクトを見つけられない場合、エラーが発生します。また、コレクションの中には名前付きオブジェクトをサポートしていないものもあります。このようなコレクションでは、その序数参照を使う必要があります。

Item プロパティはすべてのコレクションの既定プロパティなので、次のどちらの構文形式でも同じ結果が得られます。

collection.Item (Index)

collection (Index)


LineSeparator プロパティ (ADO)

LineSeparator プロパティ

テキスト Stream オブジェクトで行区切り文字に使うバイナリ文字を示します。

設定値と戻り値

Stream で使う行区切り文字を示す LineSeparatorsEnum 値を設定します。また、値の取得も可能です。既定は adCRLF です。

解説

LineSeparator は、テキスト Stream の内容を読み取るとき行の解釈に使います。行は、SkipLine メソッドで読み飛ばすこともできます。

LineSeparator は、テキスト Stream オブジェクト (Type は adTypeText) にだけ使います。Type が adTypeBinary の場合、このプロパティは無視されます。


LockType プロパティ (ADO)

LockType プロパティ

編集時にレコードに適用されるロックの種類を示します。

設定値と戻り値

LockTypeEnum の値を設定します。また、値の取得も可能です。既定値は adLockReadOnly です。

解説

プロバイダが Recordset を開くときのロックの種類は、Recordset を開く前に LockType プロパティで設定します。開いている Recordset オブジェクトで使っているロックの種類は、このプロパティを取得すれば確認できます。

プロバイダによってはすべての種類のロックをサポートしていないものもあります。要求した LockType の設定値がサポートされていない場合、ほかの種類のロックに置き換えられます。Recordset オブジェクトで実際に使用可能なロック機能を調べるには、adUpdate と adUpdateBatch を使って Supports メソッドを呼び出します。

CursorLocation プロパティに adUseClient が設定されている場合、adLockPessimistic 設定はサポートされません。サポートされていない値を設定してもエラーにはなりませんが、サポートされる LockType のうち、最も近いロックが使用されます。

LockType プロパティは、Recordset が閉じている場合は読み取り/書き込みになっていますが、開いている場合は読み取り専用になります。

Remote Data Service での使用 クライアント側 Recordset オブジェクトで使うとき、LockType プロパティは adLockOptimisticBatch にのみ設定可能です。


MarshalOptions プロパティ (ADO)

MarshalOptions プロパティ

どのレコードがサーバーにマーシャリングされるかを示します。

設定値と戻り値

MarshalOptionsEnum を値を設定します。また、値の取得も可能です。既定値は adMarshalAll です。

解説

クライアント側 Recordset を使うとき、クライアントで修正されたレコードは、マーシャリングを呼び出す技術を使い中間層 または Web サーバーに書き込まれます。マーシャリングとは、スレッドまたはプロセスの境界を越えてインターフェイス メソッドのパラメータをパッケージ化して送信するプロセスです。MarshalOptions プロパティを設定すると、修正されたリモート データをマーシャリングして中間層や Web サーバーを更新するときのパフォーマンスが向上します。

Remote Data Service での使用 このプロパティはクライアント側 Recordset でのみ使います。


MaxRecords プロパティ (ADO)

MaxRecords プロパティ

クエリから Recordset に返される最大レコード数を示します。

設定値と戻り値

返される最大レコード数を示す長整数型 (Long) の値を設定します。また、値の取得も可能です。既定値は 0 (制限なし) です。

解説

MaxRecords プロパティは、プロバイダがデータ ソースから返すレコード数を制限するために使います。このプロパティの既定値は 0 で、プロバイダが要求されたすべてのレコードを返すことを意味します。

MaxRecords プロパティは、Recordset が閉じている場合は読み取り/書き込みになっていますが、開いている場合は読み取り専用になります。


Mode プロパティ (ADO)

Mode プロパティ

Connection オブジェクト、Record オブジェクト、または Stream オブジェクトのデータの変更権限を示します。

設定値と戻り値

ConnectModeEnum の値を設定します。また、値の取得も可能です。Connection の既定値は adModeUnknown です。Record オブジェクトの既定値は adModeRead です。(ソース、または Record の既定 Stream として URL で開かれた) 基になるソースに関連付けられている Stream の既定値は adReadOnly です。(メモリ内でインスタンス化された) 基になるソースに関連付けられていない Stream の既定値は adModeUnknown です。

解説

現在の接続でプロバイダが使うアクセス権は、Mode プロパティを使って設定、または値を取得します。Mode プロパティは、Connection オブジェクトが閉じている場合のみ設定できます。

Stream オブジェクトでは、アクセス モードを指定しないと、Stream オブジェクトを開くときに使うソースのモードを継承します。たとえば、Record オブジェクトから Stream を開くと、既定値で、Record と同じモードで開きます。

このプロパティは、オブジェクトが閉じているときは読み取り/書き込みになり、オブジェクトが開いているときは読み取り専用になります。

Remote Data Service での使用 クライアント側の Connection オブジェクトで使うとき、Mode プロパティは adModeUnknown にのみ設定できます。


Name プロパティ (ADO)

Name プロパティ

オブジェクトの名前を示します。

設定値と戻り値

オブジェクトの名前を示す文字列型 (String) の値を設定します。また、値の取得も可能です。

解説

Name プロパティを使って、Command、Field、Parameter、または Property オブジェクト名を代入または取得します。

値は Command オブジェクトでは読み取り/書き込みになり、Property オブジェクトでは読み取り専用になります。

Field オブジェクトの場合、Name は一般には読み取り専用です。ただし、Record の Fields コレクションに追加された新規 Field オブジェクトの場合、Field の Value プロパティが指定されていて、Fields コレクションの Update メソッドによる新規 Field の追加にデータ プロバイダが成功した場合に限り、Name は読み取り/書き込みになります。

Parameters コレクションに追加されていない Parameter オブジェクトでは、Name プロパティは読み取り/書き込みになります。追加された Parameter オブジェクトとその他のオブジェクトでは、Name プロパティは読み取り専用です。名前はコレクション内で一意でなくてもかまいません。

オブジェクトの Name プロパティをその序数参照で取得することができ、その後では、その名前で直接オブジェクトを参照できます。たとえば、rstMain.Properties(20).Name で Updatability を取得すると、次からはこのプロパティを rstMain.Properties("Updatability") で参照できます。


NativeError プロパティ (ADO)

NativeError プロパティ

所定の Error オブジェクトで、プロバイダ固有のエラー コードを示します。

戻り値

エラー コードを示す長整数型 (Long) 値を返します。

解説

NativeError プロパティを使って、特定の Error オブジェクトでデータベース固有のエラー情報を取得します。たとえば、Microsoft ODBC Provider for OLE DB と Microsoft SQL Server データベースを使う場合、SQL Server から送信されたネイティブ エラー コードは、ODBC と ODBC Provider を経由して ADO の NativeError プロパティに渡されます。


Number プロパティ (ADO)

Number プロパティ

Error オブジェクトを識別する数値を示します。

戻り値

ErrorValueEnum 値のいずれかに対応する長整数型 (Long) の値を返します。

解説

発生したエラーを調べるには、Number プロパティを使います。プロパティの値は、エラー条件に対応した固有の数値です。

Errors コレクションは、16 進形式 (例: 0x80004005) または長整数型 (例: 2147467259) で HRESULT を返します。これらの HRESULT は、OLE DB や場合によっては OLE 自体など、基になるコンポーネントから生成されます。これらの数値の詳細については、「OLE DB Programmer's Reference」の「Chapter 16」を参照してください。


NumericScale プロパティ (ADO)

NumericScale プロパティ

Parameter オブジェクトまたは Field オブジェクトで、数値型 (Numeric) の値を示します。

設定値と戻り値

数値を処理するときの小数点以下の桁数を示す Byte 値を設定します。また、値の取得も可能です。

解説

数値型の Parameter オブジェクトまたは Field オブジェクトの値の小数点以下の桁数は、NumericScale プロパティを使って指定します。

Parameter オブジェクトでは、NumericScale プロパティは読み取り/書き込みになっています。

Field オブジェクトの場合、NumericScale は一般には読み取り専用です。ただし、Record の Fields コレクションに追加された新規 Field オブジェクトの場合、Field の Value プロパティが指定されていて、Fields コレクションの Update メソッドによる新規 Field の追加にデータ プロバイダが成功した場合に限り、NumericScale は読み取り/書き込みになります。


OriginalValue プロパティ (ADO)

OriginalValue プロパティ

変更前にレコードにあった Field 値を示します。

戻り値

変更前のフィールドの値をバリアント型 (Variant) の値で返します。

解説

カレント レコードからフィールドの元の値を返すには、OriginalValue プロパティを使います。

"即時更新モード" (Update メソッドを呼び出すと、基になるデータ ソースに対してプロバイダが変更を書き込むモード) では、OriginalValue プロパティは、変更前 (前回の Update メソッドの呼び出し以後) のフィールド値を返します。この値は、CancelUpdate メソッドが Value プロパティを置き換えるときに使う値と同じです。

"バッチ更新モード" (複数の変更がプロバイダによってキャッシュされ、UpdateBatch メソッドを呼び出すと、基になるデータ ソースに書き込まれるモード) では、OriginalValue プロパティは、変更前 (前回の UpdateBatch メソッドの呼び出し以後) のフィールド値を返します。この値は、Value プロパティを置き換えるために CancelBatch メソッドが使う値と同じです。UnderlyingValue プロパティと共にこのプロパティを使えば、バッチ更新時の競合を解消することができます。

Record

Record オブジェクトの場合、Update の呼び出し前に追加されるフィールドでは、OriginalValue プロパティは空になります。


PageCount プロパティ (ADO)

PageCount プロパティ

Recordset オブジェクトに含まれるデータのページ数を示します。

戻り値

Recordset のページ数を表す長整数型 (Long) の値を返します。

解説

Recordset オブジェクトに存在するデータのページ数を調べるには、PageCount プロパティを使います。"ページ" とは、PageSize プロパティの設定値のサイズのレコード グループです。最後のページのレコード数が PageSize の値より少なく、ページが不完全な場合でも、PageCount の値に追加ページとして数えられます。Recordset オブジェクトがこのプロパティをサポートしない場合は値が -1 になり、PageCount が確認できないことを示します。

ページ機能の詳細については、PageSize プロパティと AbsolutePage プロパティを参照してください。


PageSize プロパティ (ADO)

PageSize プロパティ

Recordset の 1 ページを構成するレコード数を示します。

設定値と戻り値

1 ページのレコード数を示す長整数型 (Long) の値を設定します。また、値の取得も可能です。既定値は 10 です。

解説

データの論理ページを構成するレコード数を調べるには、PageSize プロパティを使います。ページ サイズを設定すると、AbsolutePage プロパティを使って、特定のページの最初のレコードに移動できます。このプロパティは、一度にまとまった数のレコードを参照しながら、ページ間を移動する場合など、Web サーバーで便利です。

このプロパティはいつでも設定でき、その設定値は特定ページの最初のレコード位置の計算に使われます。


ParentURL プロパティ (ADO)

ParentURL プロパティ

カレント Record オブジェクトの親 Record を指定する絶対 URL 文字列を示します。

戻り値

親 Record の URL を示す文字列型 (String) の値を返します。

解説

ParentURL プロパティは、Record オブジェクトで使うソースに依存します。たとえば、ActiveConnection プロパティが参照するディレクトリの相対パス名を格納するソースと共に、Record を開くことができます。

仮に "second" が "first" の下のフォルダであるとします。Record オブジェクトは、次のように開きます。

record.ActiveConnection = "http://first"
record.Open "second"

ParentURL プロパティの値は "http://first" であり、ActiveConnection と同じです。

ソースは、"http://first/second" のような絶対 URL でもかまいません。ParentURL プロパティは、"second" の上のレベル、"http://first" です。

次の場合にプロパティは Null になります。

  • たとえば、Record オブジェクトがディレクトリのルートを表す場合、カレント オブジェクトに親はありません。

  • Record オブジェクトは、データベースから取得した Recordset の行など URL で指定できないエンティティを表します。

このプロパティは読み取り専用です。

注意 このプロパティをサポートしているのは、Microsoft OLE DB Provider for Internet Publishing などドキュメント ソース プロバイダだけです。詳細については、「レコードとプロバイダ供給のフィールド」を参照してください。


Position プロパティ (ADO)

Position プロパティ

Stream オブジェクト内のカレントの位置を示します。

設定値と戻り値

ストリームの先頭からカレントの位置までのオフセットを示す長整数型 (Long) の値を、バイト単位で設定します。また、値の取得も可能です。既定値は、ストリームの最初のバイトを表す 0 です。

解説

カレントの位置は、ストリームの末尾を超えて移動できます。ストリームの末尾を超えてカレントの位置を指定すると、Stream オブジェクトの Size もそれに応じて増えます。こうして追加される新しいバイトは Null になります。

注意 Position の単位は常にバイトです。マルチバイト文字セットを使うテキスト ストリームでは、すべての文字が同じバイト数である文字セットを使う場合、Position は文字数 -1 に 1 文字のバイト数を乗じた値です。たとえば、2 バイト文字セットの場合、最初の文字は、位置 0、2 番目の文字は、位置 2、3 番目の文字は、位置 4 のように続きます。

Stream のカレントの位置は負の数では変更できません。Position には正の数しか使えません。

読み取り専用 Stream オブジェクトの場合、Position を Stream の Size より大きく設定するとエラーになります。これで Stream のサイズや Stream の内容が変化することはありません。ただし、Position の値が意味のない値になるので、このような操作はしないでください。


Precision プロパティ (ADO)

Precision プロパティ

Parameter オブジェクトの数値型 (Numeric) の値、または数値型の Field オブジェクトの精度を示します。

設定値と戻り値

値を表す場合の最大桁数を示すバイト型 (Byte) の値を設定します。また、値の取得も可能です。

解説

数値型の Parameter オブジェクトまたは Field オブジェクトで使用される数値の最大桁数を指定するには、Precision プロパティを使います。

Parameter オブジェクトでは、値は読み取り/書き込みです。

Field オブジェクトの場合、Precision は一般には読み取り専用です。ただし、Record の Fields コレクションに追加された新規 Field オブジェクトの場合、Field の Value プロパティが指定されていて、Fields コレクションの Update メソッドの呼び出しで新規 Field の追加にデータ プロバイダが成功した場合に限り、Precision は読み取り/書き込みになります。


Prepared プロパティ (ADO)

Prepared プロパティ

コンパイルされたバージョンのコマンドを、実行前に保存するかどうかを示します。

設定値と戻り値

ブール型 (Boolean) の値を設定します。また、値の取得も可能です。True に設定すると、コマンドの準備の必要性を示します。

解説

Command オブジェクトの最初の実行前に CommandText プロパティで指定したクエリの準備 (またはコンパイル済み) バージョンをプロバイダで保存するには、Prepared プロパティを使います。その場合、最初のコマンド処理が遅くなる場合がありますが、プロバイダでコマンドをコンパイルしておけば、その後の実行ではコンパイル バージョンを使えるので、結果的にパフォーマンス面で有利です。

プロパティが False の場合、プロバイダはコンパイル バージョンを作成せずに直接 Command オブジェクトを実行します。

プロバイダがコマンドの準備をサポートしていない場合に、このプロパティに True を設定すると、ただちにエラーが返されることがあります。エラーが返されない場合は、コマンドを準備する要求が無視され、Prepared プロパティに False が設定されます。


Provider プロパティ (ADO)

Provider プロパティ

Connection オブジェクトのプロバイダ名を示します。

設定値と戻り値

プロバイダ名を示す文字列型 (String) の値を設定します。また、値の取得も可能です。

解説

接続用のプロバイダ名を設定または返すには、Provider プロパティを使います。このプロパティは、ConnectionString プロパティの内容または Open メソッドの ConnectionString 引数で設定することもできますが、Open メソッドの呼び出し中に 1 つ以上の場所にプロバイダを指定すると、予期せぬ結果が生じる可能性があります。プロバイダが指定されていない場合、プロパティは既定の MSDASQL (Microsoft OLE DB Provider for ODBC) になります。

Provider プロパティは、接続が閉じている場合は読み取り/書き込みになり、接続が開いている場合は読み取り専用になります。Connection オブジェクトを開くか、Connection オブジェクトの Properties コレクションにアクセスするまで、設定値は有効になりません。設定が無効な場合、エラーが発生します。


ReadyState プロパティ (RDS)

DataControl オブジェクトがデータを取得して Recordset オブジェクトに格納するときの、進行状況を示します。

設定値と戻り値

次のいずれかの値を設定、または返します。

値 | 説明
adcReadyStateLoaded | カレント クエリは実行中で、行はまだフェッチされていません。RDS.DataControl オブジェクトの Recordset は使えません。
adcReadyStateInteractive | カレント クエリが取得する最初の行セットは、DataControl オブジェクトの Recordset に格納され、使用可能です。残りの行はフェッチ中です。
adcReadyStateComplete | カレント クエリが取得した行は、DataControl オブジェクトの Recordset にすべて格納され、使用可能です。 エラーで処理が打ち切られた場合や、Recordset オブジェクトが初期化されていない場合にもこの状態になります。

注意 これらの定数を使うクライアント側の各実行可能ファイルは、その定数を宣言する必要があります。C:\Program Files\Common Files\System\MSADC フォルダの Adcvbs.inc ファイルから、定数の宣言をコピーして貼り付けることができます。

解説

非同期クエリ操作の実行時に ReadyState プロパティの変更を監視するには、onReadyStateChange イベントを使います。プロパティの値を定期的に確認するよりもこの方法が効率的です。

非同期操作の途中でエラーが発生すると、ReadyState プロパティは adcReadyStateComplete に変更され、State プロパティは adStateExecuting から adStateClosed に変更され、Recordset オブジェクトの Value プロパティは Nothing のまま変更されません。


RecordCount プロパティ (ADO)

RecordCount プロパティ

Recordset オブジェクト内のレコード数を示します。

戻り値

Recordset のレコード数を示す長整数型 (Long) の値を返します。

解説

Recordset オブジェクトに存在するレコード数を調べるには、RecordCount プロパティを使います。ADO では、レコード数がわからない場合や、プロバイダやカーソルのタイプが RecordCount をサポートしていない場合、プロパティは -1 を返します。閉じている Recordset 上で RecordCount プロパティを取得すると、エラーが発生します。

Recordset オブジェクトがおよその位置付けまたはブックマークをサポートしている場合、つまり、Supports (adApproxPosition) または Supports (adBookmark) がそれぞれ True を返す場合、この RecordCount の値は、Recordset オブジェクトの値が完全に指定済みかどうかに関係なく、Recordset にあるレコードの正確な数を示します。Recordset オブジェクトがおよその位置付けをサポートしていない場合、すべてのレコードを取得して数えないと正確な RecordCount 値がわからないので、リソースを大量に消費する可能性があります。

レコード数を算定できるかどうかは、Recordset オブジェクトのカーソルのタイプが関係します。RecordCount プロパティは、前方スクロール タイプのカーソルの場合は -1 を返し、静的カーソルまたはキーセット カーソルの場合は実際の数を返し、動的カーソルの場合はデータ ソースに依存し -1 または実際の数を返します。


Recordset, SourceRecordset プロパティ (RDS)

Recordset、SourceRecordset プロパティ (RDS)

カスタム ビジネス オブジェクトから返された Recordset オブジェクトを示します。

構文

DataControl.SourceRecordset = Recordset

Set Recordset = DataControl.Recordset

パラメータ

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

Recordset Recordset オブジェクトを表すオブジェクト変数を指定します。

解説

カスタム ビジネス オブジェクトから返された Recordset には、SourceRecordset プロパティを設定できます。

これらのプロパティでは、カスタム プロセスを利用してアプリケーションによるバインディング処理を行います。これらのプロパティは、Recordset と直接対話できるよう、Recordset にまとめられた行セットを受け取り、プロパティの設定、または Recordset の反復操作などの動作を実行します。

SourceRecordset プロパティの設定や Recordset プロパティの読み取りは、実行時にスクリプト コード内で行えます。

読み取り専用である Recordset プロパティに対し、SourceRecordset は書き込み専用プロパティです。


RecordType プロパティ (ADO)

RecordType プロパティ

Record オブジェクトのタイプを示します。

戻り値

RecordTypeEnum の値を返します。

解説

RecordType プロパティは読み取り専用です。


Server プロパティ (RDS)

Internet Information Services (IIS) コンピュータの名前と通信プロトコルを示します。

Server プロパティは、デザイン時に RDS.DataControl オブジェクトの OBJECT タグ内で、または実行時にスクリプト コード内で設定できます。

構文

プロトコル | デザイン時の構文
HTTP | <PARAM NAME="Server" VALUE="http://awebsrvr:port">
HTTPS | <PARAM NAME="Server" VALUE="https://awebsrvr:port">
DCOM | <PARAM NAME="Server" VALUE="computername">
インプロセス | <PARAM NAME="Server" VALUE="">

プロトコル | 実行時の構文
HTTP | DataControl.Server="http://awebsrvr:port"
HTTPS | DataControl.Server="https://awebsrvr:port"
DCOM | DataControl.Server="computername"
インプロセス | DataControl.Server=""

パラメータ

awebsrvr または computername サーバーがリモート コンピュータにある場合はインターネット パス、イントラネット パス、またはコンピュータ名を含み、サーバーがローカル コンピュータにある場合は空の文字列を含む文字列型 (String) の値を指定します。

port 省略可能です。IIS サーバーとの接続用ポートを指定します。ポート番号は Internet Explorer ([表示] メニューの [インターネット オプション] をクリックし、[接続] タブをクリック)、または IIS で設定します。

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

解説

サーバーは RDS.DataControl 要求 (クエリまたは更新) を処理する場所です。既定では、すべての要求は指定サーバー上の RDSServer.DataFactory オブジェクト、MSDFMAP.Handler コンポーネント、および MSDFMAP.INI ファイルによって処理されます。このことを考慮に入れて、サーバーを変更するときは、新旧の MSDFMAP.INI ファイルの設定が調和するようにしてください。互換性がないと、一方のサーバーで成功した要求が、もう一方のサーバーで失敗することがあります。


Size プロパティ (ADO)

Size プロパティ

Parameter オブジェクトの最大サイズをバイト数または文字数で示します。

設定値と戻り値

Parameter オブジェクトの最大サイズをバイト数または文字数で示す、長整数型 (Long) の値を設定します。また、値の取得も可能です。

解説

Parameter オブジェクトの Value プロパティに対して書き取り/読み取り可能な値の最大値を調べるには、Size プロパティを使います。

Parameter オブジェクトで可変長データ型 (たとえば adVarChar などの文字列型 (String)) を指定するときは、Parameters コレクションにそのデータ型を追加する前に、オブジェクトの Size プロパティを設定します。この設定をしないとエラーが発生します。

Parameter オブジェクトが Command オブジェクトの Parameters コレクションに追加済みで、そのデータ型を可変長データ型に変更するには、Command オブジェクトの実行前に Parameter オブジェクトの Size プロパティを設定します。この設定をしないとエラーが発生します。

Refresh メソッドを実行してプロバイダからパラメータ情報を取得し、1 つ以上の可変長データ型の Parameter オブジェクトが返されると、パラメータ サイズの上限を基にメモリがパラメータに割り当てられます。実行時にこの操作が行われると、エラーが発生します。エラーを避けるには、コマンドの実行前に、これらのパラメータの Size プロパティを明示的に設定しておきます。

Size プロパティは読み取り/書き込み可能です。


Size プロパティ (ADO Stream)

ストリームのサイズをバイト数で示します。

戻り値

ストリーム サイズをバイト数で表す長整数型 (Long) の値を返します。既定値はそのストリームのサイズです。ストリーム サイズが不明の場合は -1 です。

解説

Size は、開いている Stream オブジェクトにのみ使うことができます。

注意 システム リソースによる制限を除けば、Stream オブジェクトに格納できるバイト数に制限はありません。長整数型 (Long) の値で表現できるバイト数以上のバイト数を Stream に格納すると、Size が切り詰められ、Stream の正確なサイズではなくなります。


Sort プロパティ (ADO)

Sort プロパティ

Recordset をソートする 1 つ以上のフィールド名、および各フィールドのソート順序が昇順か降順かを示します。

設定値と戻り値

ソートする Recordset のフィールド名を表す文字列型 (String) 値を設定します。また、値の取得も可能です。それぞれの名前はカンマで区切ります。名前の後には、空白、およびキーワードとして、フィールドを昇順でソートする ASC または降順でソートする DESC を追加できます。既定では、キーワードを指定しない場合、フィールドは昇順でソートされます。

解説

このプロパティでは、CursorLocation プロパティに adUseClient を設定する必要があります。インデックスがない場合、Sort プロパティに指定された各フィールドに対して一時インデックスが作成されます。

データは、物理的に並べ替えられるわけではなく、インデックスで指定されている順序でアクセスされるだけなので、ソート処理は効率的です。

Sort プロパティに空文字列を設定すると、行は元の順序にリセットされ一時インデックスは削除されます。既存のインデックスは削除されません。

Recordset に、[firstName]、[middleInitial]、[lastName] という 3 つのフィールドがあるとします。Sort プロパティに文字列 "lastName DESC, firstName ASC" を設定すると、Recordset は名字で降順にソートされ、次に名前で昇順にソートされます。ミドル ネームは無視されます。

キーワード ASC および DESC と競合するので、フィールド名に "ASC" または "DESC" は指定できません。名前が競合する場合は、Recordset を返すクエリで AS キーワードを使って、競合する名前のフィールドにエイリアスを指定してください。


SortColumn プロパティ (RDS)

どの列でレコードをソートするかを示します。

構文

DataControl.SortColumn = String

パラメータ

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

String レコードをソートする列の名前またはエイリアスを表す文字列型 (String) の値を指定します。

解説

SortColumn プロパティ、SortDirection プロパティ、FilterValue プロパティ、FilterCriterion プロパティ、および FilterColumn プロパティは、クライアント側のキャッシュ上で、ソートおよびフィルタ機能を提供します。ソート機能では、列の値でレコードが並べ替えられます。フィルタ機能は、すべての Recordset をキャッシュに保持したまま、検索の抽出条件に基づいてレコードのサブセットを表示します。Reset メソッドは、抽出条件を実行し、現在の Recordset を更新可能な Recordset に置き換えます。

Recordset でソートを実行するには、まず保留中の変更を保存します。RDS.DataControl を使っていれば、SubmitChanges メソッドが使えます。たとえば、RDS.DataControl が ADC1 と名付けられている場合、コードは ADC1.SubmitChanges のようになります。ADO の Recordset を使っていれば、UpdateBatch メソッドが使えます。CreateRecordset メソッドで作成した Recordset オブジェクトには、UpdateBatch の使用を推奨します。たとえば、コードは myRS.UpdateBatch または ADC1.Recordset.UpdateBatch のようになります。


SortDirection プロパティ (RDS)

ソート順序が昇順か降順かを示します。

構文

DataControl.SortDirection = value

パラメータ

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

Value ブール型 (Boolean) の値を指定します。True に設定されているときは、ソート順序が昇順です。False の場合は、降順です。

解説

SortColumn プロパティ、SortDirection プロパティ、FilterValue プロパティ、FilterCriterion プロパティ、および FilterColumn プロパティは、クライアント側のキャッシュ上で、ソートおよびフィルタ機能を提供します。ソート機能では、列の値でレコードが並べ替えられます。フィルタ機能は、すべての Recordset をキャッシュに保持したまま、検索の抽出条件に基づいてレコードのサブセットを表示します。Reset メソッドは、抽出条件を実行し、現在の Recordset を更新可能な Recordset に置き換えます。


Source プロパティ (ADO Error)

エラーの発生源のオブジェクト名またはアプリケーション名を示します。

戻り値

オブジェクトまたはアプリケーションの名前を示す文字列型 (String) の値を返します。

解説

エラーの発生源のオブジェクト名またはアプリケーション名を調べるには、Error オブジェクトで Source プロパティを使います。これは、オブジェクトのクラス名またはプログラム ID になる場合があります。ADO のエラーの場合、プロパティ値は ADODB.ObjectName になり、ObjectName はエラーの発生源のオブジェクト名を表します。ADOX および ADO MD の場合、値はそれぞれ ADOX.ObjectName および ADOMD.ObjectName になります。

エラーを処理するコードを記述するときは、Error オブジェクトの Source プロパティ、Number プロパティ、および Description プロパティから取得できるエラー情報を基にします。

Error オブジェクトの Source プロパティは読み取り専用です。


Source プロパティ (ADO Record)

Record オブジェクトを表すエンティティを示します。

設定値と戻り値

Record が表すエンティティを示す文字列型 (String) の値を設定します。また、値の取得も可能です。

解説

Source プロパティは、Record オブジェクトの Open メソッドの Source 引数を返します。絶対 URL または相対 URL 文字列を格納します。絶対 URL では、ActiveConnection プロパティを使わなくても Record オブジェクトを直接開くことができます。この場合、暗黙の Connection オブジェクトが作成されます。

Source プロパティには、開いている Recordset に対する参照も格納できます。この参照では、Recordset の現在の行を表す Record オブジェクトが開かれます。

ActiveConnection プロパティも設定するときは、接続範囲内にあるオブジェクトを Source プロパティで指定します。たとえば、ツリー構造の名前空間では、Source プロパティに絶対 URL が指定されている場合、接続文字列にある URL で指定したノードの適用範囲内にあるノードを指定している必要があります。Source プロパティに相対 URL が指定されている場合、ActiveConnection プロパティで示されるコンテキスト内で有効となります。

Source プロパティは、Record オブジェクトが閉じているときは読み取り/書き込み可能になり、Record オブジェクトが開いているときは読み取り専用になります。


Source プロパティ (ADO Recordset)

Recordset オブジェクトのデータ ソースを示します。

設定値と戻り値

文字列型 (String) の値または Command オブジェクトへの参照を設定します。Recordset のソースを表す文字列型 (String) のみが返されます。

解説

Recordset オブジェクトのデータ ソースを指定するには、Source プロパティを使います。Source プロパティには、Command オブジェクト変数、SQL ステートメント、ストアド プロシージャ、またはテーブル名を設定できます。

Source プロパティに Command オブジェクトを設定すると、Recordset オブジェクトの ActiveConnection プロパティは、指定された Command オブジェクトの ActiveConnection プロパティの値を継承します。ただし、Source プロパティを取得しても Command オブジェクトは返されず、代わりに Source プロパティで設定した Command オブジェクトの CommandText プロパティが返されます。

Source プロパティが SQL ステートメント、ストアド プロシージャ、またはテーブル名の場合、Open メソッドを呼び出して適切な Options 引数を渡すことにより、パフォーマンスを最適化することができます。

Source プロパティは、Recordset オブジェクトが閉じている場合は読み取り/書き込み可能になり、開いている Recordset オブジェクトでは読み取り専用になります。


SQL プロパティ (RDS)

Recordset を取得するためのクエリ文字列を示します。

SQL プロパティは、デザイン時に RDS.DataControl オブジェクトの OBJECT タグ内で、または実行時にスクリプト コード内で設定できます。

構文

デザイン時: <PARAM NAME="SQL" VALUE="QueryString">

実行時: DataControl.SQL = "QueryString"

パラメータ

QueryString 有効な SQL データ要求を含む文字列型 (String) の値を指定します。

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

解説

通常は、"Select * from NewTitles" などの SQL ステートメント (データベース サーバーの文法を使用) です。レコードを正確に照合および更新するには、更新可能なクエリに指定するフィールドは、長バイナリ型 (Long Binary) フィールドまたは計算フィールド以外のフィールドにします。

カスタム サーバー側ビジネス オブジェクトがクライアントのデータを取得する場合、SQL プロパティは省略できます。


SQLState プロパティ (ADO)

SQLState プロパティ

指定された Error オブジェクトの SQL 状態を示します。

戻り値

ANSI SQL 標準に準拠する 5 文字の文字列型 (String) の値を返してエラー コードとします。

解説

SQL ステートメントの処理中にエラーが発生した場合にプロバイダが返す 5 文字のエラー コードを読み取るには、SQLState プロパティを使います。たとえば、Microsoft OLE DB Provider for ODBC を Microsoft SQL Server データベースと共に使う場合、ODBC 固有のエラー、または Microsoft SQL Server に起因するエラーに基づいて SQL 状態のエラー コードが生成されると、ODBC エラーにマップされます。これらのエラー コードは ANSI SQL 標準に対応していますが、データ ソースによっては実装方法が異なる場合があります。


State プロパティ (ADO)

State プロパティ

対象になるオブジェクトが開いているか閉じているかを示します。

非同期メソッドを実行しているすべての対象になるオブジェクトについて、そのオブジェクトが接続、実行、取得のどの状態であるかを示します。

戻り値

ObjectStateEnum 値を表す長整数型 (Long) の値を返します。

既定値は adStateClosed です。

解説

State プロパティを使えば、オブジェクトの現在の状態をいつでも調べることができます。

オブジェクトの State プロパティの値は組み合わせることができます。たとえば、ステートメントが実行中のときは、プロパティの値は adStateOpen と adStateExecuting の組み合わせになります。

State プロパティは読み取り専用です。


Status プロパティ (ADO Field)

Field オブジェクトのステータスを示します。

戻り値

FieldStatusEnum 値を返します。既定値は adFieldOK です。

解説

このプロパティは、Recordset オブジェクトのフィールドに常に adFieldOK を返します。

Record オブジェクトの Fields コレクションに対する追加データや削除データは、Update メソッドを呼び出すまでキャッシュされます。Status プロパティでは、追加または削除に成功したフィールドを確認できます。

パフォーマンスを向上させるために、Update が呼び出されるまでスキーマの変更はキャッシュされ、その変更は共有的なバッチ更新時に反映されます。Update メソッドが呼び出さなければ、サーバーは更新されません。更新が失敗すると、エラーが返され、Status プロパティに操作とエラー ステータス コードが組み合わさった値が示されます。たとえば、adFieldPendingInsert OR adFieldPermissionDenied はその例です。Field が追加、変更、または削除されなかった理由は、各 Field の Status プロパティで確認できます。Status は、Record.Fields コレクションでのみ使うことができ、Recordset.Fields コレクションでは使えません。

Field の追加、変更、または削除時に、2 つの問題が発生する可能性があります。ユーザーが Field を削除すると、Fields コレクションから削除されたことを示すマークが付きます。ユーザーに権限が与えられていない Field を削除しようとしたために、その後の Update でエラーが返されると、Field のステータスは adFieldPermissionDenied OR adFieldPendingDelete になります。

CancelUpdate メソッドを呼び出すと、元の値が復元され、Status は adFieldOK に設定されます。

同様に、新規 Field が追加され、不適切な値が割り当てられると、Update メソッドでエラーが返されます。その場合、新規 Field は Fields コレクションに追加され、そのステータスは adFieldPendingInsert となり、場合によっては adFieldCantCreate になります。この新規 Field には適切な値を指定して、Update を再び呼び出すことができます。Update の代わりに Resync を呼び出すと、プロバイダへの再クエリが行われます。


Status プロパティ (ADO Recordset)

バッチ更新またはほかの一括操作に関するカレント レコードのステータスを示します。

戻り値

RecordStatusEnum 値の 1 つ以上の値の和を返します。

解説

バッチ更新中に変更されたレコードの保留中の変更を調べるには、Status プロパティを使います。また、Recordset オブジェクト上で Resync メソッド、UpdateBatch メソッド、または CancelBatch メソッドを呼び出す、あるいは Recordset オブジェクトの Filter プロパティにブックマーク配列を設定するなど、一括操作で処理できなかったレコードのステータスを確認する場合にも、Status プロパティを使うことができます。このプロパティを使って、特定のレコードが処理されなかった原因を調べ、問題の解決に役立てます。


StayInSync プロパティ (ADO)

StayInSync プロパティ

親の行の位置が移動したときに、基になる子のレコード (つまり、"チャプタ") への参照を変更するかどうかを、階層 Recordset オブジェクトで示します。

設定値と戻り値

ブール型 (Boolean) の値を設定します。また、値の取得も可能です。既定値は True です。True の場合は、親の Recordset オブジェクトの行が変更されるとチャプタが更新されます。False の場合は、親の Recordset オブジェクトの行が変更されても、チャプタは以前のチャプタのデータを参照し続けます。

解説

このプロパティは、Microsoft Data Shaping Service for OLE DB によってサポートされるような、階層 Recordset に適用されます。また、子の Recordset を取得する前に、このプロパティを親の Recordset で設定しておく必要があります。このプロパティにより、階層 Recordset 内での移動が簡単になります。


Type プロパティ (ADO)

Type プロパティ

Parameter オブジェクト、Field オブジェクト、または Property オブジェクトの操作の種類またはデータ型を示します。

設定値と戻り値

DataTypeEnum 値を設定します。また、値の取得も可能です。

解説

Parameter オブジェクトでは、Type プロパティは読み取り/書き込み可能です。Record の Fields コレクションに追加された新規 Field オブジェクトの場合は、Field の Value プロパティが指定されていて、データ プロバイダが Fields コレクションの Update メソッドを呼び出して新規 Field の追加に成功した場合に限り、Type は読み取り/書き込み可能になります。

それ以外のすべてのオブジェクトでは読み取り専用になります。


Type プロパティ (ADO Stream)

Stream (バイナリまたはテキスト) 内のデータの種類を示します。

設定値と戻り値

Stream オブジェクトに格納されたデータの種類を表す StreamTypeEnum 値を設定します。また、値の取得も可能です。既定値は adTypeText です。バイナリの場合は、Type を指定しないと書き込めません。

解説

Type プロパティは、現在の位置が Stream の先頭にある (Position が 0) 場合のみ、読み取り/書き込み可能であり、その他の位置の場合は、読み取り専用になります。


UnderlyingValue プロパティ (ADO)

UnderlyingValue プロパティ

データベース内の Field オブジェクトの現在の値を示します。

戻り値

Field の値を表すバリアント型 (Variant) の値を返します。

解説

データベースから現在のフィールド値を返すには、UnderlyingValue プロパティを使います。UnderlyingValue プロパティのフィールド値はトランザクションで参照でき、通常は、ほかのトランザクションによる最近の更新結果になります。そのため、Recordset に最初に返された値を表す OriginalValue プロパティとこの値が異なることがあります。

これは、Resync メソッドを使っているときと似ていますが、UnderlyingValue プロパティは、カレント レコードから特定のフィールドの値のみを返します。この値は、Resync メソッドが Value プロパティを置き換えるときに使う値と同じです。

このプロパティを OriginalValue プロパティと併用すると、バッチ更新で発生する競合を解消できます。

Record

Record オブジェクトの場合、Update の呼び出し前に追加されるフィールドでは、このプロパティは空です。


URL プロパティ (RDS)

相対 URL または絶対 URL を格納する文字列を示します。

URL プロパティは、デザイン時に DataControl オブジェクトの OBJECT タグ内で、または実行時にスクリプト コード内で設定できます。

構文

デザイン時: <PARAM NAME="URL" VALUE="Server">

実行時: DataControl.URL="Server"

パラメータ

Server 有効な URL を含む文字列型 (String) の値を指定します。

DataControl DataControl オブジェクトを表すオブジェクト変数を指定します。

解説

通常、URL は、Recordset を生成して返す .asp (Active Server Pages) ファイルを指定します。したがって、サーバー側 DataFactory オブジェクトを呼び出したり、カスタム ビジネス オブジェクトをプログラムしなくても、Recordset を取得することができます。

URL プロパティを設定しておくと、SubmitChanges は URL が指定する場所に変更を反映します。


Value プロパティ (ADO)

Value プロパティ

Field オブジェクト、Parameter オブジェクト、または Property オブジェクトに割り当てられた値を示します。

設定値と戻り値

オブジェクトの値を表すバリアント型 (Variant) の値を設定します。また、値の取得も可能です。既定値は、Type プロパティの設定によって異なります。

解説

Field オブジェクトのデータを設定または取得するとき、Parameter オブジェクトでパラメータ値を設定または取得するとき、または Property オブジェクトでプロパティを設定または取得するときは、Value プロパティを使います。Value プロパティは、状況に応じて読み取り/書き込み可能になったり、読み取り専用になります。詳細については、関連するオブジェクトのトピックを参照してください。

ADO では、Value プロパティを使って長バイナリ型 (Long Binary) データを設定したり、返すことができます。

注意 Parameter オブジェクトの場合、ADO は、プロバイダから一度だけ Value プロパティ を読み取ります。コマンドの Parameter の Value プロパティが空で、そのコマンドから Recordset を作成する場合は、Value プロパティを取得する前に、Recordset を必ず閉じてください。そうしない場合、プロバイダによっては、Value プロパティが空になり、正しい値が設定されないことがあります。

Record オブジェクトの Fields コレクションに追加された新規 Field オブジェクトの場合は、ほかの Field プロパティを指定する前に、Value プロパティを設定しておきます。まず、Value プロパティの特定の値を割り当て、Fields コレクションに Update を呼び出しておきます。これで、Type や Attributes などその他のプロパティにアクセスできます。


Version プロパティ (ADO)

Version プロパティ

ADO のバージョン番号を示します。

戻り値

バージョンを示す長整数型 (Long) を返します。

解説

ADO 実装のバージョン番号を返すには、Version プロパティを使います。

プロバイダのバージョンは、Properties コレクションのダイナミック プロパティとして利用できます。


ADO ダイナミック プロパティ

ダイナミック プロパティは、Connection オブジェクト、Command オブジェクト、または Recordset オブジェクトの Properties コレクションに追加できます。これらのダイナミック プロパティのソースは、OLE DB Provider for SQL Server などのデータ プロバイダ、または Microsoft Cursor Service for OLE DB などのサービス プロバイダです。各ダイナミック プロパティの詳細については、それぞれのデータ プロバイダまたはサービス プロバイダのマニュアルを参照してください。

「ADO ダイナミック プロパティ インデックス」では、ADO プロパティ名と、それに対応する標準 OLE DB プロバイダ ダイナミック プロパティの OLE DB 名を相互参照することができます。

特に重要なダイナミック プロパティを次に示します。前述のソースにも説明があります。ADO の特別な機能については、次に示す ADO のヘルプ トピックを参照してください。

ADO ダイナミック プロパティの概要

プロパティ | 説明
Optimize | このフィールドにインデックスを作成するかどうかを指定します。
Prompt | OLE DB プロバイダから、ユーザーに対して初期化情報を要求するかどうかを指定します。
Reshape Name | Recordset オブジェクトの名前を指定します。
Resync Command | Unique Table ダイナミック プロパティに指定されているテーブルのデータを Resync メソッドが更新するために発行する、ユーザー提供のコマンド文字列を指定します。
Unique Table、Unique Schema、Unique Catalog | Unique Table は、更新、挿入、および削除の操作ができるベース テーブルの名前を指定します。 Unique Schema は、スキーマ、またはそのテーブルの所有者の名前を指定します。 Unique Catalog は、カタログ、またはそのテーブルがあるデータベースの名前を指定します。
Update Resync | UpdateBatch メソッドに暗黙の Resync メソッド操作を実行するかを指定し、実行する場合は、その作用範囲を指定します。


ADO ダイナミック プロパティ インデックス

データ プロバイダ、サービス プロバイダ、およびサービス コンポーネントでは、開かれていない Connection オブジェクトと Recordset オブジェクトの Properties コレクションにダイナミック プロパティを追加できます。これらのオブジェクトが開かれていれば、任意のプロバイダで追加プロパティを挿入できます。これらのプロパティの一部は、「ADO ダイナミック プロパティ」で一覧で示しています。「ADO でのプロバイダの使用」では、特定のプロバイダごとに、さらに多くのプロパティの一覧があります。後述の表では、標準 OLE DB プロバイダ ダイナミック プロパティ別に、ADO 名と OLE DB 名を相互参照できます。プロバイダによっては、さらに多くのプロパティをサポートしている場合があります。プロバイダ別の固有のダイナミック プロパティについては、各プロバイダのマニュアルを参照してください。

「OLE DB Programmer's Reference」では、「Description」で ADO プロパティ名について触れています。これらの標準プロパティの詳細については、「OLE DB Programmer's Reference」を参照してください。OLE DB プロパティ名については、キーワードで検索するか、次のトピックを参照してください。

  • Appendix C: OLE DB Properties

  • Supported Properties of the Cursor Service

  • Supported Properties of the Persistence Provider

  • Supported OLE DB Properties of the Remoting Provider

解説

表中で使われている番号の意味は、次のとおりです。

(1) このプロパティは、ブール型 (Boolean) のフラグであり、指定インターフェイスを使うかどうかを表します。等価 OLE DB プロパティがある場合は、その名前を示します。

(2) "Bookmarkable" ADO プロパティは、下位互換性のために生成され、OLE DB プロパティの DBPROP_IROWSETLOCATE にマップされます。このプロパティは、ADO プロパティの IRowsetLocate に対応するプロパティと同じです。

(3) ADO プロパティ名 "Hidden Columns" は、OLE DB プロパティ名の「Description」の "Hidden Columns Count" とは異なります。

(4) 対応するものがありません。

Connection ダイナミック プロパティ

ADO プロパティ名 | OLE DB プロパティ名
Active Sessions | DBPROP_ACTIVESESSIONS
Asynchable Abort | DBPROP_ASYNCTXNABORT
Asynchable Commit | DBPROP_ASYNCTXNCOMMIT
Autocommit Isolation Levels | DBPROP_SESS_AUTOCOMMITISOLEVELS
Catalog Location | DBPROP_CATALOGLOCATION
Catalog Term | DBPROP_CATALOGTERM
Column Definition | DBPROP_COLUMNDEFINITION
Connect Timeout | DBPROP_INIT_TIMEOUT
Current Catalog | DBPROP_CURRENTCATALOG
Data Source | DBPROP_INIT_DATASOURCE
Data Source Name | DBPROP_DATASOURCENAME
Data Source Object Threading Model | DBPROP_DSOTHREADMODEL
DBMS Name | DBPROP_DBMSNAME
DBMS Version | DBPROP_DBMSVER
Extended Properties | DBPROP_INIT_PROVIDERSTRING
GROUP BY Support | DBPROP_GROUPBY
Heterogeneous Table Support | DBPROP_HETEROGENEOUSTABLES
Identifier Case Sensitivity | DBPROP_IDENTIFIERCASE
Initial Catalog | DBPROP_INIT_CATALOG
Isolation Levels | DBPROP_SUPPORTEDTXNISOLEVELS
Isolation Retention | DBPROP_SUPPORTEDTXNISORETAIN
Locale Identifier | DBPROP_INIT_LCID
Location | DBPROP_INIT_LOCATION
Maximum Index Size | DBPROP_MAXINDEXSIZE
Maximum Row Size | DBPROP_MAXROWSIZE
Maximum Row Size Includes BLOB | DBPROP_MAXROWSIZEINCLUDESBLOB
Maximum Tables in SELECT | DBPROP_MAXTABLESINSELECT
Mode | DBPROP_INIT_MODE
Multiple Parameter Sets | DBPROP_MULTIPLEPARAMSETS
Multiple Results | DBPROP_MULTIPLERESULTS
Multiple Storage Objects | DBPROP_MULTIPLESTORAGEOBJECTS
Multi-Table Update | DBPROP_MULTITABLEUPDATE
NULL Collation Order | DBPROP_NULLCOLLATION
NULL Concatenation Behavior | DBPROP_CONCATNULLBEHAVIOR
OLE DB Services | DBPROP_INIT_OLEDBSERVICES
OLE DB Version | DBPROP_PROVIDEROLEDBVER
OLE Object Support | DBPROP_OLEOBJECTS
Open Rowset Support | DBPROP_OPENROWSETSUPPORT
ORDER BY Columns in Select List | DBPROP_ORDERBYCOLUMNSINSELECT
Output Parameter Availability | DBPROP_OUTPUTPARAMETERAVAILABILITY
Pass By Ref Accessors | DBPROP_BYREFACCESSORS
Password | DBPROP_AUTH_PASSWORD
Persist Security Info | DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO
Persistent ID Type | DBPROP_PERSISTENTIDTYPE
Prepare Abort Behavior | DBPROP_PREPAREABORTBEHAVIOR
Prepare Commit Behavior | DBPROP_PREPARECOMMITBEHAVIOR
Procedure Term | DBPROP_PROCEDURETERM
Prompt | DBPROP_INIT_PROMPT
Provider Friendly Name | DBPROP_PROVIDERFRIENDLYNAME
Provider Name | DBPROP_PROVIDERFILENAME
Provider Version | DBPROP_PROVIDERVER
Read-Only Data Source | DBPROP_DATASOURCEREADONLY
Rowset Conversions on Command | DBPROP_ROWSETCONVERSIONSONCOMMAND
Schema Term | DBPROP_SCHEMATERM
Schema Usage | DBPROP_SCHEMAUSAGE
SQL Support | DBPROP_SQLSUPPORT
Structured Storage | DBPROP_STRUCTUREDSTORAGE
Subquery Support | DBPROP_SUBQUERIES
Table Term | DBPROP_TABLETERM
Transaction DDL | DBPROP_SUPPORTEDTXNDDL
User ID | DBPROP_AUTH_USERID
User Name | DBPROP_USERNAME
Window Handle | DBPROP_INIT_HWND

Recordset ダイナミック プロパティ

ADO プロパティ名 | OLE DB プロパティ名
IAccessor | DBPROP_IACCESSOR (1)
IChapteredRowset | (1)
IColumnsInfo | DBPROP_ICOLUMNSINFO (1)
IColumnsRowset | DBPROP_ICOLUMNSROWSET (1)
IConnectionPointContainer | DBPROP_ICONNECTIONPOINTCONTAINER (1)
IConvertType | (1)
ILockBytes | DBPROP_ILOCKBYTES (1)
IRowset | DBPROP_IROWSET (1)
IDBAsynchStatus | DBPROP_IDBASYNCHSTATUS (1)
IParentRowset | (1)
IRowsetChange | DBPROP_IROWSETCHANGE (1)
IRowsetExactScroll | (1)
IRowsetFind | DBPROP_IROWSETFIND (1)
IRowsetIdentity | DBPROP_IROWSETIDENTITY (1)
IRowsetInfo | DBPROP_IROWSETINFO (1)
IRowsetLocate | DBPROP_IROWSETLOCATE (1)
IRowsetRefresh | DBPROP_IROWSETREFRESH (1)
IRowsetResynch | (1)
IRowsetScroll | DBPROP_IROWSETSCROLL (1)
IRowsetUpdate | DBPROP_IROWSETUPDATE (1)
IRowsetView | DBPROP_IROWSETVIEW (1)
IRowsetIndex | DBPROP_IROWSETINDEX (1)
ISequentialStream | DBPROP_ISEQUENTIALSTREAM (1)
IStorage | DBPROP_ISTORAGE (1)
IStream | DBPROP_ISTREAM (1)
ISupportErrorInfo | DBPROP_ISUPPORTERRORINFO (1)
Access Order | DBPROP_ACCESSORDER
Append-Only Rowset | DBPROP_APPENDONLY
Asynchronous Rowset Processing | DBPROP_ROWSET_ASYNCH
Auto Recalc | DBPROP_ADC_AUTORECALC
Background Fetch Size | DBPROP_ASYNCHFETCHSIZE
Background Thread Priority | DBPROP_ASYNCHTHREADPRIORITY
Batch Size | DBPROP_ADC_BATCHSIZE
Blocking Storage Objects | DBPROP_BLOCKINGSTORAGEOBJECTS
Bookmark Type | DBPROP_BOOKMARKTYPE
Bookmarkable | DBPROP_IROWSETLOCATE (2)
Bookmarks Ordered | DBPROP_ORDEREDBOOKMARKS
Cache Child Rows | DBPROP_ADC_CACHECHILDROWS
Cache Deferred Columns | DBPROP_CACHEDEFERRED
Change Inserted Rows | DBPROP_CHANGEINSERTEDROWS
Column Privileges | DBPROP_COLUMNRESTRICT
Column Set Notification | DBPROP_NOTIFYCOLUMNSET
Column Writable | DBPROP_MAYWRITECOLUMN
Command Time Out | DBPROP_COMMANDTIMEOUT
Cursor Engine Version | DBPROP_ADC_CEVER
Defer Column | DBPROP_DEFERRED
Delay Storage Object Updates | DBPROP_DELAYSTORAGEOBJECTS
Fetch Backwards | DBPROP_CANFETCHBACKWARDS
Filter Operations | DBPROP_FILTERCOMPAREOPS
Find Operations | DBPROP_FINDCOMPAREOPS
Hidden Columns (Count) | DBPROP_HIDDENCOLUMNS (3)
Hold Rows | DBPROP_CANHOLDROWS
Immobile Rows | DBPROP_IMMOBILEROWS
Initial Fetch Size | DBPROP_ASYNCHPREFETCHSIZE
Literal Bookmarks | DBPROP_LITERALBOOKMARKS
Literal Row Identity | DBPROP_LITERALIDENTITY
Maintain Change Status | DBPROP_ADC_MAINTAINCHANGESTATUS
Maximum Open Rows | DBPROP_MAXOPENROWS
Maximum Pending Rows | DBPROP_MAXPENDINGROWS
Maximum Rows | DBPROP_MAXROWS
Memory Usage | DBPROP_MEMORYUSAGE
Notification Granularity | DBPROP_NOTIFICATIONGRANULARITY
Notification Phases | DBPROP_NOTIFICATIONPHASES
Objects Transacted | DBPROP_TRANSACTEDOBJECT
Others' Changes Visible | DBPROP_OTHERUPDATEDELETE
Others' Inserts Visible | DBPROP_OTHERINSERT
Own Changes Visible | DBPROP_OWNUPDATEDELETE
Own Inserts Visible | DBPROP_OWNINSERT
Preserve on Abort | DBPROP_ABORTPRESERVE
Preserve on Commit | DBPROP_COMMITPRESERVE
Private1 | (4)
Quick Restart | DBPROP_QUICKRESTART
Reentrant Events | DBPROP_REENTRANTEVENTS
Remove Deleted Rows | DBPROP_REMOVEDELETED
Report Multiple Changes | DBPROP_REPORTMULTIPLECHANGES
Reshape Name | DBPROP_ADC_RESHAPENAME
Resync Command | DBPROP_ADC_CUSTOMRESYNCH
Return Pending Inserts | DBPROP_RETURNPENDINGINSERTS
Row Delete Notification | DBPROP_NOTIFYROWDELETE
Row First Change Notification | DBPROP_NOTIFYROWFIRSTCHANGE
Row Insert Notification | DBPROP_NOTIFYROWINSERT
Row Privileges | DBPROP_ROWRESTRICT
Row Resynchronization Notification | DBPROP_NOTIFYROWRESYNCH
Row Threading Model | DBPROP_ROWTHREADMODEL
Row Undo Change Notification | DBPROP_NOTIFYROWUNDOCHANGE
Row Undo Delete Notification | DBPROP_NOTIFYROWUNDODELETE
Row Undo Insert Notification | DBPROP_NOTIFYROWUNDOINSERT
Row Update Notification | DBPROP_NOTIFYROWUPDATE
Rowset Fetch Position Change Notification | DBPROP_NOTIFYROWSETFETCHPOSITIONCHANGE
Rowset Release Notification | DBPROP_NOTIFYROWSETRELEASE
Scroll Backwards | DBPROP_CANSCROLLBACKWARDS
Server Cursor | DBPROP_SERVERCURSOR
Skip Deleted Bookmarks | DBPROP_BOOKMARKSKIPPED
Strong Row Identity | DBPROP_STRONGIDENTITY
Unique Catalog | DBPROP_ADC_UNIQUECATALOG
Unique Rows | DBPROP_UNIQUEROWS
Unique Schema | DBPROP_ADC_UNIQUESCHEMA
Unique Table | DBPROP_ADC_UNIQUETABLE
Updatability | DBPROP_UPDATABILITY
Update Criteria | DBPROP_ADC_UPDATECRITERIA
Update Resync | DBPROP_ADC_UPDATERESYNC
Use Bookmarks | DBPROP_BOOKMARKS


Optimize プロパティ - ダイナミック (ADO)

フィールドにインデックスを作成するかどうかを指定します。

設定値と戻り値

インデックスを作成するかどうかを表すブール型 (Boolean) の値を設定します。また、値の取得も可能です。

解説

インデックスを使用すると、Recordset の値の検索や並べ替えのパフォーマンスを向上できます。インデックスは、ADO の内部的な機能であり、アプリケーション内で明示的にアクセスしたり使用することはできません。

フィールドにインデックスを作成するには、Optimize プロパティを True に設定します。インデックスを削除するには、このプロパティを False に設定します。

Optimize は、CursorLocation プロパティが adUseClient に設定されているときに Field オブジェクトの Properties コレクションに追加されるダイナミック プロパティです。

使用例

Dim rs As New Recordset
Dim fld As Field
rs.CursorLocation = adUseClient      'Enable index creation
rs.Fields.Append "Field1", adChar, 35, adFldIsNullable
rs.Open
Set fld = rs.Fields(0)
fld.Properties("Optimize") = True    'Create an index
fld.Properties("Optimize") = False   'Delete an index


Prompt プロパティ - ダイナミック (ADO)

OLE DB プロバイダから、ユーザーに対して初期化情報を要求するかどうかを指定します。

設定値と戻り値

ConnectPromptEnum の値を設定します。また、値の取得も可能です。

解説

Prompt は、OLE DB プロバイダによって Connection オブジェクトの Properties コレクションに追加されるダイナミック プロパティです。初期化情報を要求する場合、OLE DB プロバイダでは、一般にダイアログ ボックスをユーザーに表示します。

Connection が閉じると、Connection オブジェクトのダイナミック プロパティは失われます。既定値以外の値を使うには、Connection を開く前に Prompt プロパティをリセットする必要があります。

注意 ユーザーがダイアログ ボックスに応答できない状況でプロバイダからプロンプトを表示するような指定はしないでください。たとえば、アプリケーションを、ユーザーの使用しているクライアント コンピュータではなくサーバー システムで実行している場合や、ユーザーがログオンしていないシステムでアプリケーションが実行している場合、ユーザーは応答できません。このような状況では、アプリケーションが応答を待って無限に待機することになり、ロックしたような状態になります。

使用例

Dim cn As Connection
Set cn = New Connection
cn.Provider = "SQLOLEDB"
cn.Properties("Prompt") = adPromptNever    ' do not prompt the user


Reshape Name プロパティ - ダイナミック (ADO)

Recordset オブジェクトの名前を指定します。

戻り値

Recordset の名前である文字列型 (String) の値を返します。

解説

名前は、接続中、または Recordset が閉じられるまで保持されます。

Reshape Name プロパティは、主に Microsoft Data Shaping Service for OLE DB サービス プロバイダのリシェイプ機能で使用されます。リシェイプでは一意の名前を使います。

このプロパティは読み取り専用ですが、Recordset の作成時に間接的に設定できます。たとえば、SHAPE コマンド句で Recordset を作成し、それに "AS" キーワードのエイリアス名を与える場合、そのエイリアスは Reshape Name プロパティに割り当てられます。エイリアスが宣言されない場合やエイリアスが既存の名前と競合する場合、Reshape Name プロパティには、Data Shaping Serviceで生成される名前が割り当てられます。

SHAPE コマンドで Recordset を参照する場合や、Data Shaping Service で生成したために名前がわからない場合は Reshape Name プロパティを使います。この場合、Reshape Name プロパティによって返される文字列にコマンドを連結することによって、SHAPE コマンドを生成できます。

Reshape Name は、CursorLocation プロパティを adUseClient に設定したときに、Recordset オブジェクトの Properties コレクションに追加されるダイナミック プロパティです。


Resync Command プロパティ - ダイナミック (ADO)

Unique Table ダイナミック プロパティに指定されているテーブルのデータを Resync メソッドが更新するために発行する、ユーザー提供のコマンド文字列を指定します。

設定値と戻り値

コマンド文字列である文字列型 (String) の値を設定します。また、値の取得も可能です。

解説

Recordset オブジェクトは、複数のベース テーブルに実行される JOIN 操作の結果です。これらの行は、Resync メソッドの AffectRecords パラメータによって内容が異なります。Unique Table と Resync Command プロパティを設定しなければ、標準 Resync メソッドが実行されます。

Resync Command プロパティのコマンド文字列は、更新される行を一意に識別し、更新される行と同じ列数と列順序の 1 行を返す、パラメータ化コマンドまたはストアド プロシージャです。このコマンド文字列には、Unique Table の各主キー列のパラメータを持ちます。パラメータを指定しないと実行時エラーになります。パラメータには、更新される行の主キーの値が自動的に設定されます。

次に SQL の例を 2 例示します。

1) Recordset がコマンドによって定義されている場合

SELECT * FROM Customers JOIN Orders ON
    Customers.CustomerID = Orders.CustomerID
    WHERE city = ‘Seattle’
    ORDER BY CustomerID

Resync Command プロパティは次のように設定されます。

"SELECT * FROM
    (SELECT * FROM Customers JOIN Orders
    ON Customers.CustomerID = Orders.CustomerID
    city = ‘Seattle’ ORDER BY CustomerID)
WHERE Orders.OrderID = ?"

Unique Table は Orders であり、その主キー OrderID はパラメータになっています。元のコマンドが返す列の同じ数と順序を、下位の SELECT 文でプログラム的に簡単に実現しています。

2) Recordset がストアド プロシージャによって定義されている場合

CREATE PROC Custorders @CustomerID char(5) AS
SELECT * FROM Customers JOIN Orders ON
Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = @CustomerID

Resync メソッドで以下のストアド プロシージャを実行します。

CREATE PROC CustordersResync @ordid int AS
SELECT * FROM Customers JOIN Orders ON
Customers.CustomerID = Orders.CustomerID
WHERE Orders.ordid  = @ordid

Resync Command プロパティは次のように設定されます。

"{call CustordersResync (?)}"

ここでも、Unique Table は Orders であり、その主キー OrderID はパラメータになっています。

Resync Command は、CursorLocation プロパティを adUseClient に設定するときに、Recordset オブジェクトの Properties コレクションに追加されるダイナミック プロパティです。


Unique Table、Unique Schema、Unique Catalog プロパティ - ダイナミック (ADO)

複数のベース テーブルに対する JOIN 操作で形成された Recordset 中の、特定のベース テーブルに対する変更を細かく制御します。

  • Unique Table は、更新、挿入、および削除の操作ができるベース テーブルの名前を指定します。

  • Unique Schema は、"スキーマ" またはそのテーブルの所有者の名前を指定します。

  • Unique Catalog は、"カタログ" またはそのテーブルがあるデータベースの名前を指定します。

設定値と戻り値

テーブル、スキーマ、またはカタログの名前である文字列型 (String) の値を設定します。また、値の取得も可能です。

解説

対象となるベース テーブルは、一意の、カタログ名、スキーマ名、およびテーブル名で区別します。Unique Table プロパティを設定するとき、Unique Schema プロパティまたは Unique Catalog プロパティの値でベース テーブルを検索します。Unique Table プロパティを設定する前に Unique Schema プロパティと Unique Catalog プロパティのどちらか、または両方を設定するのが本来の順序ですが、必ずしもそうする必要はありません。

Unique Table の主キーは、Recordset 全体の主キーとして扱います。これは、主キーが必要なすべてのメソッドで使用されるキーです。

Unique Table の設定時には、Delete メソッドは指定したテーブルにだけ反映されます。AddNew メソッド、Resync メソッド、Update メソッド、および UpdateBatch メソッドは、Recordset の対応する基になるベース テーブルに反映されます。

カスタム再同期をするには、あらかじめ Unique Table を指定する必要があります。Unique Table を指定しないと Resync Command プロパティが反映されません。

一意のベース テーブルが見つからないと、実行時エラーになります。

CursorLocation プロパティを adUseClient に設定すると、これらのダイナミック プロパティは、すべてその Recordset オブジェクトの Properties コレクションに追加されます。


Update Resync プロパティ - ダイナミック (ADO)

UpdateBatch メソッドの後に暗黙の Resync メソッド操作を実行するかを指定し、実行する場合は、その作用範囲を指定します。

設定値と戻り値

ADCPROP_UPDATERESYNC_ENUM 値の 1 つ以上の値を設定します。また、値の取得も可能です。

解説

このプロパティは、Unique Table ダイナミック プロパティが設定されている場合にのみ適用されます。

次に示す ADCPROP_UPDATERESYNC_ENUM 値は、それぞれ同時に組み合わせて使うことができます。

  • adResyncAutoIncrement と adResyncConflicts

  • adResyncAutoIncrement と adResyncInserts

  • adResyncAll、adResyncUpdates、adResyncInserts、および adResyncConflicts

定数 adResyncConflicts は、再同期値を基になる値として保存しますが、保留中の変更は上書きしません。

Update Resync は、CursorLocation プロパティを adUseClient に設定するときに、Recordset オブジェクトの Properties コレクションに追加されるダイナミック プロパティです。

Unique Table は、任意の再同期が動作する前に指定される必要があります。Unique Table が指定されていないと、Update Resync は機能しません。


ADO メソッド

ADO メソッドの概要

メソッド | 説明
AddNew | 更新可能な Recordset オブジェクトの新規レコードを作成します。
Append | コレクションにオブジェクトを追加します。コレクションが Fields の場合、新規 Field オブジェクトを作成して追加できます。
AppendChunk | 大きなサイズの文字列またはバイナリの Field オブジェクト、または Parameter オブジェクトにデータを追加します。
BeginTrans、CommitTrans、RollbackTrans | これらのトランザクション メソッドでは、Connection オブジェクト内のトランザクション処理を次のように管理します。 BeginTrans は、新規トランザクションを開始します。CommitTrans は、すべての変更を保存して現在のトランザクションを終了します。新規トランザクションを開始する場合もあります。RollbackTrans は、すべての変更をキャンセルして現在のトランザクションを終了します。新規トランザクションを開始する場合もあります。
Cancel (ADO) | 非同期メソッド呼び出しのうち、保留中のものの実行をキャンセルします。
Cancel (RDS) | 非同期メソッド呼び出しのうち、保留中のものの実行をキャンセルします。
CancelBatch | 保留中のバッチ更新をキャンセルします。
CancelUpdate (ADO) | Update メソッドを呼び出す前に、Recordset オブジェクトのカレント行または新規行、または Record オブジェクトの Fields コレクションに加えたすべての変更をキャンセルします。
CancelUpdate (RDS) | Recordset オブジェクトのカレント行または新規行に加えたすべての変更をキャンセルします。
Clear | Errors コレクションから Error オブジェクトをすべて削除します。
Clone | 既存の Recordset オブジェクトから Recordset オブジェクトの複製を作成します。必要に応じて、複製を読み取り専用に指定できます。
Close | 開いているオブジェクトおよびすべての従属オブジェクトを閉じます。
CompareBookmarks | 2 つのブックマークを比較して、相対的な位置を示す値を返します。
ConvertToString (RDS) | Recordset を、レコードセットのデータを表す MIME 文字列に変換します。
CopyRecord | ファイルまたはディレクトリとその内容を別の場所にコピーします。
CopyTo | Stream オブジェクトから、指定した文字数またはバイト数 (Type によって決まる) のデータを別の Stream オブジェクトにコピーします。
CreateObject (RDS) | 目的のビジネス オブジェクトにプロキシを作成し、そのポインタを返します。
CreateParameter | プロパティを指定して新規 Parameter オブジェクトを作成します。
CreateRecordset (RDS) | 空の、接続されていない Recordset を作成します。
Delete (ADO Parameters コレクション) | Parameters コレクションからオブジェクトを削除します。
Delete (ADO Fields コレクション) | Fields コレクションからオブジェクトを削除します。
Delete (ADO Recordset) | カレント レコードまたはレコードのグループを削除します。
DeleteRecord | ファイルまたはディレクトリとそのサブディレクトリを削除します。
Execute (ADO Command) | CommandText プロパティで指定されたクエリ、SQL ステートメント、またはストアド プロシージャを実行します。
Execute (ADO Connection) | 指定されたクエリ、SQL ステートメント、ストアド プロシージャ、またはプロバイダ固有のテキストを実行します。
Find | 指定した条件を満たす行を Recordset から検索します。
Flush | ADO バッファに保持されている Stream の内容を、その Stream の基になるオブジェクトに反映します。
GetChildren | カレント レコードの Record によって示されているディレクトリに含まれるファイルおよびサブディレクトリを示す行を持つ Recordset を返します。
GetChunk | 大きなサイズの文字列またはバイナリの Field オブジェクトの全部または一部の内容を返します。
GetRows | Recordset オブジェクトの複数のレコードを配列に取り込みます。
GetString | Recordset を文字列として返します。
LoadFromFile | 既存ファイルの内容を Stream に読み込みます。
Move | Recordset オブジェクトのカレント レコードの位置を移動します。
MoveFirst、MoveLast, MoveNext、MovePrevious (ADO) | 指定した Recordset オブジェクトの最初、最後、次、または前のレコードに移動して、そのレコードをカレント レコードにします。
MoveFirst、MoveLast、MoveNext、MovePrevious (RDS) | 指定した Recordset オブジェクトの最初、最後、次、または前のレコードに移動します。
MoveRecord | ファイルまたはディレクトリとその内容を別の場所に移動します。
NextRecordset | 現在の Recordset オブジェクトをクリアし、一連のコマンド操作を実行して次の Recordset を返します。
Open (ADO Connection) | データ ソースへの接続を開きます。
Open (ADO Record) | 既存の Record オブジェクトを開くか、または新規のファイルまたはディレクトリを作成します。
Open (ADO Recordset) | カーソルを開きます。
Open (ADO Stream) | バイナリ データまたはテキスト データのストリームを操作する Stream オブジェクトを開きます。
OpenSchema | プロバイダからデータベースのスキーマ情報を取得します。
Query (RDS) | 有効な SQL クエリ文字列を使って Recordset オブジェクトを返します。
Read | バイナリ型の Stream オブジェクトから、指定したバイト数のデータを読み取ります。
ReadText | 文字列型の Stream オブジェクトから、指定した文字数のデータを読み取ります。
Refresh (ADO) | コレクションのオブジェクトを更新して、プロバイダから使用可能な、プロバイダに固有のオブジェクトを反映します。
Refresh (RDS) | Connect プロパティに指定されたデータ ソースを再クエリし、クエリ結果を更新します。
Requery | オブジェクトの基になるクエリを再実行して Recordset オブジェクトのデータを更新します。
Reset (RDS) | 指定されたソートとフィルタのプロパティに基づいて、クライアント側の Recordset でソートまたはフィルタを実行します。
Resync | 現在の Recordset オブジェクト、または Record オブジェクトの Fields コレクションのデータを、基になるデータベースから更新します。
Save | Recordset をファイルまたは Stream オブジェクトに保存します。
SaveToFile | Stream オブジェクトの内容をファイルに保存します。
Seek | Recordset のインデックスを検索して指定した値と一致する行をすばやく検索し、カレント行の位置をその行に変更します。
SetEOS | ストリームの終わりの位置を設定します。
SkipLine | 文字列型のストリームの読み取り時に、1 行全体をスキップします。
SubmitChanges (RDS) | ローカルにキャッシュされた更新可能な Recordset の保留中の変更を、Connect プロパティに指定されたデータ ソースに送信します。
Supports | 指定した Recordset オブジェクトが特定の種類の機能をサポートしているかどうかを判別します。
Update | Recordset オブジェクトのカレント行、または Record オブジェクトの Fields コレクションに加えたすべての変更を保存します。
UpdateBatch | すべての保留中のバッチ更新をディスクに書き込みます。
Write | バイナリ データを Stream オブジェクトに書き込みます。
WriteText | 指定したテキスト文字列を文字列型の Stream オブジェクトに書き込みます。


AddNew メソッド (ADO)

AddNew メソッド

更新可能な Recordset オブジェクトにおいて、新規レコードを作成します。

構文

recordset.AddNew FieldList, Values

パラメータ

recordset Recordset オブジェクトを指定します。

FieldList 省略可能です。新しいレコード中のフィールド名を指定します。複数のフィールド名を指定するには、フィールド名、または位置を表す値の並びを配列として指定します。

Values 省略可能です。新規レコードのフィールド値を指定するか、または複数のフィールドの値を表す配列を指定します。Fieldlist が配列の場合、Values も同じ数の要素を持つ配列である必要があります。そうでない場合は、エラーが発生します。Fieldlist の配列と Values の配列で、フィールド名の順序とフィールド値の順序を一致させる必要があります。

解説

AddNew メソッドを使って、新規レコードの作成と初期化を行います。現在の Recordset オブジェクトにレコードを追加できるかどうかを確認するには、Supports メソッドで adAddNew (CursorOptionEnum 値) を使用します。

AddNew メソッドを呼び出した後は、新規レコードがカレント レコードになり、Update メソッドを呼び出した後もカレント状態が維持されます。ブックマークをサポートしていない Recordset オブジェクトでは、別のレコードに移動すると、新規レコードにアクセスできなくなることがあります。カーソル タイプによっては、新規レコードにアクセスするために、Requery メソッドを呼び出す必要がある場合があります。

カレント レコードの編集中または新規レコードの追加中に AddNew メソッドを呼び出すと、ADO によって自動的に Update メソッドが呼び出されてすべての変更が保存され、その後で新規レコードが作成されます。

AddNew メソッドの動作は、Recordset オブジェクトの更新モード、および Fieldlist 引数と Values 引数を指定するかどうかによって異なります。

"即時更新モード" (Update メソッドを呼び出したときに、基になるデータ ソースに変更が書き込まれる) では、Fieldlist 引数と Values 引数を指定せずに AddNew メソッドを呼び出すと、EditMode プロパティが adEditAdd (EditModeEnum 値) に設定されます。フィールド値のすべての変更はローカル メモリにキャッシュされます。Update メソッドを呼び出すと、新規レコードがデータベースに書き込まれ、EditMode プロパティが adEditNone (EditModeEnum 値) に再設定されます。Fieldlist 引数と Values 引数を指定した場合は、ADO によって新規レコードは直ちにデータベースに書き込まれ (Update メソッドの呼び出しは不要)、EditMode プロパティの値は adEditNone のまま変更されません。

"バッチ更新モード" (変更はキャッシュに格納され、UpdateBatch メソッドを呼び出したときに、基になるデータ ソースに一括書き込まれる) では、Fieldlist 引数と Values 引数を指定せずに AddNew メソッドを呼び出すと、EditMode プロパティが adEditAdd に設定されます。フィールド値のすべての変更はローカル メモリにキャッシュされます。Update メソッドを呼び出すと、現在の Recordset に新規レコードが追加され、EditMode プロパティが adEditNone に再設定されます。ただし、UpdateBatch メソッドを呼び出すまでは、基になるデータベースに変更は書き込まれません。Fieldlist 引数と Values 引数を指定した場合は、ADO によって新規レコードがプロバイダに送られ、キャッシュに格納されます。基になるデータベースに新規レコードを書き込むには、UpdateBatch メソッドを呼び出す必要があります。

Unique Table ダイナミック プロパティが設定されており、Recordset が、複数のテーブルに対する JOIN 操作の実行結果である場合は、AddNew メソッドでは、Unique Table プロパティに指定されているテーブルにのみフィールドを挿入できます。


Append メソッド (ADO)

Append メソッド

コレクションにオブジェクトを追加します。コレクションが Fields の場合、新規 Field オブジェクトを作成して追加できます。

構文

collection.Append object

fields.Append Name, Type, DefinedSize, Attrib, FieldValue

パラメータ

collection コレクション オブジェクトを指定します。

fields Fields コレクションを指定します。

object 追加するオブジェクトを表すオブジェクト変数を指定します。

Name 新規 Field オブジェクトの名前を含む文字列型 (String) の値を指定します。fields に含まれるほかのオブジェクトとは異なる名前にする必要があります。

Type 新規フィールドのデータ型を DataTypeEnum 値で指定します。既定値は adEmpty です。adIDispatch、adIUnknown、および adVariant の各データ型は、ADO ではサポートされていません。したがって、Recordset に新規フィールドを追加するときに、これらのデータ型を使用することはできません。

DefinedSize 省略可能です。新規フィールドの指定サイズを文字数またはバイト数で表す長整数型 (Long) の値を示します。このパラメータの既定値は、Type によって決まります。DefinedSize が 255 バイトを超えるフィールドは、可変長列として扱われます (既定の DefinedSize は指定されません)。

Attrib 省略可能です。新規フィールドの属性を FieldAttributeEnum 値で指定します。既定値は adFldDefault です。値を指定しない場合は、Type に基づいた属性が設定されます。

FieldValue 省略可能です。新規フィールドの値を表すバリアント型 (Variant) の値を指定します。値を指定しない場合は、Null 値が設定されます。

解説

Parameters コレクション

Parameters コレクションに Parameter オブジェクトを追加する前に、そのオブジェクトの Type プロパティを設定する必要があります。可変長データ型を選択する場合は、同時に、Size プロパティを 0 より大きい値に設定する必要があります。

パラメータを指定することにより、ストアド プロシージャまたはパラメータ クエリの使用時にプロバイダの呼び出しを最小限に抑えてパフォーマンスを向上させることができます。そのためには、呼び出すストアド プロシージャまたはパラメータ クエリに関するパラメータのプロパティを把握している必要があります。

CreateParameter メソッドを使って適切なプロパティ設定値を持つ Parameter オブジェクトを作成し、Append メソッドを使ってそのオブジェクトを Parameters コレクションに追加します。この操作により、プロバイダを呼び出してパラメータ情報を求めなくても、パラメータ値を設定し、返すことができます。パラメータ情報を提供しないプロバイダに書き込む場合にパラメータを使用するには、CreateParameter メソッドを使って手動で Parameters コレクションを作成する必要があります。

Fields コレクション

FieldValue パラメータは、Record オブジェクトに (Recordset オブジェクトではなく)、Field オブジェクトを追加する場合にのみ有効です。Record オブジェクトでは、フィールドの追加と値の設定を同時に行うことができます。Recordset オブジェクトでは、Recordset を閉じているときにフィールドを作成し、その後で Recordset を開いてフィールドに値を設定する必要があります。

注意 Record オブジェクトの Fields コレクションに新規 Field オブジェクトを追加した場合は、まず、Value プロパティを設定してから、その他の Field プロパティを指定する必要があります。最初に Value プロパティに特定の値を設定し、Fields コレクションの Update を呼び出す必要があります。その後、Type、Attributes など、その他のプロパティを設定できるようになります。

データ型 (DataTypeEnum 値) が adArray、adChapter、adEmpty、adPropVariant、または adUserDefinedField の Field オブジェクトを、Fields コレクションに追加することはできません。これらのオブジェクトを追加すると、エラーが発生します。また、ADO では、adIDispatch、adIUnknown、および adIVariant のデータ型はサポートされていません。これらのデータ型の場合、追加時にエラーは発生しませんが、メモリ リークなど、予期しない結果が生じる可能性があります。

Recordset

CursorLocation プロパティを設定せずに Append メソッドを呼び出した場合は、Recordset オブジェクトの Open メソッドが呼び出されると、CursorLocation が自動的に adUseClient (CursorLocationEnum 値) に設定されます。

開いている Recordset の Fields コレクションまたは ActiveConnection プロパティが設定されている Recordset で Append メソッドを呼び出すと、実行時エラーが発生します。フィールドを追加できる Recordset は、開かれておらず、データ ソースに接続されていないものに限ります。通常、Recordset オブジェクトを CreateRecordset メソッドで作成する場合、または Recordset オブジェクトをオブジェクト変数に代入する場合がこれに該当します。

Record

開いている Record の Fields コレクションで Append メソッドを呼び出しても、実行時エラーは発生しません。新規フィールドは、Record オブジェクトの Fields コレクションに追加されます。ただし、Recordset からの Record の場合、Recordset オブジェクトの Fields コレクションに新規フィールドは追加されません。

存在しないフィールドを作成して Fields コレクションに追加することができます。このためには、コレクションに既に存在しているフィールドの場合と同じように、フィールド オブジェクトに値を指定します。この指定によって、その Field オブジェクトの作成と追加が自動的に実行されます。

Record オブジェクトの Fields コレクションに Field を追加した後は、Fields コレクションの Update メソッドを呼び出して変更を保存してください。


AppendChunk メソッド (ADO)

AppendChunk メソッド

大きなサイズの文字列またはバイナリの Field オブジェクト、または Parameter オブジェクトにデータを追加します。

構文

object.AppendChunk Data

パラメータ

object Field オブジェクトまたは Parameter オブジェクトを指定します。

Data オブジェクトに追加するデータを含むバリアント型 (Variant) のデータを指定します。

解説

AppendChunk メソッドを使って、Field オブジェクトまたは Parameter オブジェクトに大きなバイナリ データまたは文字データを格納します。システムのメモリに制限がある場合、AppendChunk メソッドを使うと、長い値をいくつかのセグメントに分けて操作できます。

Field

Field オブジェクトの Attributes プロパティで adFldLong ビットが True (1) に設定されている場合、そのフィールドに AppendChunk メソッドを使用することができます。

Field オブジェクトで AppendChunk メソッドを最初に呼び出したときは、フィールドの既存データに上書きしてデータが書き込まれます。AppendChunk メソッドを続けて呼び出したときは、既存データに追加されます。あるフィールドにデータを追加し、その後、カレント レコードの別のフィールド値の設定または読み取りを行うと、最初のフィールドへのデータの追加は終了したと見なされます。したがって、もう一度最初のフィールドで AppendChunk メソッドを呼び出すと、新規の AppendChunk 操作と解釈され、既存データに上書きされます。最初の Recordset オブジェクトのクローンを除く別の Recordset オブジェクトのフィールドにアクセスした場合は、AppendChunk 操作は中断されません。

Field オブジェクトで AppendChunk メソッドを呼び出したときにカレント レコードが存在しない場合、エラーが発生します。

注意 AppendChunk メソッドでは、Record オブジェクトの Field オブジェクトを操作することはできません。操作は何も実行されず、実行時エラーが発生します。

Parameter

Parameter オブジェクトの Attributes プロパティで adFldLong ビットが True (1) に設定されている場合、その Parameter オブジェクトに AppendChunk メソッドを使用することができます。

Parameter オブジェクトで AppendChunk メソッドを最初に呼び出したときは、パラメータの既存データに上書きしてデータが書き込まれます。Parameter オブジェクトで AppendChunk メソッドを続けて呼び出したときは、既存のパラメータ データに追加されます。AppendChunk メソッドの呼び出しで Null 値を渡すと、すべてのパラメータ データが廃棄されます。


BeginTrans、CommitTrans、RollbackTrans メソッド (ADO)

BeginTrans、CommitTrans、RollbackTrans メソッド

これらのトランザクション メソッドでは、Connection オブジェクト内のトランザクション処理を次のように管理します。

  • BeginTrans は、新規トランザクションを開始します。

  • CommitTrans は、すべての変更を保存して現在のトランザクションを終了します。新規トランザクションを開始する場合もあります。

  • RollbackTrans は、すべての変更をキャンセルして現在のトランザクションを終了します。新規トランザクションを開始する場合もあります。

構文

level = object.BeginTrans()

object.BeginTrans

object.CommitTrans

object.RollbackTrans

戻り値

BeginTrans は、トランザクションのネスト レベルを示す長整数型 (Long) の変数を返す関数として呼び出すことができます。

パラメータ

object Connection オブジェクトを指定します。

Connection

Connection オブジェクトでこれらのメソッドを使用すると、ソース データに対する一連の変更を 1 つの単位として保存またはキャンセルすることができます。たとえば、ある銀行口座から別の口座にお金を移すには、元の口座からその金額を引き出し、別の口座に入金するという 2 つの操作が行われます。どちらか一方の操作が正しく処理されなければ、口座の残高が合わなくなります。開いているトランザクションでこのような変更を行う場合、すべての変更が正しく処理されるか、すべての変更が取り消されるかのどちらかになります。

注意 すべてのプロバイダでトランザクションがサポートされているわけではありません。Connection オブジェクトの Properties コレクションに、"Transaction DDL" というプロバイダ定義のプロパティが表示されているかどうかを確認してください。このプロパティが表示されていれば、そのプロバイダはトランザクションをサポートしています。トランザクションをサポートしていないプロバイダの場合、トランザクション メソッドを呼び出すと、エラーが発生します。

BeginTrans メソッドを呼び出すと、CommitTrans または RollbackTrans メソッドを呼び出してトランザクションを終了するまで、変更は実行されません。

ネストされたトランザクションをサポートしているプロバイダの場合、開いているトランザクションで BeginTrans メソッドを呼び出すと、ネストされた新規トランザクションが開始されます。戻り値は、ネストのレベルを示します。"1" はトップ レベルのトランザクション (ほかのトランザクション内にネストしていないトランザクション) を開いたことを示し、"2" は 2番目のレベルのトランザクション (トップ レベルのトランザクション内にネストしているトランザクション) を開いたことを示します。CommitTrans または RollbackTrans を呼び出すと、最後に開いたトランザクションのみが操作の対象になります。上位レベルのトランザクションを処理するには、現在のトランザクションを閉じるか、またはロールバックする必要があります。

CommitTrans メソッドを呼び出すと、その接続上で開いているトランザクションに加えた変更が保存され、トランザクションが終了します。RollbackTrans メソッドを呼び出すと、その接続上で開いているトランザクションに加えたすべての変更が元に戻され、トランザクションが終了します。開いているトランザクションが存在しないときに CommitTrans メソッドまたは RollbackTrans メソッドを呼び出すと、エラーが発生します。

Connection オブジェクトの Attributes プロパティによっては、CommitTrans メソッドまたは RollbackTrans メソッドを呼び出したときに、自動的に新規トランザクションが開始されることがあります。Attributes プロパティが adXactCommitRetaining に設定されている場合は、CommitTrans メソッドを呼び出すと、自動的に新規トランザクションが開始されます。Attributes プロパティが adXactAbortRetaining に設定されている場合は、RollbackTrans メソッドを呼び出すと、自動的に新規トランザクションが開始されます。

RDS

BeginTrans、CommitTrans、および RollbackTrans メソッドは、クライアント側の Connection オブジェクトでは利用できません。


Cancel メソッド (ADO)

Cancel メソッド

非同期メソッド呼び出しのうち、保留中のものの実行をキャンセルします。

構文

object.Cancel

解説

Cancel メソッドを使って、非同期メソッド (adAsyncConnect、adAsyncExecute、または adAsyncFetch のオプションを指定して呼び出すメソッド) の呼び出しの実行を中止します。

次の表は、各種のオブジェクトで Cancel メソッドを使用したときに中止される操作です。

object に指定するオブジェクト 		最後の非同期呼び出しが中止されるメソッド
Command Execute
Connection | Execute または Open
Record | CopyRecord、DeleteRecord、MoveRecord、または Open


Cancel メソッド (RDS)

非同期メソッド呼び出しのうち、保留中のものの実行をキャンセルします。

構文

RDS.DataControl.Cancel

解説

Cancel メソッドを呼び出すと、ReadyState プロパティは自動的に adcReadyStateLoaded に設定され、Recordset は空になります。


CancelBatch メソッド (ADO)

CancelBatch メソッド

保留中のバッチ更新をキャンセルします。

構文

recordset.CancelBatch AffectRecords

パラメータ

AffectRecords 省略可能です。CancelBatch メソッドで操作するレコード数を示す AffectEnum 値を指定します。

解説

CancelBatch メソッドを使って、バッチ更新モードの Recordset の保留中の更新をすべてキャンセルします。即時更新モードの Recordset では、adAffectCurrent を指定せずに CancelBatch メソッドを呼び出すと、エラーが発生します。

カレント レコードの編集中または新規レコードの追加中に CancelBatch メソッドを呼び出すと、まず、CancelUpdate メソッドが呼び出され、キャッシュされているすべての変更がキャンセルされます。その後で、Recordset の保留中の変更がすべてキャンセルされます。

CancelBatch メソッドの呼び出し後、新規レコードを追加中の場合は特に、カレント レコードが不定になる可能性があります。このため、CancelBatch メソッドの実行後に、カレント レコードの位置を Recordset の特定の位置に設定することをお勧めします。たとえば、MoveFirst メソッドを呼び出します。

基になるデータとの競合が原因で (たとえば、ほかのユーザーによってレコードが既に削除されている場合など) 保留中の更新をキャンセルできない場合、プロバイダから Errors コレクションに警告が返されますが、プログラムの実行は停止されません。要求したすべてのレコードが競合する場合にのみ、実行時エラーが発生します。競合しているレコードを見つけるには、Filter プロパティ (adFilterAffectedRecords) と Status プロパティを使用します。


CancelUpdate メソッド (ADO)

CancelUpdate メソッド

Update メソッドを呼び出す前に、Recordset オブジェクトのカレント行または新規行、または Record オブジェクトの Fields コレクションに加えたすべての変更をキャンセルします。

構文

recordset.CancelUpdate

record.Fields.CancelUpdate

解説

Recordset

CancelUpdate メソッドを使って、カレント行に加えた変更をすべてキャンセルしたり、新規に追加した行を破棄します。Update メソッドを呼び出した後は、カレント行または新規行に加えた変更をキャンセルすることはできません。ただし、RollbackTrans メソッドでロールバックできるトランザクションの一部か、またはバッチ更新の一部である場合は除きます。バッチ更新の場合は、CancelUpdate メソッドまたは CancelBatch メソッドで Update をキャンセルできます。

新規行を追加しているときに CancelUpdate メソッドを呼び出すと、AddNew を呼び出す前にカレントであった行がカレント行になります。

カレント行の変更または新規行の追加を行っていない場合に CancelUpdate メソッドを呼び出すと、エラーが発生します。

Record

CancelUpdate メソッドで、Field オブジェクトの保留中の挿入または削除をすべてキャンセルし、既存のフィールドの保留中の更新をキャンセルして元の値に戻します。Fields コレクションに含まれるすべてのフィールドの Status プロパティは、adFieldOK に設定されます。


CancelUpdate メソッド (RDS)

Recordset オブジェクトのカレント行または新規行に加えたすべての変更をキャンセルします。

構文

DataControl.CancelUpdate

パラメータ

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

解説

Cursor Service for OLE DB では、変更前の元の値と、変更内容のキャッシュの両方が保持されます。CancelUpdate メソッドを呼び出すと、変更内容のキャッシュはリセットされて空になり、すべての連結コントロールは元のデータに戻されます。


Clear メソッド (ADO)

Clear メソッド

Errors コレクションからすべての Error オブジェクトを削除します。

構文

Errors.Clear

解説

Errors コレクションで Clear メソッドを使って、既存の Error オブジェクトをすべて削除できます。エラーが発生すると、Errors コレクションは自動的にクリアされ、新しく発生したエラーによる Error オブジェクトが格納されます。

プロパティとメソッドの中には、Errors コレクションの Error オブジェクトとして警告を返しても、プログラムの実行を停止しないものがあります。Recordset オブジェクトで Resync メソッド、UpdateBatch メソッド、または CancelBatch メソッドを呼び出す前、Connection オブジェクトで Open メソッドを呼び出す前、または Recordset オブジェクトで Filter プロパティを設定する前には、Errors コレクションで Clear メソッドを呼び出してください。この方法で、Errors コレクションの Count プロパティを取得して、警告が返されているどうかを調べることができます。


Clone メソッド (ADO)

Clone メソッド

既存の Recordset オブジェクトから Recordset オブジェクトの複製を作成します。必要に応じて、複製を読み取り専用に指定できます。

構文

Set rstDuplicate = rstOriginal.Clone (LockType)

戻り値

Recordset オブジェクトへの参照を返します。

パラメータ

rstDuplicate 作成する Recordset オブジェクトの複製を表すオブジェクト変数を指定します。

rstOriginal 複製元の Recordset オブジェクトを表すオブジェクト変数を指定します。

LockType 省略可能です。複製元の Recordset オブジェクトのロックの種類を適用するか、または読み取り専用にするかを LockTypeEnum 値で指定します。有効な値は、adLockUnspecified または adLockReadOnly です。

解説

Clone メソッドを使って、Recordset オブジェクトの複製を複数作成します。特に、レコード セットの複数のカレント レコードを維持する場合に、このメソッドを使用します。Clone メソッドを使うと、同じ定義を設定して新規 Recordset オブジェクトを作成して開くよりも効率的です。

作成したクローンのカレント レコードは、最初のレコードに設定されます。

1 つの Recordset オブジェクトに加えた変更は、カーソル タイプにかかわらず、すべてのクローンで参照できます。ただし、複製元の Recordset オブジェクトで Requery を実行した後は、クローンは複製元の Recordset オブジェクトと同期しなくなります。

複製元のレコードセットを閉じても、そのクローンは開いたままです。また、クローンを閉じても、複製元またはほかのクローンは開いています。

ブックマークをサポートする Recordset オブジェクトのみクローンを作成することができます。ブックマークの値は共通です。したがって、1 つの Recordset オブジェクトのブックマークで、すべてのクローンの同じレコードを参照できます。


Close メソッド (ADO)

Close メソッド

開いているオブジェクトおよびすべての従属オブジェクトを閉じます。

構文

object.Close

解説

Close メソッドを使って、Connection オブジェクト、Record オブジェクト、Recordset オブジェクト、または Stream オブジェクトを閉じ、関連するすべてのシステム リソースを解放します。オブジェクトを閉じてもメモリからは削除されず、プロパティ設定を変更してもう一度開くことができます。メモリからオブジェクトを完全に削除するには、オブジェクトを閉じて、オブジェクト変数を Nothing (Visual Basic の場合) に設定します。

Connection

Close メソッドを使って Connection オブジェクトを閉じると、その接続に関連するアクティブな Recordset オブジェクトもすべて閉じます。Connection オブジェクトに関連する Command オブジェクトはそのまま維持されますが、その ActiveConnection プロパティが Nothing に設定され、Connection オブジェクトとの関連はなくなります。さらに、Command オブジェクトの Parameters コレクション内のすべてのプロバイダ定義のパラメータもクリアされます。

その後で Open メソッドを呼び出して、同じデータ ソースまたは別のデータ ソースへの接続を再度確立できます。Connection オブジェクトが閉じているときに、データ ソースへの接続を必要とするメソッドを呼び出すと、エラーが発生します。

接続上で Recordset オブジェクトを開いたまま Connection オブジェクトを閉じると、すべての Recordset オブジェクトの保留中の変更がすべてロールバックされます。トランザクションの処理中に Close メソッドを呼び出して明示的に Connection オブジェクトを閉じると、エラーが発生します。トランザクションの処理中に Connection オブジェクトが参照できない状態になると、ADO によりトランザクションが自動的にロールバックされます。

Recordset、Record、Stream

Close メソッドを使って Recordset オブジェクト、Record オブジェクト、または Stream オブジェクトを閉じると、関連するデータと、そのデータに対する、このオブジェクトからの排他アクセスがすべて解放されます。その後で Open メソッドを呼び出して、同じ属性または更新された属性を持つオブジェクトを再度開くことができます。

Recordset オブジェクトが閉じているときに、開いているカーソルを必要とするメソッドを呼び出すと、エラーが発生します。

即時更新モードで編集しているときに Close メソッドを呼び出すと、エラーが発生します。この場合は、先に Update メソッドまたは CancelUpdate メソッドを呼び出してください。バッチ更新モードの実行中に Recordset オブジェクトを閉じると、最後に UpdateBatch メソッドを実行した後に行われた変更がすべて失われます。

Clone メソッドを使って開いている Recordset オブジェクトのクローンを作成した場合、元のオブジェクトまたはクローンの 1 つを閉じても、ほかのクローンには影響しません。


CompareBookmarks メソッド (ADO)

CompareBookmarks メソッド

2 つのブックマークを比較して、相対的な位置を示す値を返します。

構文

result = recordset.CompareBookmarks(Bookmark1, Bookmark2)

戻り値

ブックマークで表される 2 つのレコードの行位置の相対的な関係を示す CompareEnum 値を返します。

パラメータ

Bookmark1 最初の行のブックマークを指定します。

Bookmark2 2 番目の行のブックマークを指定します。

解説

ブックマークは、同じ Recordset オブジェクト、または Recordset オブジェクトとそのクローンに適用される必要があります。異なる Recordset オブジェクトのブックマークを比較した場合、同じソースまたはコマンドで作成されたブックマークであっても、信頼できる結果は得られません。また、Recordset オブジェクトの基になるプロバイダがブックマークの比較をサポートしていない場合も同様です。

ブックマークは、Recordset オブジェクトの行を一意に識別します。ブックマークを取得するには、カレント行の Bookmark プロパティを使います。

無効なブックマークや、不正に作成されたブックマークは、エラーの原因になります。


ConvertToString メソッド (RDS)

Recordset を、レコードセットのデータを表す MIME 文字列に変換します。

構文

DataFactory.ConvertToString(Recordset)

パラメータ

DataFactory RDSServer.DataFactory オブジェクトを表すオブジェクト変数を指定します。

Recordset Recordset オブジェクトを表すオブジェクト変数を指定します。

解説

.asp ファイルで ConvertToString メソッドを使って、クライアント コンピュータに転送するためにサーバーで作成された HTML ページに Recordset を埋め込みます。

ConvertToString メソッドでは、まず、Recordset オブジェクトを Cursor Service テーブルに読み込んで、次に、MIME 形式のストリームを生成します。

クライアントでは、RDS で MIME 文字列を逆変換し、完全に動作する Recordset オブジェクトに戻すことができます。各行の幅が 1024 バイト以内で、行数が 400 行未満のデータが適切に処理されます。BLOB データおよび大きな結果セットを HTTP でストリーム配信する場合は、このメソッドを使用しないでください。文字列にはワイヤ圧縮が行われないため、オンライン向けに最適化されたテーブルグラム形式を用いる場合と比べて、HTTP による大きなデータ セットの転送にはかなりの時間がかかります。テーブルグラム形式は、RDS のネイティブ転送プロトコルのフォーマットとして定義され、配備されています。

注意 Active Server Pages を使って、生成された MIME 文字列をクライアントの HTML ページに埋め込む場合、2.0 以前のバージョンの VBScript では、文字列のサイズが 32K 以内に制限されていることに注意してください。この制限を超えると、エラーが返されます。.asp ファイルで MIME 文字列を埋め込む際には、クエリの適用範囲を相対的に小さくするようにしてください。この問題を避けるには、Microsoft Windows Script Technologies の Web サイトから最新バージョンの VBScript をダウンロードしてください。


CopyRecord メソッド (ADO)

CopyRecord メソッド

ファイルまたはディレクトリとその内容を別の場所にコピーします。

構文

CopyRecord (Source, Destination, UserName, Password, Options, Async)

パラメータ

Source 省略可能です。コピー元のファイルまたはディレクトリの URL を含む文字列型 (String) の値を指定します。Source を省略するか、または空文字列を指定した場合、カレント レコードの Record に示されているファイルまたはディレクトリがコピーされます。

Destination コピー先の場所の URL を含む文字列型 (String) の値を指定します。

UserName 省略可能です。Destination へのアクセスを認可するユーザー ID を含む文字列型 (String) の値を指定します。

Password 省略可能です。UserName を確認するためのパスワードを含む文字列型 (String) の値を指定します。

Options 省略可能です。このメソッドの動作を指定する CopyRecordOptionsEnum 値を指定します。既定値は adCopyUnspecified です。

Async 省略可能です。True のときにこの操作が非同期で実行されるように指定するブール型 (Boolean) の値を指定します。

戻り値

文字列型 (String) の値で、通常は Destination の値が返されます。ただし、実際に返される値は、プロバイダによって決まります。

解説

Source と Destination の値は異なっている必要があります。同じ値の場合は、実行時エラーが発生します。サーバー名、パス名、リソース名のうち少なくとも 1 つが異なっている必要があります。

Source のサブディレクトリは、adCopyNonRecursive を指定していない限り、すべてそのとおりにコピーされます。サブディレクトリもコピーする場合は、Destination に Source のサブディレクトリを指定しないでください。そのような指定を行うと、操作が完了しません。

Destination に既存のファイルまたはディレクトリを指定する場合、adCopyOverWrite を指定していなければ、このメソッドの操作は失敗します。

重要 adCopyOverWrite オプションは、十分に考慮して使用してください。たとえば、ファイルをディレクトリにコピーするときにこのオプションを指定すると、コピー先のディレクトリが "削除" されてコピー元のファイルに置き換えられます。


CopyTo メソッド (ADO)

CopyTo メソッド

Stream オブジェクトから、指定した文字数またはバイト数 (Type によって決まる) のデータを別の Stream オブジェクトにコピーします。

構文

Stream.CopyTo DestStream, NumChars

パラメータ

DestStream 開いている Stream オブジェクトへの参照を含むオブジェクト変数の値を指定します。DestStream で指定した Stream に、現在の Stream がコピーされます。コピー先の Stream は既に開かれている必要があります。コピー先の Stream が開かれていない場合は、実行時エラーが発生します。

注意 DestStream パラメータに、Stream オブジェクトのプロキシを指定することはできません。これは、クライアントにリモート接続できない Stream オブジェクト上で、プライベート インターフェイスにアクセスを行うからです。

NumChars 省略可能です。ソース Stream の現在の位置からコピー先の Stream にコピーするバイト数または文字数を指定する整数型 (Integer) の値を指定します。既定値は –1 で、現在の位置から EOS までのすべての文字またはバイトをコピーするように指定します。

解説

CopyTo メソッドは、Position プロパティに指定された現在の位置から指定数の文字またはバイトをコピーします。指定した数が、EOS までの利用可能バイト数を超える場合は、現在の位置から EOS までの文字またはバイトのみがコピーされます。NumChars の値が –1 の場合、または省略されている場合は、現在の位置から始まるすべての文字またはバイトがコピーされます。

コピー先のストリームに既存の文字またはバイトが存在する場合、コピーの終了ポイント以降の内容はすべてそのまま残り、削除されません。Position は、コピーされた最後のバイトの次のバイトになります。残りのバイトを削除する場合は、SetEOS を呼び出してください。

CopyTo メソッドは、同じ種類の Stream 間でデータをコピーする場合、つまり、コピー元とコピー先の Type プロパティの設定値がどちらも adTypeText であるか、またはどちらも adTypeBinary である場合に使用します。文字列型の Stream オブジェクトの場合、コピー先の Stream の Charset プロパティの設定値を変更すると、文字セットを別の文字セットに変換することができます。また、文字列型の Stream オブジェクトをバイナリ型の Stream オブジェクトにコピーすることもできますが、バイナリ型の Stream オブジェクトを文字列型の Stream オブジェクトにコピーすることはできません。


CreateObject メソッド (RDS)

目的のビジネス オブジェクトのプロキシを作成し、そのポインタを返します。プロキシは、インターネット経由で要求やデータを送信するビジネス オブジェクトと通信するために、データをパッケージ化してサーバー側のスタブにマーシャリングします。インプロセス コンポーネント オブジェクトでは、プロキシは使用されず、オブジェクトへのポインタのみが提供されます。

構文

RDS では、HTTP、HTTPS (Secure Socket Layer を使用する HTTP)、DCOM、およびインプロセスの各プロトコルがサポートされています。

プロトコル | 構文
HTTP | Set object = DataSpace.CreateObject("ProgId", "http://awebsrvr")
HTTPS | Set object = DataSpace.CreateObject("ProgId", "https://awebsrvr")
DCOM | Set object = DataSpace.CreateObject("ProgId", "computername")
インプロセス | Set object = DataSpace.CreateObject("ProgId", "")

パラメータ

Object ProgID に指定された種類のオブジェクトを参照するオブジェクト変数を指定します。

DataSpace 新規オブジェクトのインスタンスの作成に使われる RDS.DataSpace オブジェクトを表すオブジェクト変数を指定します。

ProgID アプリケーションのビジネス ルールを適用する、サーバー側のビジネス オブジェクトを指定するプログラム ID を含む文字列型 (String) の値を指定します。

awebsrvr または computername サーバー ビジネス オブジェクトのインスタンスが作成される、Internet Information Services (IIS) Web サーバーを識別する URL を表す文字列型 (String) の値を指定します。

解説

"HTTP" プロトコルは、標準の Web プロトコルです。"HTTPS" プロトコルは、セキュリティで保護された Web プロトコルです。"DCOM" プロトコルは、HTTP を使わずにローカル エリア ネットワークを運用する場合に使用します。"インプロセス" プロトコルは、ネットワークを経由しないローカルなダイナミック リンク ライブラリ (DLL) です。


CreateParameter メソッド (ADO)

CreateParameter メソッド

プロパティを指定して新規 Parameter オブジェクトを作成します。

構文

Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)

戻り値

Parameter オブジェクトを返します。

パラメータ

Name 省略可能です。Parameter オブジェクト名を含む文字列型 (String) の値を指定します。

Type 省略可能です。Parameter オブジェクトのデータ型を DataTypeEnum 値で指定します。

Direction 省略可能です。Parameter オブジェクトのデータ型を ParameterDirectionEnum 値で指定します。

Size 省略可能です。パラメータ値の最大長を文字数またはバイト数で指定する長整数型 (Long) の値を指定します。

Value 省略可能です。Parameter オブジェクトの値を指定するバリアント型 (Variant) の値を指定します。

解説

CreateParameter メソッドを使って、名前、種類、方向、サイズ、および値を指定して新規 Parameter オブジェクトを作成します。引数に指定した値は、対応する Parameter プロパティに書き込まれます。

このメソッドを実行しても、Parameter オブジェクトは、Command オブジェクトの Parameters コレクションに自動的に追加されません。このため、追加のプロパティを設定することができます。Parameter オブジェクトをコレクションに追加するときに、プロパティ値の妥当性が確認されます。

Type 引数に可変長データ型を指定する場合は、Parameters コレクションにオブジェクトを追加する前に、Size 引数を指定するか、または Parameter オブジェクトの Size プロパティを設定する必要があります。それ以外の場合は、エラーが発生します。

Type 引数に数値型 (adNumeric または adDecimal) を指定する場合は、同時に NumericScale と Precision の各プロパティも設定する必要があります。


CreateRecordset メソッド (RDS)

空の、接続されていない Recordset を作成します。

構文

object.CreateRecordset(ColumnInfos)

パラメータ

Object RDSServer.DataFactory オブジェクトまたは RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

ColumnsInfos 作成した Recordset の各列を定義する属性を、バリアント型 (Variant) の配列で指定します。各列には、次の 4 つの必須属性を持つ配列を定義します。

属性 | 説明
Name | 列のヘッダー名を指定します。
Type | データ型の整数値を指定します。
Size | データ型にかかわらず、列の幅を文字数による整数値で指定します。
Nullability | ブール型の値を指定します。

各列の配列は、Recordset を定義する 1 つの配列にまとめられます。

解説

サーバー側のビジネス オブジェクトでは、株式相場のオペレーティング システム ファイルなどの OLE DB 以外のデータ プロバイダのデータから、結果の Recordset を作成することができます。

次の表は、CreateRecordset メソッドでサポートされている DataTypeEnum 値の一覧です。一覧に示されている番号は、フィールドを定義するために使われる参照番号です。

データ型は、固定長データ型または可変長データ型のどちらかです。固定長データ型では、サイズがあらかじめ決められていてもサイズの定義が要求されるため、サイズを -1 に定義する必要があります。可変長データ型では、1 ～ 32767 のサイズを指定できます。

可変長データ型では、次の表の「代入値」の欄に示されている値が強制的に使用されることがあります。Recordset が作成されて格納されるまでは、代入値を参照することはできません。必要であれば、その後で、実際に使われているデータ型を確認できます。

データの長さ | 定数 | 番号 | 代入値
固定長 | adTinyInt | 16 |
固定長 | adSmallInt | 2 |
固定長 | adInteger | 3 |
固定長 | adBigInt | 20 |
固定長 | adUnsignedTinyInt | 17 |
固定長 | adUnsignedSmallInt | 18 |
固定長 | adUnsignedInt | 19 |
固定長 | adUnsignedBigInt | 21 |
固定長 | adSingle | 4 |
固定長 | adDouble | 5 |
固定長 | adCurrency | 6 |
固定長 | adDecimal | 14 |
固定長 | adNumeric | 131 |
固定長 | adBoolean | 11 |
固定長 | adError | 10 |
固定長 | adGuid | 72 |
固定長 | adDate | 7 |
固定長 | adDBDate | 133 |
固定長 | adDBTime | 134 |
固定長 | adDBTimestamp | 135 | 7
可変長 | adBSTR | 8 | 130
可変長 | adChar | 129 | 200
可変長 | adVarChar | 200 |
可変長 | adLongVarChar | 201 | 200
可変長 | adWChar | 130 |
可変長 | adVarWChar | 202 | 130
可変長 | adLongVarWChar | 203 | 130
可変長 | adBinary | 128 |
可変長 | adVarBinary | 204 |
可変長 | adLongVarBinary | 205 | 204


Delete メソッド (ADO Parameters コレクション)

Parameters コレクションからオブジェクトを削除します。

構文

Parameters.Delete Index

パラメータ

Index 削除するオブジェクトの名前、またはコレクション内の位置 (インデックス) を含む文字列型 (String) の値を指定します。

解説

コレクションで Delete メソッドを使用すると、コレクションからオブジェクトの 1 つを削除することができます。このメソッドは、Command オブジェクトの Parameters コレクションでのみ使用できます。Delete メソッドを呼び出すときは、Parameter オブジェクトの Name プロパティか、またはそのコレクション インデックスを使用する必要があります。これは、オブジェクト変数が有効な引数ではないためです。


Delete メソッド (ADO Fields コレクション)

Fields コレクションからオブジェクトを削除します。

構文

Fields.Delete Field

パラメータ

Field 削除する Field オブジェクトを示すバリアント型 (Variant) の値を指定します。このパラメータには、Field オブジェクトの名前または Field オブジェクト自体の位置を示す数値を指定できます。

解説

開いている Recordset で Fields.Delete メソッドを呼び出すと、実行時エラーが発生します。


Delete メソッド (ADO Recordset)

カレント レコードまたはレコードのグループを削除します。

構文

recordset.Delete AffectRecords

パラメータ

AffectRecords Delete メソッドの操作対象となるレコード数を決める AffectEnum 値を指定します。既定値は adAffectCurrent です。

注意 adAffectAll および adAffectAllChapters は、Delete メソッドでは無効の引数です。

解説

Delete メソッドを使うと、Recordset オブジェクトのカレント レコードまたはレコードのグループは削除の対象としてマークされます。レコードを削除できない Recordset オブジェクトの場合はエラーが発生します。即時更新モードでは、削除は直ちにデータベースに反映されます。バッチ更新モードでは、キャッシュから削除するレコードがマークされ、実際の削除は UpdateBatch メソッドを呼び出したときに実行されます。削除されたレコードを参照するには、Filter プロパティを使用します。

削除されたレコードからフィールド値を取得すると、エラーが発生します。カレント レコードを削除した後は、別のレコードに移動するまで、削除されたレコードがカレント レコードになります。削除されたレコードから移動した後は、そのレコードにアクセスできなくなります。

トランザクション内で削除操作をネストしている場合、RollbackTrans メソッドを使うと、削除したレコードを復元できます。バッチ更新モードでは、CancelBatch を使って保留中の削除をキャンセルできます。

基になるデータとの競合 (たとえば、ほかのユーザーによってレコードが既に削除されている場合など) が原因でレコードの削除に失敗した場合、プロバイダから Errors コレクションに警告が返されますが、プログラムの実行は停止されません。要求したすべてのレコードが競合している場合にのみ、実行時エラーが発生します。

Unique Table ダイナミック プロパティが設定されており、Recordset が、複数のテーブルに対する JOIN 操作の実行結果である場合は、Delete メソッドでは、Unique Table プロパティに指定されたテーブルからのみ行を削除できます。


DeleteRecord メソッド (ADO)

DeleteRecord メソッド

ファイルまたはディレクトリとそのサブディレクトリを削除します。

構文

DeleteRecord Source, Async

パラメータ

Source 省略可能です。削除するファイルまたはディレクトリの URL を含む文字列型 (String) の値を指定します。Source を省略するか、または空文字列を指定した場合、Record で表されているファイルまたはディレクトリが削除されます。

Async 省略可能です。ブール型 (Boolean) の値を指定します。True のときは、削除操作が非同期で実行されることを示します。

解説

DeleteRecord メソッドの終了後、Record で表されているファイルまたはディレクトリに対する操作が正しく処理されないことがあります。DeleteRecord を呼び出した後は、Record を閉じる必要があります。

Recordset から取得した Record の場合、削除操作の結果は、すぐには Recordset に反映されません。Recordset を更新するには、その Recordset をいったん閉じてもう一度開くか、またはその Recordset で、Requery メソッドを実行するか、または Update メソッドと Resync メソッドを実行します。


Execute メソッド (ADO Command)

CommandText プロパティで指定されたクエリ、SQL ステートメント、またはストアド プロシージャを実行します。

構文

行を返す Command オブジェクトの場合の構文は次のとおりです。

Set recordset = command.Execute( RecordsAffected, Parameters, Options )

行を返さない Command オブジェクトの場合の構文は次のとおりです。

command.Execute RecordsAffected, Parameters, Options

戻り値

Recordset オブジェクトへの参照を返します。

パラメータ

RecordsAffected 省略可能です。長整数型 (Long) の変数です。プロバイダは、この操作の影響を受けたレコード数をここに返します。RecordsAffected パラメータは、アクション クエリまたはストアド プロシージャにのみ適用されます。RecordsAffected では、結果を返すクエリまたはストアド プロシージャから返されるレコード数は返しません。このレコード数を返すには、RecordCount プロパティを使います。

Parameters 省略可能です。SQL ステートメントと共に渡すパラメータ値を、バリアント型 (Variant) の配列で指定します。出力パラメータをこの引数で渡しても、正しい値は返されません。

Options 省略可能です。プロバイダが Command オブジェクトの CommandText プロパティを評価する方法を示す長整数型 (Long) の値を指定します。1 つまたは複数の CommandTypeEnum 値または ExecuteOptionEnum 値を指定できます。

解説

Command オブジェクトで Execute メソッドを使用すると、オブジェクトの CommandText プロパティに指定したクエリが実行されます。CommandText プロパティに行を返すクエリが指定されている場合、実行結果はすべて新規 Recordset オブジェクトに保存されます。コマンドが行を返すクエリではない場合、プロバイダは閉じた Recordset オブジェクトを返します。いくつかのアプリケーション言語では、Recordset が必要としない場合に、この戻り値を無視できます。

クエリにパラメータが存在する場合、Command オブジェクトの現在のパラメータ値を Execute メソッドの呼び出しで引き渡されたパラメータ値で置き換えない限り、Command オブジェクトの現在のパラメータ値が使用されます。Execute メソッドを呼び出す際にパラメータのいくつかの新しい値を省略して、パラメータのサブセットを上書きすることができます。パラメータを指定する順番は、メソッドで渡される順番と同じです。たとえば、4 つまたはそれ以上のパラメータがあり、1 番目と 4 番目のパラメータのみに新しい値を渡すには、Parameters 引数に、Array(var1,,,var4) のように指定します。

注意 出力パラメータを Parameters 引数で渡しても、正しい値は返されません。

この操作が完了すると、ExecuteComplete イベントが発生します。


Execute メソッド (ADO Connection)

指定されたクエリ、SQL ステートメント、ストアド プロシージャ、またはプロバイダ固有のテキストを実行します。

構文

行を返さないコマンド文字列の場合の構文は次のとおりです。

connection.Execute CommandText, RecordsAffected, Options

行を返すコマンド文字列の場合の構文は次のとおりです。

Set recordset = connection.Execute (CommandText, RecordsAffected, Options)

戻り値

Recordset オブジェクトへの参照を返します。

パラメータ

CommandText 実行する SQL ステートメント、テーブル名、ストアド プロシージャ、URL、またはプロバイダ固有のテキストを含む文字列型 (String) の値を指定します。

RecordsAffected 省略可能です。長整数型 (Long) の変数です。プロバイダは、この操作の影響を受けたレコード数をここに返します。

Options 省略可能です。プロバイダが CommandText 引数を評価する方法を示す長整数型 (Long) の値を指定します。1 つまたは複数の CommandTypeEnum 値または ExecuteOptionEnum 値を指定できます。

解説

Connection オブジェクトで Execute メソッドを使用すると、指定した接続上で、CommandText 引数に指定したクエリが実行されます。CommandText 引数に、行を返すクエリが指定されている場合、クエリの実行結果はすべて新規 Recordset オブジェクトに保存されます。行を返すクエリ以外のコマンドの場合は、プロバイダは閉じた Recordset オブジェクトを返します。

返された Recordset オブジェクトは常に読み取り専用で、前方スクロール タイプのカーソルです。Recordset オブジェクトに、より多くの機能が必要な場合は、まず、目的のプロパティ設定を持つ Recordset オブジェクトを作成し、次に、Recordset オブジェクトの Open メソッドを使ってクエリを実行して目的のカーソル タイプを返します。

CommandText 引数の内容はプロバイダに固有のものであり、標準の SQL 構文、またはプロバイダがサポートする固有のコマンド形式を使用できます。

この操作が完了すると、ExecuteComplete イベントが発生します。


Find メソッド (ADO)

Find メソッド

Recordset から、指定した条件を満たす行を検索します。必要に応じて、検索の方向、開始行、および開始行からのオフセットを指定できます。条件が一致すれば、カレント行の位置は、検出されたレコードに設定されます。条件を満たす行がない場合は、カレント行の位置は Recordset の最後 (または最初) に設定されます。

構文

Find (Criteria, SkipRows, SearchDirection, Start)

パラメータ

Criteria 検索に使用する列の名前、比較演算子、および値を指定するステートメントを含む文字列型 (String) の値を指定します。

SkipRows 省略可能です。検索を開始する、カレント行または Start ブックマークからの行のオフセットを指定する長整数型 (Long) の値を指定します。既定値は 0 です。既定では、カレント行から検索が開始されます。

SearchDirection 省略可能です。検索方向に向かって、カレント行または使用可能な次の行のどちらから検索を開始するかを指定する SearchDirectionEnum 値を指定します。検索に成功しなかった場合、この値に adSearchForward が指定されていると、Recordset の終わりで停止します。また、検索に成功しなかった場合、この値に adSearchBackward が指定されていると、Recordset の先頭で停止します。

Start 省略可能です。検索の開始位置として使用するバリアント型 (Variant) のブックマークを指定します。

解説

criteria には、単一列の名前のみを指定できます。このメソッドでは、複数列の検索はサポートしていません。

Criteria の比較演算子には、">" (より大きい)、"<" (より小さい)、"=" (等しい)、">=" (以上)、"<=" (以下)、"<>" (等しくない)、または "like" (パターン マッチング) を使用できます。

Criteria の値には、文字列、浮動小数点数、または日付を使用できます。文字列の値は単一引用符または "#" (シャープ記号) で囲みます。たとえば、「state = 'WA'」または「state = #WA#」のように指定します。日付の値は "#" (シャープ記号) で囲みます。たとえば、「start_date > #7/22/97#」のように指定します。

比較演算子に "like" を使用する場合、文字列値にアスタリスク (*) を含めると、1 つまたは複数の文字または部分文字列を検索することができます。たとえば、「state like 'M*'」と指定すると、Maine や、Massachusetts が該当します。また、文字列の先頭と末尾にアスタリスクを使用して、その間に含まれる部分文字列を検索することもできます。たとえば、「state like '*as*'」と指定すると、Alaska、Arkansas、および Massachusetts が該当します。

前の例のように、アスタリスクは、検索文字列の末尾のみに使用するか、または検索文字列の先頭と末尾の両方で使用することができます。ただし、先頭のみのワイルドカード ('*str') または文字列中のワイルドカード ('s*r') としてアスタリスクを使用することはできません。この場合は、エラーが発生します。

注意 Find メソッドを呼び出す前にカレント行の位置が設定されていない場合は、エラーが発生します。Find メソッドを呼び出す前に、MoveFirst など、行の位置を設定するメソッドを呼び出す必要があります。


Flush メソッド (ADO)

Flush メソッド

ADO バッファに保持されている Stream の内容を、その Stream が関連付けられた、基になるオブジェクトに反映します。

構文

Stream.Flush

解説

このメソッドを使用すると、Stream オブジェクトのソースの URL で表示される、基になるオブジェクトにストリーム バッファの内容を送ることができます。Stream の内容に加えたすべての変更が確実に書き込まれるようにするには、このメソッドを呼び出す必要があります。ただし、ADO では、バックグラウンドで、可能な限り継続してバッファのフラッシュが行われるので、通常は Flush メソッドを呼び出す必要はありません。Stream の内容の更新は自動的に行われます。Flush メソッドが呼ばれるまでキャッシュされるわけではありません。

Close メソッドを使って Stream を閉じると、Stream の内容が自動的にフラッシュされるので、Close を呼び出す前に明示的に Flush メソッドを呼び出す必要はありません。


GetChildren メソッド (ADO)

GetChildren メソッド

カレントの Record によって示されているディレクトリに含まれるファイルおよびサブディレクトリを示す行を持つ Recordset を返します。

構文

Set recordset = record.GetChildren

戻り値

各行がファイルまたはディレクトリを表す Recordset オブジェクトを返します。

解説

返される Recordset にどのような列があるかは、プロバイダによって決まります。たとえば、ドキュメント ソース プロバイダは、常にリソースの Recordset を返します。


GetChunk メソッド (ADO)

GetChunk メソッド

大きなサイズの文字列型またはバイナリ型の Field オブジェクトの、全部または一部の内容を返します。

構文

variable = field.GetChunk(Size )

戻り値

バリアント型 (Variant) の値を返します。

パラメータ

Size 取得するバイト数または文字数を表す長整数型 (Long) の式を指定します。

解説

Field オブジェクトで GetChunk メソッドを使用すると、サイズの大きいバイナリ データまたは文字データの全体または一部を取得できます。システム メモリに制限がある場合、GetChunk メソッドを使用すると、長い値を短いセグメントに分けて操作できます。

GetChunk メソッドから返されたデータは variable に代入されます。Size が残りのデータより大きい場合は、空白で variable を補充せずに残りのデータのみが返されます。フィールドが空の場合は、Null 値が返されます。

GetChunk メソッドを連続して使うと、直前の GetChunk の呼び出しで取得されたデータの直後からデータが取得されます。ただし、あるフィールドからデータを取得しているときに、カレント レコードの別のフィールド値の設定または読み取りを行うと、最初のフィールドからのデータ取得は終了したと見なされます。そのため、もう一度最初のフィールドで GetChunk メソッドを呼び出すと、新規の GetChunk 操作と解釈され、データの始めから読み取りが開始されます。最初の Recordset オブジェクトのクローンを除く別の Recordset オブジェクトのフィールドにアクセスした場合は、GetChunk メソッドの操作は中断されません。

Field オブジェクトの Attributes プロパティで adFldLong ビットが True に設定されている場合、そのフィールドに GetChunk メソッドを使用することができます。

Field オブジェクトで GetChunk メソッドを使用する際にカレント レコードが存在しない場合、エラー 3021 (カレント レコードはありません) が発生します。

注意 GetChunk メソッドでは、Record オブジェクトの Field オブジェクトを操作することはできません。操作は何も実行されず、実行時エラーが発生します。


GetRows メソッド (ADO)

GetRows メソッド

Recordset オブジェクトの複数のレコードを配列に取り込みます。

構文

array = recordset.GetRows(Rows, Start, Fields )

戻り値

バリアント型 (Variant) の二次元配列の値を返します。

パラメータ

Rows 省略可能です。取得するレコード数を示す GetRowsOptionEnum 値を指定します。既定値は adGetRowsRest です。

Start 省略可能です。GetRows 操作を開始するレコードのブックマークの評価に使う文字列型 (String) またはバリアント型 (Variant) の値を指定します。BookmarkEnum 値を使用することもできます。

Fields 省略可能です。単一のフィールド名または位置を表すバリアント型 (Variant) の値、あるいは複数のフィールド名または位置を表す値の並びをバリアント型 (Variant) の配列として指定します。指定したフィールドのデータのみが返されます。

解説

GetRows メソッドでは、Recordset のレコードを二次元配列にコピーします。最初の添え字でフィールドを指定し、2 番目でレコード番号を指定します。GetRows メソッドからデータが返されると、変数 array は自動的に正しいサイズに調整されます。

Rows 引数の値を指定しない場合は、Recordset オブジェクトのすべてのレコードが取り込まれます。利用可能なレコード数よりも大きい値を指定した場合は、利用可能なレコード数のみが返されます。

ブックマークをサポートする Recordset オブジェクトの場合、Start 引数にレコードの Bookmark プロパティの値を指定すると、GetRows メソッドでデータの取得を開始するレコードを指定できます。

GetRows メソッドで返すフィールドを限定する場合は、Fields 引数に、単一のフィールド名または番号、あるいは、複数のフィールド名または番号の配列を指定します。

GetRows メソッドを呼び出すと、次の読み込まれていないレコードがカレント レコードになります。レコードがそれ以上存在しない場合は、EOF プロパティが True に設定されます。


GetString メソッド (ADO)

GetString メソッド

Recordset を文字列として返します。

構文

Set Variant = recordset.GetString(StringFormat, NumRows, ColumnDelimiter, RowDelimiter, NullExpr)

戻り値

Recordset をバリアント型 (Variant) 変数 (BSTR) の文字列として返します。

パラメータ

StringFormat StringFormatEnum 値を指定します。Recordset を文字列に変換する方法を指定します。RowDelimiter、ColumnDelimiter、および NullExpr の各パラメータは、StringFormat に adClipString を指定した場合にのみ使用できます。

NumRows 省略可能です。Recordset から変換する行数を指定します。NumRows を指定しない場合、または Recordset の行数の合計より大きい値を指定した場合は、Recordset のすべての行が変換されます。

ColumnDelimiter 省略可能です。列の区切りに使う区切り文字を指定します。指定しなければ、タブが使用されます。

RowDelimiter 省略可能です。行の区切りに使う区切り文字を指定します。指定しなければ、復帰改行が使用されます。

NullExpr 省略可能です。Null 値に入れる式を指定します。指定しなければ、空文字列が使用されます。

解説

スキーマ データではなく、行のデータが文字列に保存されます。したがって、この文字列を使って Recordset を開くことはできません。

このメソッドは RDO の GetClipString メソッドと同じ働きをします。


LoadFromFile メソッド (ADO)

LoadFromFile メソッド

既存ファイルの内容を Stream に読み込みます。

構文

Stream.LoadFromFile FileName

パラメータ

FileName Stream に読み込むファイルの名前を含む、文字列型 (String) の値を指定します。FileName には、ローカルまたは UNC 形式の有効なパスとファイル名を指定できます。指定したファイルが存在しない場合は、実行時エラーが発生します。

解説

このメソッドで、ファイルの内容を Stream オブジェクトに読み込むことができます。このメソッドで、ファイルの内容をサーバーにアップロードすることができます。

LoadFromFile を呼び出す前に、Stream オブジェクトが開かれている必要があります。このメソッドでは、Stream オブジェクトのバインディングは変更されず、その Stream を開いた URL で指定されたオブジェクトにバインドされたままです。LoadFromFile メソッドでは、Stream オブジェクトの現在の内容を、ファイルから読み込んだデータで上書きします。

Stream の既存のバイトはすべて、ファイルの内容で上書きされます。LoadFromFile メソッドで作成された EOS の後に残っている既存のバイトは、すべて削除されます。

LoadFromFile メソッドを呼び出した後、現在の位置は Stream の先頭になり、Position が 0 に設定されます。


Move メソッド (ADO)

Move メソッド

Recordset オブジェクトのカレント レコードの位置を移動します。

構文

recordset.Move NumRecords, Start

パラメータ

NumRecords カレント レコードの位置を移動するレコード数を指定する、符号付きの長整数型 (Long) の式を指定します。

Start 省略可能です。ブックマークとして評価される文字列型 (String) またはバリアント型 (Variant) の値を指定します。BookmarkEnum 値を使用することもできます。

解説

Move メソッドは、すべての Recordset オブジェクトでサポートされています。

NumRecords 引数が 0 よりも大きい場合、カレント レコードの位置は前方、つまり、Recordset の終端方向に移動します。NumRecords 引数が 0 よりも小さい場合、カレント レコードの位置は後方、つまり、Recordset の始端方向に移動します。

Move メソッドを呼び出してカレント レコードの位置を先頭レコードの前に移動した場合、カレント レコードはレコードセットの先頭レコードの前の位置に設定され、BOF が True になります。BOF プロパティが既に True の場合、後方へ移動しようとすると、エラーが発生します。

Move メソッドを呼び出してカレント レコードの位置を最後のレコードの後に移動した場合、カレント レコードはレコードセットの最後のレコードの後に設定され、EOF が True になります。EOF プロパティが既に True の場合、前方へ移動しようとすると、エラーが発生します。

空の Recordset オブジェクトから Move メソッドを呼び出すと、エラーが発生します。

Start 引数を指定した場合、Recordset オブジェクトではブックマークがサポートされていると見なされ、このブックマークを持つレコードが移動の基準となります。Start 引数を指定しない場合は、カレント レコードが移動の基準となります。

CacheSize プロパティを使用してプロバイダからのレコードをローカルにキャッシュしている場合、NumRecords 引数を渡すことで、現在キャッシュされているレコード グループの範囲外にカレント レコードの位置が移動されると、移動先のレコードから始まる新しいレコード グループが強制的に取り込まれます。新しく取り込まれるグループのサイズは CacheSize プロパティによって決まり、移動先のレコードが最初に取得されるレコードになります。

Recordset オブジェクトが前方スクロールのみ可能な場合でも、移動先が、現在キャッシュされているレコード セットの範囲内であれば、0 より小さい値を NumRecords 引数に指定することができます。Move メソッドを呼び出して、カレント レコードの位置が、キャッシュされている最初のレコードより前のレコードに移動した場合は、エラーが発生します。このように、前方スクロールのみをサポートするプロバイダで、完全スクロールをサポートするレコード キャッシュを使用することができます。キャッシュされたレコードはメモリに読み込まれるため、必要以上のレコードのキャッシュは避けてください。前方スクロールのみ可能な Recordset オブジェクトでも、この方法で後方への移動を実行できますが、前方スクロールのみ可能な Recordset オブジェクトで MovePrevious メソッドを呼び出すと、エラーが発生します。


MoveFirst、MoveLast、MoveNext、MovePrevious メソッド (ADO)

MoveFirst、MoveLast、MoveNext、MovePrevious メソッド

指定した Recordset オブジェクトの最初、最後、次、または前のレコードに移動して、そのレコードをカレント レコードにします。

構文

recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}

解説

MoveFirst メソッドでは、カレント レコードの位置を Recordset の最初のレコードに移動します。

MoveLast メソッドでは、カレント レコードの位置を Recordset の最後のレコードに移動します。この場合、Recordset オブジェクトがブックマークまたは後方スクロール タイプのカーソルをサポートしている必要があります。サポートしていない場合にこのメソッドを実行すると、エラーが発生します。

MoveNext メソッドでは、カレント レコードの位置を 1 レコード前方 (Recordset の終端方向) に移動します。カレント レコードが最後のレコードの場合に MoveNext メソッドを呼び出すと、カレント レコードは Recordset の最後のレコードの後に設定され、EOF が True になります。EOF プロパティが既に True の場合、前方へ移動しようとすると、エラーが発生します。

フィルタまたはソートが実行された Recordset でカレント レコードのデータを変更すると、その位置も変更されることがあります。その場合、MoveNext メソッドは正常に動作しますが、その位置が、元の位置からではなく、変更後の位置から 1 レコード先に移動されることに注意する必要があります。たとえば、カレント レコードのデータを、ソートされた Recordset の最後に移動するように変更した場合、MoveNext を呼び出すと、カレント レコードは Recordset の最後のレコードの後 (EOF = True) に設定されることになります。

MovePrevious メソッドでは、カレント レコードの位置を 1 レコード後方 (Recordset の始端方向) に移動します。この場合、Recordset オブジェクトがブックマークまたは後方スクロール タイプのカーソルをサポートしている必要があります。サポートしていない場合にこのメソッドを実行すると、エラーが発生します。カレント レコードが最初のレコードの場合に MovePrevious メソッドを呼び出すと、カレント レコードは Recordset の最初のレコードの前に設定され、BOF が True になります。BOF プロパティが既に True の場合、後方へ移動しようとすると、エラーが発生します。Recordset オブジェクトがブックマークまたは後方スクロール タイプのカーソルをサポートしていない場合、MovePrevious メソッドを実行すると、エラーが発生します。

前方スクロールのみ可能な Recordset で両方向のスクロールを行う必要がある場合は、CacheSize プロパティを使ってレコード キャッシュを作成し、Move メソッドで後方へのカーソル移動を行うことができます。キャッシュされたレコードはメモリに読み込まれるため、必要以上のレコードのキャッシュは避けてください。前方スクロールのみ可能な Recordset オブジェクトで MoveFirst メソッドを呼び出すことはできますが、その場合、プロバイダで、Recordset オブジェクトを生成するコマンドが再度実行されることがあります。


MoveFirst、MoveLast、MoveNext、MovePrevious メソッド (RDS)

指定した Recordset オブジェクトの最初、最後、次、または前のレコードに移動します。

構文

DataControl.Recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}

パラメータ

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

解説

RDS.DataControl オブジェクトで Move メソッドを使用すると、Web ページのデータ連結コントロールのデータ レコード間を移動できます。たとえば、RDS.DataControl オブジェクトにバインドすることでグリッドに Recordset を表示させているとします。[First]、[Last]、[Next]、および [Previous] の 4 つのボタンを追加し、ユーザーが各ボタンをクリックすると、表示されている Recordset の最初、最後、次、または前のレコードに移動できるようにします。これを実行するには、[First]、[Last]、[Next]、および [Previous] の各ボタンの onClick プロシージャで、RDS.DataControl オブジェクトの MoveFirst、MoveLast、MoveNext、および MovePrevious の各メソッドを呼び出します。この方法は、「Address Book の移動ボタン」に示されています。


MoveRecord メソッド (ADO)

MoveRecord メソッド

ファイルまたはディレクトリとその内容を別の場所に移動します。

構文

MoveRecord (Source, Destination, UserName, Password, Options, Async)

パラメータ

Source 省略可能です。移動する Record を指定した URL を含む、文字列型 (String) の値を指定します。Source を省略するか、または空文字列を指定した場合、カレント レコードの Record で示されているファイルまたはディレクトリが移動されます。

Destination 省略可能です。Source の移動先の場所を指定した URL を含む、文字列型 (String) の値を指定します。

UserName 省略可能です。Destination へのアクセスを認可したユーザー ID を含む、文字列型 (String) の値を指定します。

Password 省略可能です。UserName を確認するためのパスワードを含む、文字列型 (String) の値を指定します。

Options 省略可能です。このメソッドの動作を設定する MoveRecordOptionsEnum 値を指定します。既定値は adMoveUnspecified です。

Async 省略可能です。ブール型 (Boolean) の値を指定します。True のときは、この操作が非同期で実行するように設定されます。

戻り値

文字列型 (String) の値を返します。通常は、Destination の値を返します。ただし、実際に返される値は、プロバイダによって決まります。

解説

Source と Destination の値は異なっている必要があります。同じ値の場合は、実行時エラーが発生します。サーバー名、パス名、およびリソース名のうち、少なくとも 1 つが異なっている必要があります。

Destination に既存のファイルまたはディレクトリを指定した場合、adMoveOverWrite を指定していなければ、このメソッドの操作は失敗します。

重要 adMoveOverWrite オプションは、十分に考慮して使用してください。たとえば、ファイルをディレクトリに移動するときにこのオプションを指定すると、移動先のディレクトリが "削除" されて移動元のファイルに置き換えられます。

この操作の終了後、ParentURL プロパティなど、Record オブジェクトの一部の属性が更新されません。Record オブジェクトのプロパティを更新するには、Record を閉じ、そのファイルまたはディレクトリが移動された場所の URL からもう一度開いてください。

Recordset から取得した Record の場合、ファイルまたはディレクトリの移動後の場所は、Recordset にすぐには反映されません。Recordset を更新するには、その Recordset をいったん閉じてもう一度開いてください。


NextRecordset メソッド (ADO)

NextRecordset メソッド

現在の Recordset オブジェクトをクリアし、一連のコマンド操作を実行して次の Recordset を返します。

構文

Set recordset2 = recordset1.NextRecordset(RecordsAffected )

戻り値

Recordset オブジェクトを返します。構文の recordset1 と recordset2 には、同じ Recordset オブジェクト、または別のオブジェクトを指定できます。別の Recordset オブジェクトを指定する場合、NextRecordset の呼び出し後に元の Recordset (recordset1) の ActiveConnection プロパティを再設定すると、エラーが発生します。

パラメータ

RecordsAffected 省略可能です。長整数型 (Long) の変数で指定します。プロバイダは、操作の影響を受けたレコード数を返します。

注意 このパラメータは、操作の影響を受けたレコード数のみを返します。Recordset を作成するために使用された Select ステートメントからのレコード数を返すことはありません。

解説

NextRecordset メソッドでは、複合コマンド ステートメントの次のコマンドの結果、または複数の結果を返すストアド プロシージャの結果を返します。Command オブジェクトで Execute メソッドを使用するか、または Recordset オブジェクトで Open メソッドを使用して、"SELECT * FROM table1;SELECT * FROM table2" などの複合コマンド ステートメントに基づく Recordset オブジェクトを開いた場合、最初のコマンドのみが実行され、その結果が recordset に返されます。ステートメントの次のコマンドの結果にアクセスするには、NextRecordset メソッドを呼び出します。

残りの結果が存在し、複合ステートメントを含む Recordset がプロセスの境界を越えてマーシャリングされていない限り、NextRecordset メソッドは Recordset オブジェクトを返し続けます。行を返すコマンドからレコードが返されない場合、Recordset オブジェクトは空になります。これに該当するかどうかを調べるには、BOF と EOF のプロパティが両方とも True になっているかどうかを確認します。行を返さないコマンドが正しく実行された場合、返された Recordset オブジェクトは閉じています。この場合は、Recordset オブジェクトで State プロパティを調べて確認します。残りの結果が存在しない場合、recordset は Nothing に設定されます。

RDS での使用 クライアント側の Recordset オブジェクトでは、NextRecordset メソッドは使用できません。

即時更新モードで編集を行っているときに NextRecordset メソッドを呼び出すと、エラーが発生します。この場合は、最初に Update メソッドまたは CancelUpdate メソッドを呼び出してください。

複合ステートメントの複数のコマンドにパラメータを渡すには、Parameters コレクションを使用するか、または元の Open メソッドまたは Execute メソッドの呼び出しで配列を渡します。この場合、コレクションまたは配列のパラメータの並び順が、一連のコマンドの並び順と同じであることが必要です。出力パラメータの値を読み込むには、すべての結果の読み込みが終了している必要があります。

NextRecordset メソッドを呼び出すと、ステートメントの次のコマンドのみが実行されます。ステートメントのすべてのコマンドを実行する前に Recordset オブジェクトを明示的に閉じると、残りのコマンドは実行されません。


Open メソッド (ADO Connection)

データ ソースへの接続を開きます。

構文

connection.Open ConnectionString, UserID, Password, Options

パラメータ

ConnectionString 省略可能です。接続情報を含む文字列型 (String) の値を指定します。有効な設定値の詳細については、ConnectionString プロパティを参照してください。

UserID 省略可能です。接続を確立するときに使用するユーザー名を含む、文字列型 (String) の値を指定します。

Password 省略可能です。接続を確立するときに使用するパスワードを含む、文字列型 (String) の値を指定します。

Options 省略可能です。接続が確立された後 (同期) または確立される前 (非同期) の、どちらでこのメソッドが終了するかを決定する ConnectOptionEnum 値を指定します。

解説

Connection オブジェクトで Open メソッドを使うと、データ ソースへの物理的な接続を確立できます。このメソッドが正常に終了すると、接続が有効になり、この接続に対してコマンドを実行し、その結果を処理することができます。

ConnectionString 引数は、セミコロンで区切られた一連の "引数 = 値" のステートメントからなる接続文字列を指定するか、または URL で識別されるファイルまたはディレクトリのリソースを指定する場合に使用します。ConnectionString プロパティは、ConnectionString 引数の値を自動的に継承します。したがって、Connection オブジェクトを開く前に ConnectionString プロパティを設定するか、または Open メソッドの呼び出し時に ConnectionString 引数を使って現在の接続パラメータを設定または上書きします。

ConnectionString 引数にユーザーおよびパスワードの情報を指定し、同時に UserID 引数と Password 引数も指定した場合は、UserID 引数と Password 引数に指定された値が ConnectionString 引数に指定された値より優先されます。

開いている Connection オブジェクトでの操作が完了したら、Close メソッドを使って関連するすべてのシステム リソースを解放します。オブジェクトを閉じてもメモリからは削除されないので、そのオブジェクトのプロパティ設定を変更し、Open メソッドを使ってもう一度開くことができます。オブジェクトをメモリから完全に削除するには、オブジェクト変数を Nothing に設定します。

RDS での使用 クライアント側の Connection オブジェクトで Open メソッドを使用する場合、その Connection オブジェクトで Recordset が開かれるまで、サーバーへの接続は確立されません。


Open メソッド (ADO Record)

既存の Record オブジェクトを開くか、または新規のファイルまたはディレクトリを作成します。

構文

Open Source, ActiveConnection, Mode, CreateOptions, Options, UserName, Password

パラメータ

Source 省略可能です。Record オブジェクトで表されるエンティティの URL、または開いている Recordset オブジェクトの行を表すバリアント型 (Variant) の値を指定します。

ActiveConnection 省略可能です。後に続く Record の操作対象となるファイルまたはディレクトリ (コンテキスト) を指定する接続文字列または開いている Connection オブジェクトを表すバリアント型 (Variant) の値を指定します。

Mode 省略可能です。結果の Record オブジェクトのアクセス モードを ConnectModeEnum 値で指定します。既定値は adModeUnknown です。

CreateOptions 省略可能です。既存のファイルまたはディレクトリを開くか、新規のファイルまたはディレクトリを作成するかを、RecordCreateOptionsEnum 値で指定します。既定値は adFailIfNotExists です。既定値の場合、アクセス モードは Mode プロパティから取得されます。

Options 省略可能です。Record を開くときのオプションを RecordOpenOptionsEnum 値で指定します。既定値は adOpenRecordUnspecified です。複数の値を組み合わせて指定することもできます。

UserName 省略可能です。Source へのアクセスを認可するユーザー ID を含む、文字列型 (String) の値を指定します。

Password 省略可能です。UserName を確認するためのパスワードを含む、文字列型 (String) の値を指定します。

解説

Source には、次の値を指定できます。

  • 絶対 URL。Source は、既存のファイルまたはディレクトリを示します。ActiveConnection が指定されていない場合は、Source を使って Connection オブジェクトが暗黙的に作成されます。

  • 相対 URL。この場合、ActiveConnection で相対 URL を定義するコンテキストを設定するので、ActiveConnection には、有効な Connection オブジェクト、絶対 URL、ディレクトリを含む Record オブジェクトのいずれかを指定する必要があります。

  • 開いている Recordset オブジェクト。開かれた Record オブジェクトは、Recordset 内のカレント行を表します。中間層のカスタム ビジネス オブジェクトによって提供された Recordset のプロキシを使ってローカルの Record を開くことはできません。

    ユーザーは、Record オブジェクトを開く前に、Recordset の行位置を目的の行に設定する必要があります。

    Record オブジェクトは、Recordset オブジェクトの即時更新モードまたはバッチ更新モードを継承します。バッチ モードの場合、Record オブジェクトに加えた変更は、Recordset で UpdateBatch メソッドが呼び出されたときにデータ ソースに反映されます。

    Recordset オブジェクトの Fields コレクションは、Record オブジェクトと Recordset オブジェクトに共通するフィールドの、OriginalValue プロパティおよび UnderlyingValue プロパティへのアクセスに使用されます。ただし、Record オブジェクトのみに存在するフィールドについては、これらのプロパティを参照することはできません。

    ソースが Recordset オブジェクトの場合は、CreateOptions は使用できません。これは、Recordset 内に新規行を直接作成することができないためです。

    開いている Recordset を閉じてもう一度開くまで、その Recordset に新規 Record が反映されない場合があります。

    Recordset の位置が BOF または EOF に設定されている場合、Recordset に行が含まれていない場合、基になるプロバイダが Record オブジェクトをサポートしていない場合、または CreateOptions が指定されている場合は、実行時エラーが発生します。

Record オブジェクトが、URL でアクセスできないエンティティ (たとえば、データベースから取得した Recordset の行など) を表す場合、ParentURL プロパティの値、および adRecordURL 定数でアクセスするフィールドの値はどちらも Null になります。

使用例

以下に示す各 Open ステートメントでは、URL の例として "sample.microsoft.com" という Web サイトを使用します。

最初のステートメントでは、ソースはフォルダの URL です。Connection は、URL から暗黙的に作成されます。

Dim Record As ADODB.Record
Set Record = New ADODB.Record
Record.Open "http://sample.microsoft.com/myfolder/"

2 番目のステートメントでは、ソースは、指定した接続文字列のコンテキスト内の URL です。"URL=" キーワードは、その接続文字列が URL であることを指定します。

Dim Record As ADODB.Record
Set Record = New ADODB.Record
Record.Open "mysubfolder", "URL=http://sample.microsoft.com/myfolder/"

3 番目のステートメントでは、ソースは、指定した開いている Connection オブジェクトのコンテキスト内の相対 URL です。

Dim Connection As ADODB.Connection
Dim Record As ADODB.Record
Set Connection = New ADODB.Connection
Set Record = New ADODB.Record
Connection.Open "URL=http://sample.microsoft.com/myfolder/"
Record.Open "mydoc.doc", Connection

4 番目のステートメントでは、ソースは、ディレクトリを表す、開いている Record オブジェクトのコンテキスト内の相対 URL です。

Dim Record As ADODB.Record
Dim anotherRecord As ADODB.Record
Set Record = New ADODB.Record
Set anotherRecord = New ADODB.Record
anotherRecord.Open "http://sample.microsoft.com/myfolder/"
Record.Open "mydoc.doc", anotherRecord.ActiveConnection

5 番目のステートメントでは、ソースは、開いている Recordset のカレント行です。Recordset の Open メソッドの Connection パラメータに URL キーワードを使用する場合は、Options パラメータに adCmdTableDirect を指定する必要があります。

Dim Recordset As ADODB.Recordset
Set Recordset = New ADODB.Recordset
Recordset.Open "mydoc.doc", _
   "URL=http://sample.microsoft.com/myfolder/",,,adCmdTableDirect
Record.Open Recordset


Open メソッド (ADO Recordset)

カーソルを開きます。

構文

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

パラメータ

Source 省略可能です。有効な Command オブジェクト、SQL ステートメント、テーブル名、ストアド プロシージャの呼び出し、URL、または永続的に保存された Recordset が格納されているファイル名または Stream オブジェクト名の評価に使うバリアント型 (Variant) の値を指定します。

ActiveConnection 省略可能です。有効な Connection オブジェクトのオブジェクト変数の評価に使うバリアント型 (Variant) の値、または ConnectionString パラメータを含む文字列型 (String) の値を指定します。

CursorType 省略可能です。プロバイダが Recordset を開くときに使うカーソル タイプを決めるための CursorTypeEnum 値を指定します。既定値は adOpenForwardOnly です。

LockType 省略可能です。プロバイダが Recordset を開くときに使うロック (同時実行) の種類を決めるための LockTypeEnum 値を指定します。既定値は adLockReadOnly です。

Options 省略可能です。Source 引数が Command オブジェクト以外のソースを表す場合にプロバイダが Source 引数を評価する方法、または以前に保存されていたファイルから Recordset を復元する必要があることを示す長整数型 (Long) の値を指定します。1 つまたは複数の CommandTypeEnum 値または ExecuteOptionEnum 値を指定できます。

注意 永続化された Recordset を含む Stream から Recordset を開く場合、ExecuteOptionEnum 値の adAsyncFetchNonBlocking を使用しても無効です。この場合、フェッチは同期であり、ブロッキングが行われます。

解説

Recordset オブジェクトで Open メソッドを使うと、ベース テーブルからのレコード、クエリの結果、または以前に保存された Recordset を表すカーソルを開くことができます。

Source 引数は、Command オブジェクト変数、SQL ステートメント、ストアド プロシージャ、テーブル名、URL、ファイルの完全なパス名のいずれかでデータ ソースを指定する場合に使用します。Source にファイルのパス名を指定する場合は、フル パス ("c:\dir\file.rst")、相対パス ("..\file.rst")、または URL ("http://files/file.rst") で指定することができます。

ActiveConnection 引数は ActiveConnection プロパティに対応しており、Recordset オブジェクトを開く接続を指定します。この引数に接続の定義を指定した場合、ADO では、指定されたパラメータを使って新規接続を開きます。Recordset を開いて別のプロバイダに更新を送出した後で、このプロパティの値を変更することができます。また、このプロパティを Nothing (Microsoft Visual Basic) に設定すると、その Recordset をプロバイダから切断することができます。

Recordset オブジェクトのプロパティに対応するその他の引数 (Source、CursorType、および LockType) と、プロパティの関係は次のとおりです。

  • Recordset オブジェクトを開く前のプロパティは、読み取り/書き込みです。

  • Open メソッドの実行時に、対応する引数を指定しなければ、プロパティの設定値が使用されます。引数を指定した場合は、対応するプロパティの設定値が上書きされて引数の値に更新されます。

  • Recordset オブジェクトを開いた後は、プロパティは読み取り専用になります。

    注意 Recordset オブジェクトの Source プロパティに有効な Command オブジェクトが設定されている場合、その Recordset オブジェクトが開いていなくても、ActiveConnection プロパティは読み取り専用になります。

Source 引数に Command オブジェクトを指定する場合に、同時に ActiveConnection 引数を指定すると、エラーが発生します。Command オブジェクトの ActiveConnection プロパティは、あらかじめ有効な Connection オブジェクトまたは接続文字列に設定しておく必要があります。

Source 引数に Command オブジェクト以外のソースを指定する場合は、Options 引数を使って Source 引数の評価を最適化することができます。Options 引数が指定されていない場合は、パフォーマンスが低下する可能性があります。これは、引数が SQL ステートメント、ストアド プロシージャ、URL、テーブル名のいずれであるかを判断するために、プロバイダを呼び出す必要があるためです。指定する Source の種類がわかっている場合は、Options 引数を設定することにより、該当するコードに直接ジャンプすることができます。Options 引数が Source の種類と一致しない場合は、エラーが発生します。

Source 引数に Stream オブジェクトを指定する場合は、ほかの引数は指定しないでください。そのようにすると、エラーが発生します。Stream から Recordset を開く場合は、ActiveConnection の情報は保持されません。

Recordset に接続が関連付けられていない場合、Options 引数の既定値は adCmdFile です。代表的な例では、永続的に保存された Recordset オブジェクトの場合がこれに該当します。

データ ソースからレコードが返されない場合、プロバイダは BOF プロパティと EOF プロパティの両方を True に設定し、カレント レコードの位置は未定義になります。カーソル タイプによっては、この空の Recordset オブジェクトに新規データを追加することができます。

開いている Recordset オブジェクトでの操作が完了したら、Close メソッドを使って関連するすべてのシステム リソースを解放します。オブジェクトを閉じてもメモリからは削除されないので、そのオブジェクトのプロパティ設定を変更し、Open メソッドを使ってもう一度開くことができます。オブジェクトをメモリから完全に削除するには、オブジェクト変数に Nothing を設定します。

ActiveConnection プロパティを設定する前に、オペランドなしで Open メソッドを呼び出して、Recordset の Fields コレクションにフィールドを追加することによって作成された Recordset のインスタンスを作成します。

CursorLocation プロパティを adUseClient に設定している場合は、2 とおりの方法で非同期に行を取得することができます。推奨される方法は、Options を adAsyncFetch に設定することです。もう 1 つの方法として、Properties コレクションで "非同期行セット処理" ダイナミック プロパティを使用することもできますが、Options パラメータを adAsyncFetch に設定していない場合は、関連して取得されたイベントが失われる可能性があります。

注意 MS Remote プロバイダのバックグラウンド フェッチは、Open メソッドの Options パラメータを通してのみサポートされます。


Open メソッド (ADO Stream)

バイナリ データまたはテキスト データのストリームを操作する Stream オブジェクトを開きます。

構文

Stream.Open Source, Mode, OpenOptions, UserName, Password

パラメータ

Source 省略可能です。Stream のデータ ソースを設定するバリアント型 (Variant) の値を指定します。Source には、電子メール システムやファイル システムのような、ツリー構造の既存ノードを示す絶対 URL の文字列を指定することもできます。URL を指定する場合は、"URL=http://server/folder" のように、URL キーワードを使用する必要があります。また、既に開いている Record オブジェクトへの参照を Source に指定し、その Record に関連付けられた既定のストリームを開くこともできます。Source を指定しない場合、Stream のインスタンスが生成されて開かれ、既定では、基になるソースは関連付けられません。

Mode 省略可能です。結果の Stream のアクセス モード (読み取り/書き込み、読み取り専用など) を ConnectModeEnum 値で指定します。既定値は adModeUnknown です。アクセス モードの詳細については、Mode プロパティを参照してください。Mode を指定しない場合は、ソース オブジェクトのアクセス モードが継承されます。たとえば、ソース Record が読み取り専用モードで開かれている場合、既定では、その Stream も読み取り専用モードで開かれます。

OpenOptions 省略可能です。StreamOpenOptionsEnum 値を指定します。既定値は adOpenStreamUnspecified です。

UserName 省略可能です。Stream オブジェクトにアクセスするためのユーザー ID を含む文字列型 (String) の値を指定します。

Password 省略可能です。Stream オブジェクトにアクセスするためのパスワードを含む文字列型 (String) の値を指定します。

解説

Source パラメータに Record オブジェクトを指定する場合、その Record オブジェクトへのアクセスは既に有効になっているので、UserID パラメータおよび Password パラメータは使用されません。同様に、Record オブジェクトの Mode が Stream オブジェクトに転送されます。

Source を指定しない場合、開かれた Stream にはデータが含まれず、Size はゼロ (0) になります。この Stream を閉じたときに、そこに書き込まれたデータが失われないようにするには、その Stream を、CopyTo メソッドまたは SaveToFile メソッドを使って保存するか、メモリの別の場所に保存します。

Stream が開かれていないときは、その Stream のすべての読み取り専用プロパティを取得することができます。Stream が非同期で開かれている場合、後に続くすべての操作 (State プロパティおよびその他の読み取り専用プロパティのチェックを除く) は、Open の非同期操作が終了するまでブロックされます。


OpenSchema メソッド (ADO)

OpenSchema メソッド

プロバイダからデータベースのスキーマ情報を取得します。

構文

Set recordset = connection.OpenSchema (QueryType, Criteria, SchemaID)

戻り値

スキーマ情報を含む Recordset オブジェクトを返します。Recordset は、読み取り専用の静的カーソルとして開かれます。Recordset に表示される列は、QueryType によって決まります。

パラメータ

QueryType 実行するスキーマ クエリの種類を表す SchemaEnum 値を指定します。

Criteria 省略可能です。SchemaEnum の指定に従って、各 QueryType オプションのクエリ制約の配列を指定します。

SchemaID OLE DB の仕様に定義されていないプロバイダ スキーマのクエリの GUID (グローバル一意識別子) を指定します。QueryType が adSchemaProviderSpecific に設定されている場合に、このパラメータを指定する必要があります。それ以外の場合は、このパラメータは使用しません。

解説

OpenSchema メソッドは、データ ソースに含まれるテーブル、テーブルに含まれる列、サポートされているデータ型など、そのデータ ソースの内容に関する情報を返します。

QueryType 引数は、返される列 (スキーマ) を示す GUID です。OLE DB の仕様には、すべてのスキーマの一覧があります。

Criteria 引数は、スキーマ クエリの結果を制限します。Criteria は、結果の Recordset で、該当する列のサブセット ("制約列") に表示する値の配列を指定します。

プロバイダが OLE DB 仕様以外の非標準スキーマ クエリを独自に定義する場合は、QueryType 引数に adSchemaProviderSpecific 定数を使用します。この定数を使用する場合は、SchemaID 引数に、実行するスキーマ クエリの GUID を指定する必要があります。QueryType が adSchemaProviderSpecific に設定され、SchemaID が指定されていない場合は、エラーが発生します。

プロバイダは、すべての OLE DB 標準スキーマ クエリをサポートする必要はありません。OLE DB の仕様では、adSchemaTables、adSchemaColumns、および adSchemaProviderTypes のみが必要とされます。ただし、これらのスキーマ クエリでは、プロバイダは Criteria の制約をサポートする必要はありません。

RDS での使用 OpenSchema メソッドは、クライアント側の Connection オブジェクトでは使用できません。

注意 Visual Basic では、Connection オブジェクトの OpenSchema メソッドから返された Recordset の列に 4 バイトの符号なし整数 (DBTYPE UI4) が含まれる場合、それらの列をほかの変数と比較することはできません。OLE DB データ型の詳細については、「Microsoft OLE DB Programmer's Reference」の「Chapter 13」および「Appendix A」を参照してください。


Query メソッド (RDS)

有効な SQL クエリ文字列を使って Recordset オブジェクトを返します。

構文

Set Recordset = DataFactory.Query(Connection, Query)

パラメータ

Recordset Recordset オブジェクトを表すオブジェクト変数を指定します。

DataFactory RDSServer.DataFactory オブジェクトを表すオブジェクト変数を指定します。

Connection サーバー接続情報を含む文字列型 (String) の値を指定します。このパラメータは、Connect プロパティと同様の働きをします。

Query SQL クエリを含む文字列型 (String) の値を指定します。

解説

クエリでは、データベース サーバーの SQL 文法を使用する必要があります。実行されたクエリにエラーがある場合は、結果のステータスが返されます。Query メソッドでは、Query 文字列の構文チェックは行われません。


Read メソッド (ADO)

Read メソッド

バイナリ型の Stream オブジェクトから、指定したバイト数のデータを読み取ります。

構文

Variant = Stream.Read ( NumBytes )

パラメータ

NumBytes 省略可能です。ファイルから読み取るバイト数を指定する長整数型 (Long) の値、または StreamReadEnum 値を指定します。既定値は adReadAll です。

戻り値

Read メソッドは、Stream オブジェクトから指定バイト数またはストリーム全体を読み取り、読み取ったデータをバリアント型 (Variant) の値として返します。

解説

NumBytes の指定バイト数が Stream の残りバイト数を超える場合は、残っているバイトのみが返されます。読み取ったデータは、NumBytes で指定された長さに一致するように補充されることはありません。読み取るバイトが残っていない場合は、Null 値を持つバリアント型の値が返されます。Read メソッドは、逆方向の読み取りには使用できません。

注意 NumBytes は、常にバイト数を表すものです。文字列型の Stream オブジェクトには、ReadText を使用してください。


ReadText メソッド (ADO)

ReadText メソッド

文字列型の Stream オブジェクトから、指定した文字数のデータを読み取ります。

構文

String = Stream.ReadText ( NumChars )

パラメータ

NumChars 省略可能です。ファイルから読み取る文字数を指定する長整数型 (Long) の値、または StreamReadEnum 値を指定します。既定値は adReadAll です。

戻り値

ReadText メソッドは、Stream オブジェクトから指定文字数、行全体、またはストリーム全体を読み取り、読み取った文字列を返します。

解説

NumChar の指定文字数が Stream の残り文字数を超える場合は、残っている文字のみが返されます。読み取った文字列は、NumChar で指定された長さに一致するように補充されることはありません。読み取る文字が残っていない場合は、Null 値を持つバリアント型の値が返されます。ReadText は、逆方向の読み取りには使用できません。

ReadText メソッドは、Type が adTypeText の文字列型ストリームで使用します。バイナリ型のストリームには、Read を使用してください。


Refresh メソッド (ADO)

Refresh メソッド

コレクションのオブジェクトを更新し、プロバイダから使用可能な、プロバイダに固有のオブジェクトを反映します。

構文

collection.Refresh

解説

Refresh メソッドは、どのコレクションから呼び出すかによって異なるタスクを実行します。

Parameters

Command オブジェクトの Parameters コレクションで Refresh メソッドを使うと、Command オブジェクトで指定されたストアド プロシージャまたはパラメータ クエリに関するプロバイダ側のパラメータ情報を取得できます。プロバイダがストアド プロシージャの呼び出しまたはパラメータ クエリをサポートしない場合、コレクションは空になります。

Refresh メソッドを呼び出す前に、Command オブジェクトの ActiveConnection プロパティを有効な Connection オブジェクトに、CommandText プロパティを有効なコマンドに、および CommandType プロパティを adCmdStoredProc に設定する必要があります。

Refresh メソッドを呼び出す前に Parameters コレクションにアクセスすると、自動的に Refresh メソッドが呼び出され、そのコレクションが更新されます。

注意 Refresh メソッドを使用してプロバイダからパラメータ情報を取得し、1 つまたは複数の可変長データ型の Parameter オブジェクトを返す場合、ADO ではパラメータの最大可能サイズに基づいてメモリを割り当てるため、実行時にエラーが発生することがあります。エラーを避けるには、Execute メソッドを呼び出す前に、これらのパラメータの Size プロパティを明示的に設定します。

Fields

Fields コレクションで Refresh メソッドを使用した場合、その結果は表示されません。基になるデータベース構造から変更を取得するには、Requery メソッドを使用する必要があります。Recordset オブジェクトがブックマークをサポートしない場合は、MoveFirst メソッドを使用します。

Properties

オブジェクトの中には、Properties コレクションで Refresh メソッドを使用すると、プロバイダが公開するダイナミック プロパティによって Properties コレクションを更新するものがあります。これらのプロパティは、ADO でサポートされている組み込みプロパティにはない、プロバイダに固有の機能に関する情報を提供します。


Refresh メソッド (RDS)

Connect プロパティに指定されたデータ ソースを再クエリし、クエリ結果を更新します。

構文

DataControl.Refresh

パラメータ

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

解説

Refresh メソッドを使用する前に、Connect、Server、および SQL の各プロパティを設定する必要があります。RDS.DataControl オブジェクトに関連付けられたフォーム上のすべてのデータ連結コントロールに、新しいレコードのセットが反映されます。既存の Recordset オブジェクトはすべて解放され、保存前の変更はすべて破棄されます。Refresh メソッドは、自動的に最初のレコードをカレント レコードに設定します。

データの操作時には、定期的に Refresh メソッドを呼び出すことをお勧めします。データを取得してから、しばらくクライアント コンピュータ上でそのままにしておくと、ほとんどの場合、そのデータの情報は古くなります。また、ほかのユーザーが同じレコードを変更し、自分よりも先に変更を適用する場合があるため、そのレコードの変更に失敗する可能性があります。


Requery メソッド (ADO)

Requery メソッド

オブジェクトの基になるクエリを再実行して Recordset オブジェクトのデータを更新します。

構文

recordset.Requery Options

パラメータ

Options 省略可能です。この操作に関する ExecuteOptionEnum 値を含むビットマスクを指定します。このパラメータを adAsyncExecute に設定すると、この操作は非同期で実行され、操作の終了時に RecordsetChangeComplete イベントが発生します。

解説

Requery メソッドは、元のコマンドを再実行してデータをもう一度取得することにより、データ ソースから Recordset オブジェクトの内容全体を更新します。このメソッドを呼び出すと、Close メソッドと Open メソッドを連続して呼び出した場合と同じ働きをします。カレント レコードを編集しているとき、または新規レコードを追加しているときにこのメソッドを呼び出すと、エラーが発生します。

Recordset オブジェクトが開いている間、カーソルの属性を定義するプロパティ (CursorType、LockType、MaxRecords など) は、読み取り専用になっています。このため、Requery メソッドでは、現在のカーソルの更新のみを行うことができます。カーソルのプロパティを変更して結果を参照するには、それらのプロパティを読み取り/書き込み可能にするために Close メソッドを使用する必要があります。その後で、目的のプロパティの設定を変更し、Open メソッドを呼び出してカーソルを再度開きます。


Reset メソッド (RDS)

指定されたソートとフィルタのプロパティに基づいて、クライアント側の Recordset でソートまたはフィルタを実行します。

構文

DataControl.Reset(value)

パラメータ

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

value 省略可能です。ブール型 (Boolean) の値を指定します。現在 "フィルタ選択されている" 行セットでフィルタを実行する場合は、True (既定値) を指定します。以前のフィルタ オプションをすべて破棄して元の行セットでフィルタを実行する場合は、False を指定します。

解説

SortColumn、SortDirection、FilterValue、FilterCriterion、および FilterColumn の各プロパティは、クライアント側のキャッシュ上でソート機能とフィルタ機能を提供します。ソート機能は、1 つの列の値によってレコードを並べ替えます。フィルタ機能は、抽出条件に基づいてレコードのサブセットを表示します。このとき、キャッシュには Recordset 全体が保持されています。Reset メソッドは、抽出条件を実行し、現在の Recordset を更新可能な Recordset に置き換えます。

元のデータの変更がまだ適用されていない場合、Reset メソッドの操作は失敗します。まず、SubmitChanges メソッドを使って読み取り/書き込み可能な Recordset の変更を保存し、次に、Reset メソッドを使ってレコードのソートまたはフィルタを実行します。

行セットに複数のフィルタを実行する場合、Reset メソッドで Boolean 引数を使用できます。次の例は、その実行方法を示します。

ADC.SQL = "Select au_lname from authors"
ADC.Refresh    ' Get the new rowset.

ADC.FilterColumn = "au_lname"
ADC.FilterCriterion = "<"
ADC.FilterValue = "'M'"
ADC.Reset         ' Rowset now has all Last Names < "M".

ADC.FilterCriterion = ">"
ADC.FilterValue = "'F'"
' Passing True is not necessary, because it is the
' default filter on the current "filtered" rowset.
ADC.Reset(TRUE)     ' Rowset now has all Last
                    ' Names < "M" and > "F".

ADC.FilterCriterion = ">"
ADC.FilterValue = "'T'"
' Filter on the original rowset, throwing out the
' previous filter options.
ADC.Reset(FALSE)   ' Rowset now has all Last Names > "T".


Resync メソッド (ADO)

Resync メソッド

現在の Recordset オブジェクト、または Record オブジェクトの Fields コレクションのデータを、基になるデータベースのデータで更新します。

構文

Recordset.Resync AffectRecords, ResyncValues

Record.Fields.Resync ResyncValues

パラメータ

AffectRecords 省略可能です。Resync メソッドで操作するレコード数を決める AffectEnum 値を指定します。既定値は adAffectAll です。この値は、Record オブジェクトにおける Fields コレクションの Resync メソッドでは無効です。

ResyncValues 省略可能です。基になる値に上書きするかどうかを指定する ResyncEnum 値を指定します。既定値は adResyncAllValues です。

解説

Recordset

Resync メソッドは、基になるデータベースと現在の Recordset のレコードを再同期させるために使用します。このメソッドは、静的または前方専用のカーソルを使用しているときに、基になるデータベースに変更があったかどうかを確認する場合に役立ちます。

CursorLocation プロパティを adUseClient に設定すると、Resync メソッドは、読み取り専用以外の Recordset オブジェクトで有効になります。

Requery メソッドとは異なり、Resync メソッドでは、Recordset オブジェクトの基になるコマンドは再実行されません。基になるデータベースの新規レコードは表示されません。

基になるデータとの競合 (たとえば、ほかのユーザーによってレコードが既に削除されている場合) が原因で再同期に失敗した場合、プロバイダから Errors コレクションに警告が返され、実行時エラーが発生します。競合しているレコードを特定するには、Filter プロパティ (adFilterAffectedRecords) と Status プロパティを使用します。

ダイナミック プロパティの Unique Table および Resync Command が設定されており、Recordset が、複数のテーブルに対する JOIN 操作の実行結果である場合、Resync メソッドは、Unique Table プロパティに指定されたテーブルに対してのみ、Resync Command プロパティに指定されたコマンドを実行します。

Fields

Resync メソッドは、Record オブジェクトの Fields コレクションを、基になるデータ ソースと再同期させるために使用します。Count プロパティは、このメソッドによる影響は受けません。

ResyncValues を adResyncAllValues (既定値) に設定すると、コレクションに含まれる Field オブジェクトの UnderlyingValue、Value、および OriginalValue の各プロパティが同期化されます。ResyncValues を adResyncUnderlyingValues に設定すると、UnderlyingValue プロパティのみが同期化されます。

呼び出し時の各 Field オブジェクトの Status プロパティの値は、Resync メソッドの動作にも影響します。Field オブジェクトの Status の値が adFieldPendingUnknown または adFieldPendingInsert に設定されている場合は、Resync の動作には影響しません。Status の値が adFieldPendingChange または adFieldPendingDelete に設定されている場合、Resync メソッドは、データ ソースにまだ存在しているフィールドのデータ値を同期化します。

Resync メソッドは、呼び出されたときにエラーが発生しない限り、Field オブジェクトの Status の値は変更しません。たとえば、フィールドが既に存在しない場合、プロバイダは、adFieldDoesNotExist など、その Field オブジェクトに該当する Status の値を返します。返された Status の値が論理的に結合されて Status プロパティの値になることもあります。


Save メソッド (ADO)

Save メソッド

Recordset をファイルまたは Stream オブジェクトに保存します。

構文

recordset.Save Destination, PersistFormat

パラメータ

Destination 省略可能です。Recordset を保存するファイルの完全なパス名を表すバリアント型 (Variant) の値、または Stream オブジェクトへの参照を指定します。

PersistFormat 省略可能です。Recordset の保存形式 (XML または ADTG) を PersistFormatEnum 値で指定します。既定値は adPersistADTG です。

解説

Save メソッドは、開いている Recordset でのみ呼び出すことができます。保存した Recordset を Destination から復元する場合は、Open メソッドを使用します。

Recordset に対して Filter プロパティが有効である場合、フィルタ選択によってアクセスできる行のみが保存されます。階層 Recordset の場合、親の Recordset を含めて、現在の子 Recordset と、その子がすべて保存されます。子 Recordset の 1 つで Save メソッドを呼び出す場合は、その子 Recordset と、その子がすべて保存されますが、その親は保存されません。

Recordset を初めて保存するときに、Destination の指定を省略することができます。Destination を省略すると、Recordset の Source プロパティの値に設定された名前で新規ファイルが作成されます。

初めて保存した後に、続けて Save メソッドを呼び出すときは、Destination を指定しないでください。指定すると、実行時エラーが発生します。Save メソッドを続けて呼び出すときに新しい Destination を指定すると、Recordset は新しい保存先に保存されます。ただし、その場合、新しい保存先と元の保存先の両方が開いています。

Save メソッドは、Recordset または Destination を閉じません。したがって、Recordset の操作を継続し、最新の変更を保存することができます。Recordset を閉じるまで、Destination は開いたままになります。その間、ほかのアプリケーションからその Destination に対する読み取りは可能ですが、書き込みはできません。

セキュリティ上の理由により、Save メソッドは、Microsoft Internet Explorer で実行されるスクリプトからは、低レベルおよびカスタムのセキュリティ設定の使用のみが許可されます。セキュリティに関する問題の詳細については、「Microsoft Data Access Technical Articles」の「ActiveX Data Objects (ADO) Technical Articles」の「ADO and RDS Security Issues in Microsoft Internet Explorer」を参照してください。

非同期の Recordset のフェッチ、実行、または更新の操作中に Save メソッドが呼び出された場合、Save メソッドは、非同期操作が完了するまで待機します。

レコードは、Recordset の最初の行から順に保存されます。Save メソッドが終了すると、カレント行の位置は Recordset の最初の行になります。

最良の結果を得るには、Save メソッドの実行時に、CursorLocation プロパティを adUseClient に設定してください。プロバイダが、Recordset オブジェクトを保存するために必要なすべての機能をサポートしていない場合は、Cursor Service がその機能を提供します。

Recordset の CursorLocation プロパティが adUseServer に設定されたままの場合、その Recordset の更新機能が制限されます。プロバイダの機能によって異なりますが、通常は、単一テーブルの更新、挿入、および削除のみが許可されます。この設定では、Resync メソッドも利用できません。

注意 ADO では、Fields の種類が adVariant、adIDispatch、または adIUnknown に設定された Recordset の保存はサポートされておらず、予期しない結果が生じることがあります。

Destination パラメータには、OLE DB IStream インターフェイスをサポートするすべてのオブジェクトを指定できるので、Recordset を直接 ASP Response オブジェクトに保存することができます。詳細については、「XML Recordset の永続化のシナリオ」を参照してください。

次の Visual Basic コードに示すように、XML 形式の Recordset を MSXML DOM オブジェクトのインスタンスに保存することもできます。

Dim xDOM As New MSXML.DOMDocument
Dim rsXML As New ADODB.Recordset
Dim sSQL As String, sConn As String

sSQL = "SELECT customerid, companyname, contactname FROM customers"
sConn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Program Files" & _
        "\Common Files\System\msadc\samples\NWind.mdb"
rsXML.Open sSQL, sConn
rsXML.Save xDOM, adPersistXML   'Save Recordset directly into a DOM tree.
...

注意 階層 Recordsets (データ シェイプ) を XML 形式で保存するときは、2 つの制限事項があります。階層 Recordset に保留中の更新が含まれている場合は XML で保存できません。また、パラメータ化された階層 Recordset を保存することはできません。


SaveToFile メソッド (ADO)

SaveToFile メソッド

Stream オブジェクトの内容をファイルに保存します。

構文

Stream.SaveToFile FileName, SaveOptions

パラメータ

FileName Stream の内容を保存するファイルの完全修飾名を含む文字列型 (String) の値を指定します。有効なローカルの場所、または UNC 値を介してアクセスできる場所への保存が可能です。

SaveOptions 保存するファイルがまだ存在していない場合に、SaveToFile メソッドで新規ファイルを作成するかどうかを SaveOptionsEnum 値で指定します。既定値は adSaveCreateNotExists です。これらのオプションでは、指定したファイルが存在しない場合にエラーが発生するように指定できます。また、SaveToFile メソッドで既存ファイルの現在の内容を上書きするように指定することもできます。

注意 adSaveCreateOverwrite を設定して既存ファイルを上書きする場合、SaveToFile メソッドによって、元の既存ファイルから、新しい EOS 以降のバイトがすべて削除されます。

解説

SaveToFile メソッドを使うと、Stream オブジェクトの内容をファイルにコピーできます。Stream オブジェクトの内容やプロパティは変更されません。SaveToFile メソッドを呼び出す前に、保存する Stream オブジェクトが開かれている必要があります。

このメソッドでは、Stream オブジェクトと基になるソースの関連付けは変更されません。Stream オブジェクトは、開かれたときのソースである元の URL に関連付けられたままになります。

SaveToFile メソッドの操作後、ストリーム内の現在の位置 (Position) は、ストリームの先頭 (0) に設定されます。


Seek メソッド (ADO)

Seek メソッド

Recordset のインデックスを検索して指定値と一致する行をすばやく検索し、カレント行の位置をその行に変更します。

構文

recordset.Seek KeyValues, SeekOption

パラメータ

KeyValues バリアント型 (Variant) の値の配列を指定します。インデックスは、1 つまたは複数の列で構成されており、この配列には、インデックスの各列と照合するための値を指定します。

SeekOption インデックスの各列とそれに対応する KeyValues を比較するときの、比較の種類を SeekEnum 値で指定します。

解説

基になるプロバイダが Recordset オブジェクトのインデックスをサポートしている場合は、Seek メソッドを Index プロパティと組み合わせて使用します。基になるプロバイダが Seek をサポートしているかどうかを判別するには、Supports (adSeek) メソッドを使用します。プロバイダがインデックスをサポートしているかどうかを判別するには、Supports(adIndex) メソッドを使用します。OLE DB Provider for Microsoft Jet は、Seek および Index をサポートしています。

Seek メソッドで求める行が見つからない場合、エラーは発生せず、行の位置は Recordset の最後になります。このメソッドを実行する前に、必要なインデックスを Index プロパティに設定してください。

このメソッドは、サーバー側のカーソルでのみサポートされます。Recordset オブジェクトの CursorLocation プロパティの値が adUseClient の場合、Seek はサポートされません。

このメソッドは、Recordset オブジェクトが、CommandTypeEnum 値の adCmdTableDirect で開かれている場合にのみ使用できます。


SetEOS メソッド (ADO)

SetEOS メソッド

ストリームの終わりの位置を設定します。

構文

Stream.SetEOS

解説

SetEOS は、現在の Position をストリームの終わりに設定して、EOS プロパティの値を更新します。現在の位置より後のバイトまたは文字はすべて削除されます。

Write、WriteText、および CopyTo の各メソッドでは、既存の Stream オブジェクトの余分な値は削除されません。SetEOS で新しいストリームの終端を設定すると、余分なバイトまたは文字を削除することができます。

警告 EOS をストリームの実際の終端よりも前の位置に設定すると、設定した EOS の位置より後のデータはすべて失われます。


SkipLine メソッド (ADO)

SkipLine メソッド

文字列型のストリームの読み取り時に、1 行全体をスキップします。

構文

Stream.SkipLine

解説

次の行の区切り文字までのすべての文字 (区切り文字を含む) がスキップされます。既定では、LineSeparator は adCRLF に設定されます。EOS を越えてスキップしようとすると、EOS が現在の位置になり、スキップは行われません。

SkipLine メソッドは、Type が adTypeText の文字列型ストリームで使用します。


SubmitChanges メソッド (RDS)

ローカルにキャッシュされた更新可能な Recordset の保留中の変更を、Connect プロパティまたは URL プロパティに指定されたデータ ソースに送信します。

構文

DataControl.SubmitChanges

DataFactory.SubmitChanges Connection, Recordset

パラメータ

DataControl RDS.DataControl オブジェクトを表すオブジェクト変数を指定します。

DataFactory RDSServer.DataFactory オブジェクトを表すオブジェクト変数を指定します。

Connection RDS.DataControl オブジェクトの Connect プロパティで作成された接続を表す文字列型 (String) の値を指定します。

Recordset Recordset オブジェクトを表すオブジェクト変数を指定します。

解説

RDS.DataControl オブジェクトで SubmitChanges メソッドを使用する前に、Connect、Server、および SQL の各プロパティが設定されている必要があります。

同じ Recordset オブジェクトで、SubmitChanges メソッドを呼び出した後に CancelUpdate メソッドを呼び出すと、変更は既にコミットされているので、CancelUpdate メソッドの呼び出しは失敗します。

変更されたレコードのみが送信され修正されます。この時、変更処理がすべて成功するか、またはすべて失敗するかのどちらかになります。

既定の RDSServer.DataFactory オブジェクトでのみ SubmitChanges メソッドを使用できます。カスタム ビジネス オブジェクトでは、このメソッドを使用できません。

URL プロパティが設定されている場合、SubmitChanges メソッドは、URL で指定された場所に変更を送信します。


Supports メソッド (ADO)

Supports メソッド

指定された Recordset オブジェクトが特定の種類の機能をサポートしているかどうかを判別します。

構文

boolean = recordset.Supports( CursorOptions )

戻り値

CursorOptions 引数で指定されたすべての機能がプロバイダでサポートされているかどうかを示す、ブール型 (Boolean) の値を返します。

パラメータ

CursorOptions 1 つまたは複数の CursorOptionEnum 値で構成される長整数型 (Long) の式を指定します。

解説

Supports メソッドは、Recordset オブジェクトがサポートする機能の種類を調べるために使用します。CursorOptions で指定された定数に対応する機能が Recordset オブジェクトでサポートされている場合、Supports メソッドは True を返します。対応する機能がサポートされていない場合は、False を返します。

注意 指定した機能に対して Supports メソッドが True を返しても、プロバイダでは必ずしもその機能を使用できるとは限りません。Supports メソッドは、必要な条件が満たされているという前提に基づいて、指定した機能をプロバイダがサポートできるかどうかを判別した結果を返します。たとえば、カーソルが複数のテーブルの結合に基づいている場合でも、Supports メソッドは、その Recordset オブジェクトが更新をサポートすると判別することがありますが、実際の列の中には更新できないものがあります。


Update メソッド (ADO)

Update メソッド

Recordset オブジェクトのカレント行、または Record オブジェクトの Fields コレクションに加えた変更を保存します。

構文

recordset.Update Fields, Values

record.Fields.Update

パラメータ

Fields 省略可能です。単一の名前を表すバリアント型 (Variant) の値、あるいは変更するフィールド名または位置を表す値の並びをバリアント型 (Variant) の配列として指定します。

Values 省略可能です。単一の値を表すバリアント型 (Variant) の値、または新規レコードのフィールド値を表すバリアント型 (Variant) の配列を指定します。

解説

Recordset

Update メソッドは、AddNew メソッドの呼び出し以後、または既存レコードのフィールド値の変更以後に Recordset オブジェクトのカレント レコードに加えられた変更を保存します。Recordset オブジェクトは更新をサポートしている必要があります。

フィールド値を設定するには、次のいずれかの操作を行います。

  • Field オブジェクトの Value プロパティに値を設定し、Update メソッドを呼び出します。

  • Update メソッドの呼び出しで、フィールド名と値を引数として渡します。

  • Update メソッドの呼び出しで、フィールド名の配列と値の配列を渡します。

フィールド名の配列と値の配列を使用する場合、両方の配列の要素数が同じである必要があります。また、フィールド名の順序とフィールド値の順序も一致している必要があります。フィールド名とフィールド値の数および順序が一致しない場合は、エラーが発生します。

Recordset オブジェクトがバッチ更新をサポートしている場合、UpdateBatch メソッドを呼び出すまで、1 つまたは複数のレコードに対する複数の変更をローカルにキャッシュできます。カレント レコードの編集中または新規レコードの追加中に UpdateBatch メソッドを呼び出すと、変更を一括してプロバイダに転送する前に、Update メソッドが自動的に呼び出され、カレント レコードの保留中の変更がすべて保存されます。

Update メソッドを呼び出す前に、追加または編集を行っているレコードから移動すると、自動的に Update が呼び出され、変更が保存されます。カレント レコードに加えた変更をキャンセルする場合、または新しく追加したレコードを破棄する場合は、CancelUpdate メソッドを呼び出す必要があります。

Update メソッドを呼び出した後も、カレント レコードはそのままカレント レコードになります。

Unique Table ダイナミック プロパティが設定されており、Recordset が、複数のテーブルに対する JOIN 操作の実行結果である場合、Update メソッドでは、複数のテーブルの主キーを更新することはできません。また、Update メソッドでは、Unique Table プロパティに指定されたテーブルのフィールドのみを更新することができます。

Record

Update メソッドは、Record オブジェクトの Fields コレクションに含まれるフィールドの追加、削除、および更新を確定します。

たとえば、Delete メソッドで削除されたフィールドは、直ちに削除フィールドとしてマークされますが、コレクションには残されたままです。これらのフィールドをプロバイダのコレクションから実際に削除するには、Update メソッドを呼び出す必要があります。


UpdateBatch メソッド (ADO)

UpdateBatch メソッド

保留中のバッチ更新をすべてディスクに書き込みます。

構文

recordset.UpdateBatch AffectRecords

パラメータ

AffectRecords 省略可能です。UpdateBatch メソッドで操作するレコード数を示す AffectEnum 値を指定します。

解説

バッチ更新モードで Recordset オブジェクトを編集しているときに UpdateBatch を使用すると、Recordset オブジェクトに加えられたすべての変更が、基になるデータベースに転送されます。

Recordset オブジェクトがバッチ更新をサポートしている場合、UpdateBatch メソッドを呼び出すまで、1 つまたは複数のレコードに対する複数の変更をローカルにキャッシュできます。カレント レコードの編集中または新規レコードの追加中に UpdateBatch メソッドを呼び出すと、変更を一括してプロバイダに転送する前に、Update が自動的に呼び出され、カレント レコードに対する保留中の変更がすべて保存されます。バッチ更新は、キーセットまたは静的カーソルでのみ使用します。

注意 フィルタ操作で該当レコードが存在しない場合など、現在の Recordset で表示するレコードが存在しない場合に、このパラメータの値に adAffectGroup を指定すると、エラーが発生します。

基になるデータとの競合 (たとえば、ほかのユーザーによってレコードが削除されている場合など) が原因で、複数またはすべてのレコードに対する変更の送信に失敗した場合は、プロバイダから Errors コレクションに警告が返され、実行時エラーが発生します。競合しているレコードを特定するには、Filter プロパティ (adFilterAffectedRecords) と Status プロパティを使用します。

保留中のバッチ更新をキャンセルするには、CancelBatch メソッドを使用します。

ダイナミック プロパティの Unique Table と Update Resync が設定されており、Recordset が、複数のテーブルに対する JOIN 操作の実行結果である場合は、UpdateBatch メソッドの実行後に、Update Resync プロパティの設定値に基づいて Resync メソッドが暗黙的に実行されます。

データ ソースで行われる個々のバッチ更新の順序は、ローカルの Recordset で実行した順序と同じである必要はありません。更新順序はプロバイダによって決まります。挿入または更新時での外部キーによる制約など、相互に関連する更新をコーディングするときは、このことを考慮に入れてください。


Write メソッド (ADO)

Write メソッド

バイナリ データを Stream オブジェクトに書き込みます。

構文

Stream.Write Buffer

パラメータ

Buffer 書き込むバイトの配列を含むバリアント型 (Variant) の値を指定します。

解説

指定したバイトが Stream オブジェクトに書き込まれます。このとき、各バイト間にスペースは挿入されません。

現在の Position は、書き込まれたデータの次のバイトに設定されます。Write メソッドでは、ストリーム内の残りのデータは削除されません。これらのバイトを削除する場合は、SetEOS を呼び出してください。

現在の EOS の位置を越える書き込みを行うと、Stream の Size は、新しいバイトがすべて格納されるように拡張され、EOS は、Stream に新しく書き込まれた最後のバイトに移動します。


WriteText メソッド (ADO)

WriteText メソッド

指定したテキスト文字列を文字列型の Stream オブジェクトに書き込みます。

構文

Stream.WriteText Data, Options

パラメータ

Data 書き込む文字テキストを含む文字列型 (String) の値を指定します。

Options 省略可能です。指定した文字列の終わりに行区切り文字を書き込むかどうかを StreamWriteEnum 値で指定します。

解説

指定した文字列が Stream オブジェクトに書き込まれます。このとき、各文字列間にスペースや文字は挿入されません。

現在の Position は、書き込まれたデータの次の文字に設定されます。WriteText メソッドでは、ストリーム内の残りの文字データは削除されません。これらの文字を削除する場合は、SetEOS メソッドを呼び出してください。

現在の EOS の位置を越える書き込みを行うと、Stream の Size は、新しい文字がすべて格納されるように拡張され、EOS は、Stream に新しく書き込まれた最後の文字に移動します。


ADO イベント

ADO イベントの概要

イベント | 説明
BeginTransComplete | BeginTrans の操作が終了した後に呼び出されます。
CommitTransComplete | CommitTrans の操作が終了した後に呼び出されます。
ConnectComplete | 接続が開始された後に呼び出されます。
Disconnect | 接続が終了した後に呼び出されます。
EndOfRecordset | Recordset の末尾以降の行に移動しようとすると呼び出されます。
ExecuteComplete | コマンドが実行を終了した後に呼び出されます。
FetchComplete | 長い非同期操作のすべてのレコードが、Recordset に取得された後に呼び出されます。
FetchProgress | 長い非同期操作時に、現在までに Recordset に取得された行数を報告するために定期的に呼び出されます。
FieldChangeComplete | 1 つ以上の Field オブジェクトの値が変更された後に呼び出されます。
InfoMessage | ConnectionEvent 操作の間に警告が発生するたびに呼び出されます。
MoveComplete | Recordset における現在の位置が変更された後に呼び出されます。
onError (RDS) | 処理中にエラーが発生するたびに呼び出されます。
onReadyStateChange (RDS) | ReadyState の値が変更されるたびに呼び出されます。
RecordChangeComplete | 1 つ以上のレコードが変更されると呼び出されます。
RecordsetChangeComplete | Recordset が変更されると呼び出されます。
RollbackTransComplete | RollbackTrans 操作後に呼び出されます。
WillChangeField | 保留操作で Recordset 内の 1 つ以上の Field オブジェクトの値が変更されると呼び出されます。
WillChangeRecord | Recordset 内の 1 つ以上のレコード (行) が変更される前に呼び出されます。
WillChangeRecordset | 保留操作で Recordset が変更される前に呼び出されます。
WillConnect | 接続が開始される前に呼び出されます。
WillExecute | 保留中のコマンドがこの接続で実行される直前に呼び出され、ユーザーに、保留中の実行パラメータの検査と修正を行う機会を与えます。
WillMove | WillMove イベントは、保留中の操作で Recordset 内で現在の位置が変更される "前" に呼び出されます。


BeginTransComplete、CommitTransComplete、RollbackTransComplete イベント (ADO)

BeginTransComplete、CommitTransComplete、RollbackTransComplete イベント

これらのイベントは、Connection オブジェクトに対する関連付けられた操作の終了後に呼び出されます。

  • BeginTransComplete は、BeginTrans の操作終了後に呼び出されます。

  • CommitTransComplete は、CommitTrans の操作終了後に呼び出されます。

  • RollbackTransComplete は、RollbackTrans の操作終了後に呼び出されます。

構文

BeginTransComplete TransactionLevel, pError, adStatus, pConnection

CommitTransComplete pError, adStatus, pConnection

RollbackTransComplete pError, adStatus, pConnection

パラメータ

TransactionLevel 長整数型 (Long) の値です。このイベントを発生する、BeginTrans の新規トランザクション レベルが格納されます。

pError Error オブジェクトです。EventStatusEnum の値が adStatusErrorsOccurred の場合に発生するエラーを示します。これ以外の場合は設定されません。

adStatus EventStatusEnum ステータス値です。これらのイベントのいずれかが呼び出されたとき、このパラメータは、イベントを発生した操作が成功した場合は adStatusOK、失敗した場合は adStatusErrorsOccurred に設定されます。

このパラメータを adStatusUnwantedEvent に設定すれば、これらのイベントから返る前に後続の通知が実行されるの防ぐことができます。

pConnection このイベントによって発生した Connection オブジェクトです。

解説

Visual C++ では、複数の Connection が同じイベント処理メソッドを共有できます。メソッドは返された Connection オブジェクトを使って、どのオブジェクトがイベントを発生したかを決定します。

Attributes プロパティを adXactCommitRetaining あるいは adXactAbortRetaining に設定した場合、トランザクションをコミットあるいはロール バックした後に、新規トランザクションが開始されます。BeginTransComplete イベントを使うと、最初のトランザクション開始イベント以外のイベントが無視されます。


ConnectComplete、Disconnect イベント (ADO)

ConnectComplete、Disconnect イベント

ConnectComplete イベントは、接続が "開始" された後に呼び出されます。Disconnect イベントは、接続が "終了" した後に呼び出されます。

構文

ConnectComplete pError, adStatus, pConnection

Disconnect adStatus, pConnection

パラメータ

pError Error オブジェクトです。adStatus の値が adStatusErrorsOccurred の場合に発生するエラーを示します。これ以外の場合は設定されません。

adStatus 常に adStatusOK を返す EventStatusEnum 値です。

WillConnect イベントが保留中の接続の取り消しを要求していて ConnectComplete が呼び出されると、このパラメータは adStatusCancel に設定されます。

どちらかのイベントから返る前に後続の通知が実行されるのを防ぐには、このパラメータを adStatusUnwantedEvent に設定します。ただし、Connection を閉じたり開いたりすると、これらのイベントは再度発生されます。

pConnection このイベントによって適用される Connection オブジェクトです。


EndOfRecordset イベント (ADO)

EndOfRecordset イベント

EndOfRecordset イベントは、Recordset の末尾を越える行に移動しようとすると呼び出されます。

構文

EndOfRecordset fMoreData, adStatus, pRecordset

パラメータ

fMoreData VARIANT_BOOL 値です。VARIANT_TRUE に設定されているときは、Recordset に行が追加されていることを表します。

adStatus EventStatusEnum ステータス値です。

EndOfRecordset が呼び出されたとき、イベントを発生する操作が成功した場合、このパラメータは adStatusOK に設定されます。イベントを発生する操作の取り消しをこのイベントが要求できない場合、このパラメータは adStatusCantDeny に設定されます。

EndOfRecordset から返る前に後続の通知が実行されるのを防ぐには、このパラメータを adStatusUnwantedEvent に設定します。

pRecordset Recordset オブジェクトです。このイベントによって発生した Recordset です。

解説

EndOfRecordset イベントは、MoveNext 操作が失敗した場合に発生することがあります。

このイベント ハンドラは、たとえば MoveNext を呼び出して、Recordset オブジェクトの末尾を越えて移動しようとすると呼び出されます。ただし、このイベントの中で、データベースからさらにレコードを取得し、それらを Recordset の末尾に追加することもできます。そのためには、fMoreData を VARIANT_TRUE に設定し、EndOfRecordset から戻る必要があります。そして、MoveNext を再度呼び出して、新たに取得したレコードにアクセスします。


ExecuteComplete イベント (ADO)

ExecuteComplete イベント

ExecuteComplete イベントは、コマンドが実行を終了した後に呼び出されます。

構文

ExecuteComplete RecordsAffected, pError, adStatus, pCommand, pRecordset, pConnection

パラメータ

RecordsAffected コマンドによって影響を受けるレコードの数を表す長整数型 (Long) の値です。

pError Error オブジェクトです。adStatus の値が adStatusErrorsOccurred の場合に発生するエラーを示します。これ以外の場合は設定されません。

adStatus EventStatusEnum ステータス値です。このイベントが呼び出されたとき、このパラメータは、イベントを発生した操作が成功した場合は adStatusOK、失敗した場合は adStatusErrorsOccurred に設定されます。

このイベントから返る前に後続の通知が実行されるのを防ぐには、このパラメータを adStatusUnwantedEvent に設定します。

pCommand 実行された Command オブジェクトです。明示的に Command を作成せずに Connection.Execute または Recordset.Open を呼び出しても Command オブジェクトが格納されます。この場合、Command オブジェクトは ADO によって内部的に作成されます。

pRecordset 実行されたコマンドの結果の Recordset オブジェクトです。この Recordset は空の場合もあります。

pConnection Connection オブジェクトです。操作を実行したときの接続です。

解説

Connection.Execute メソッド、Command.Execute メソッド、Recordset.Open メソッド、Recordset.Requery メソッド、または Recordset.NextRecordset メソッドにより、ExecuteComplete イベントが発生します。


FetchComplete イベント (ADO)

FetchComplete イベント

FetchComplete イベントは、長い非同期操作ですべてのレコードが Recordset に取得された後に呼び出されます。

構文

FetchComplete pError, adStatus, pRecordset

パラメータ

pError Error オブジェクトです。adStatus の値が adStatusErrorsOccurred のときは、発生するエラーを示します。これ以外の場合は設定されません。

adStatus EventStatusEnum ステータス値です。このイベントが呼び出されたとき、このパラメータは、イベントを発生した操作が成功した場合は adStatusOK、失敗した場合は adStatusErrorsOccurred に設定されます。

このイベントから返る前に後続の通知が実行されるのを防ぐには、このパラメータを adStatusUnwantedEvent に設定します。

pRecordset Recordset オブジェクトです。取得されたレコードのオブジェクトです。

解説

Microsoft Visual Basic に FetchComplete を使う場合、Visual Basic 6.0 以降が必要です。


FetchProgress イベント (ADO)

FetchProgress イベント

非同期操作が長く続く場合、現在までに Recordset に取得された行数を報告するために FetchProgress イベントが定期的に呼び出されます。

構文

FetchProgress Progress, MaxProgress, adStatus, pRecordset

パラメータ

Progress フェッチ操作によって、現在までに取得したレコード数を表す長整数型 (Long) の値です。

MaxProgres 取得する予定の最大レコード数を表す長整数型 (Long) の値です。

adStatus EventStatusEnum ステータス値です。

pRecordset 取得されたレコードのオブジェクトである Recordset オブジェクトです。

解説

子 Recordset と共に FetchProgress を使う場合、Progress パラメータと MaxProgress パラメータの値は、基になる Cursor Service 行セットから派生されます。戻り値は、基になる行セットの全レコード数であり、カレント チャプタのレコード数だけではありません。

注意 Microsoft Visual Basic に FetchProgress を使う場合、Visual Basic 6.0 以降が必要です。


InfoMessage イベント (ADO)

InfoMessage イベント

ConnectionEvent 操作時に警告が発生するたびに、InfoMessage イベントが呼び出されます。

構文

InfoMessage pError, adStatus, pConnection

パラメータ

pError Error オブジェクトです。このパラメータには、返されるすべてのエラーが格納されます。多数のエラーが返る場合、Errors コレクションを列挙して確認してください。

adStatus EventStatusEnum ステータス値です。警告が発生すると、adStatus の値が adStatusOK に設定され、pError に警告が格納されます。

このイベントから返る前に後続の通知が実行されるのを防ぐには、このパラメータを adStatusUnwantedEvent に設定します。

pConnection Connection オブジェクトです。警告によって発生した接続です。たとえば、警告は Connection オブジェクトを開いたり、Connection で Command を実行するときに発生します。


onError イベント (RDS)

onError イベントは、処理中にエラーが発生するたびに呼び出されます。

構文

onError SCode, Description, Source, CancelDisplay

パラメータ

SCode エラーのステータス コードを表す整数型 (Integer) の値です。

Description エラーの内容を表す文字列型 (String) の値です。

Source エラーを発生させたクエリあるいはコマンドを表す文字列型 (String) の値です。

CancelDisplay ブール型 (Boolean) の値です。このパラメータを True に設定するとダイアログ ボックスにエラーが表示されなくなります。


onReadyStateChange イベント (RDS)

onReadyStateChange イベントは、ReadyState プロパティの値が変更されるたびに呼び出されます。

構文

onReadyStateChange

パラメータ

なし

解説

ReadyState プロパティは、Recordset オブジェクトに非同期的にデータを取得するときの RDS.DataControl オブジェクトの進捗状況を反映します。それらが発生するたびに ReadyState プロパティの変更を監視するには、onReadyStateChange イベントを使います。この方法は、定期的にプロパティの値を調べるよりも効率的です。


WillChangeField、FieldChangeComplete イベント (ADO)

WillChangeField、FieldChangeComplete イベント

WillChangeField イベントは、保留中の操作で、Recordset の 1 つ以上の Field オブジェクトの値が変更される前に呼び出されます。FieldChangeComplete イベントは、1 つ以上の Field オブジェクトの値が変更された後に呼び出されます。

構文

WillChangeField cFields, Fields, adStatus, pRecordset

FieldChangeComplete cFields, Fields, pError, adStatus, pRecordset

パラメータ

cFields Fields 内の Field オブジェクトの数を表す長整数型 (Long) の値です。

Fields 保留中の変更と共に Field オブジェクトを格納する Variants の配列です。

pError Error オブジェクトです。adStatus の値が adStatusErrorsOccurred の場合に発生するエラーを示します。これ以外の場合は設定されません。

adStatus EventStatusEnum ステータス値です。

WillChangeField が呼び出されたとき、イベントを発生した操作が成功した場合、このパラメータは adStatusOK に設定されます。保留中の操作の取り消しをこのイベントが要求できない場合、このパラメータは adStatusCantDeny に設定されます。

FieldChangeComplete が呼び出されたとき、このパラメータは、イベントを発生した操作が成功した場合は adStatusOK、失敗した場合は adStatusErrorsOccurred に設定されます。

WillChangeField から返る前に保留中の操作の取り消しを要求するには、このパラメータを adStatusCancel に設定します。

FieldChangeComplete から返る前に後続の通知が実行されるのを防ぐには、このパラメータを adStatusUnwantedEvent に設定します。

pRecordset Recordset オブジェクトです。このイベントによって発生した Recordset です。

解説

WillChangeField イベントまたは FieldChangeComplete イベントは、Value プロパティを設定し、フィールドと値配列パラメータと共に Update メソッドを呼び出すとき発生します。


WillChangeRecord、RecordChangeComplete イベント (ADO)

WillChangeRecord、RecordChangeComplete イベント

WillChangeRecord イベントは、Recordset の 1 つ以上のレコード (行) が変更される前に呼び出されます。RecordChangeComplete イベントは、1 つ以上のレコードが変更された後に呼び出されます。

構文

WillChangeRecord adReason, cRecords, adStatus, pRecordset

RecordChangeComplete adReason, cRecords, pError, adStatus, pRecordset

パラメータ

adReason このイベントの原因を示す EventReasonEnum 値です。値は adRsnAddNew、adRsnDelete、adRsnUpdate、adRsnUndoUpdate、adRsnUndoAddNew、adRsnUndoDelete、または adRsnFirstChange です。

cRecords 変更される (影響を受ける) レコードの数を表す長整数型 (Long) の値です。

pError Error オブジェクトです。adStatus の値が adStatusErrorsOccurred の場合に発生するエラーを示します。これ以外の場合は設定されません。

adStatus EventStatusEnum ステータス値です。

WillChangeRecord が呼び出されたとき、イベントを発生した操作が成功した場合、このパラメータは adStatusOK に設定されます。保留中の操作の取り消しをこのイベントが要求できない場合、このパラメータは adStatusCantDeny に設定されます。

RecordChangeComplete を呼び出したとき、このパラメータは、イベントを発生した操作が成功した場合は adStatusOK、失敗した場合は adStatusErrorsOccurred に設定されます。

WillChangeRecord から返る前にイベントを発生した操作の取り消しを要求するには、このパラメータを adStatusCancel に設定します。

RecordChangeComplete から返る前に後続の通知が実行されるのを防ぐには、このパラメータを adStatusUnwantedEvent に設定します。

pRecordset Recordset オブジェクトです。このイベントによって発生した Recordset です。

解説

WillChangeRecord イベント、または RecordChangeComplete イベントは、Update、Delete、CancelUpdate、AddNew、UpdateBatch、およびCancelBatch のレコード操作でフィールドの最初の変更が行われたときに発生します。どの操作によってイベントが発生するかは、Recordset CursorType の値によって決まります。

WillChangeRecord イベント中、Recordset Filter プロパティは adFilterAffectedRecords に設定されます。イベント処理中は、このプロパティを変更することはできません。


WillChangeRecordset、RecordsetChangeComplete イベント (ADO)

WillChangeRecordset、RecordsetChangeComplete イベント

WillChangeRecordset イベントは、保留中の操作で Recordset が変更される前に呼び出されます。RecordsetChangeComplete イベントは、Recordset が変更された後に呼び出されます。

構文

WillChangeRecordset adReason, adStatus, pRecordset

RecordsetChangeComplete adReason, pError, adStatus, pRecordset

パラメータ

adReason このイベントの原因を示す EventReasonEnum 値です。値は adRsnReQuery、adRsnReSynch、adRsnClose、adRsnOpen です。

adStatus EventStatusEnum ステータス値です。

WillChangeRecordset を呼び出したとき、イベントを発生する操作が成功した場合、このパラメータは adStatusOK に設定されます。保留中の操作の取り消しをこのイベントが要求できない場合、このパラメータは adStatusCantDeny に設定されます。

RecordsetChangeComplete が呼び出されたとき、イベントを発生する操作が成功した場合、このパラメータは adStatusOK に設定され、操作が失敗した場合 adStatusErrorsOccurred に、また、以前受け入れられた WillChangeRecordset イベントに関連付けられた操作が取り消された場合、adStatusCancel に設定されます。

WillChangeRecordset から返る前に、保留中の操作の取り消しを要求するには、このパラメータを adStatusCancel に設定します。

WillChangeRecordset または RecordsetChangeComplete から返る前に、後続の通知が実行されるのを防ぐには、このパラメータを adStatusUnwantedEvent に設定します。

pError Error オブジェクトです。adStatus の値が adStatusErrorsOccurred の場合に発生するエラーを示します。これ以外の場合は設定されません。

pRecordset Recordset オブジェクトです。このイベントによって発生した Recordset です。

解説

WillChangeRecordset イベントまたは RecordsetChangeComplete イベントは、Recordset Requery メソッドまたは Open メソッドにより発生します。

プロバイダがブックマークをサポートしていない場合、プロバイダから新しい行が取得されるたびに RecordsetChange イベントの通知が発生します。このイベントの発生頻度は、RecordsetCacheSize プロパティで決まります。


WillConnect イベント (ADO)

WillConnect イベント

WillConnect イベントは、接続が開始される前に呼び出されます。

構文

WillConnect ConnectionString, UserID, Password, Options, adStatus, pConnection

パラメータ

ConnectionString 保留中の接続の接続情報を含む文字列型 (String) の値です。

UserID 保留中の接続のユーザー名を含む文字列型 (String) の値です。

Password 保留中の接続のパスワードを含む文字列型 (String) の値です。

Options プロバイダが ConnectionString を評価する方法を示す長整数型 (Long) の値です。

オプションは、adAsyncOpen のみ指定できます。

adStatus EventStatusEnum ステータス値です。

このイベントを呼び出したとき、このパラメータは既定値で adStatusOK に設定されます。保留中の操作の取り消しをこのイベントが要求できない場合、このパラメータは adStatusCantDeny に設定されます。

このイベントから返る前に後続の通知が実行されるのを防ぐには、このパラメータを adStatusUnwantedEvent に設定します。この通知の取り消しを実行する接続操作を要求するには、このパラメータを adStatusCancel に設定します。

pConnection このイベント通知が適用される Connection オブジェクトです。WillConnect イベント ハンドラで Connection のパラメータが変更されても Connection には影響はありません。

解説

WillConnect を呼び出したとき、ConnectionString パラメータ、UserID パラメータ、Password パラメータ、および Options パラメータの値は、このイベント (保留接続) を実行した操作で設定され、イベントから返る前に変更できます。WillConnect では、保留接続を取り消す要求を返す場合もあります。

このイベントが取り消されると、adStatus パラメータが adStatusErrorsOccurred に設定され ConnectComplete が呼び出されます。


WillExecute イベント (ADO)

WillExecute イベント

WillExecute イベントは、保留中のコマンドが接続時に実行される直前に呼び出されます。

構文

WillExecute Source, CursorType, LockType, Options, adStatus, pCommand, pRecordset, pConnection

パラメータ

Source SQL コマンドあるいはストアド プロシージャ名を含む文字列型 (String) の値です。

CursorType 開く対象の Recordset のカーソル タイプが格納された CursorTypeEnum です。このパラメータによって、Recordset Open の操作時にカーソルを任意のタイプに変更できます。CursorType は、ほかの操作には無効です。

LockType 開く対象の Recordset のロック タイプを格納する LockTypeEnum です。このパラメータを設定すると、Recordset Open 操作時にロックを任意のタイプに変更できます。LockType は、ほかの操作には無効です。

Options コマンドを実行したり Recordset を開くために使われるオプションを表す長整数型 (Long) の値です。

adStatus このイベントが呼び出されると adStatusCantDeny または adStatusOK になる EventStatusEnum ステータス値となります。値が AdStatusCantDeny の場合、このイベントは保留中の操作の取り消しを要求できません。

このイベントから返る前に後続の通知が実行されるのを防ぐには、このパラメータを adStatusUnwantedEvent に設定します。また、このイベントを発生する操作の取り消しを要求するには、このパラメータを adStatusCancel に設定します。

pCommand このイベント通知が適用される Command オブジェクトです。

pRecordset このイベント通知が適用される Recordset オブジェクトです。

pConnection このイベント通知が適用される Connection オブジェクトです。

解説

WillExecute イベントは、Connection. Execute メソッド、Command. Execute メソッド、または Recordset. Open メソッドによって発生します。pConnection パラメータには、常に Connection オブジェクトに対する有効な参照が格納されます。イベントの原因が Connection.Execute の場合、pRecordset パラメータと pCommand パラメータは Nothing に設定されます。イベントの原因が Recordset.Open の場合、pRecordset パラメータは、Recordset オブジェクトを参照し、pCommand パラメータは Nothing に設定されます。イベントが Command.Execute の場合、pCommand パラメータは Command オブジェクトを参照し、pRecordset パラメータは Nothing に設定されます。

WillExecute では、保留中の実行パラメータを調べたり、編集できます。このイベントは、保留中のコマンドを取り消す要求を返すこともあります。


WillMove、MoveComplete イベント (ADO)

WillMove、MoveComplete イベント

WillMove イベントは、保留中の操作で Recordset の現在の位置が変更される前に呼び出されます。MoveComplete イベントは、Recordset 内で現在の位置が変更された後に呼び出されます。

構文

WillMove adReason, adStatus, pRecordset

MoveComplete adReason, pError, adStatus, pRecordset

パラメータ

adReason このイベントの原因を示す EventReasonEnum 値です。このパラメータの値には、adRsnMoveFirst、adRsnMoveLast、adRsnMoveNext、adRsnMovePrevious、adRsnMove、または adRsnRequery があります。

pError Error オブジェクトです。adStatus の値が adStatusErrorsOccurred の場合に発生するエラーを示します。これ以外の場合は設定されません。

adStatus EventStatusEnum ステータス値です。

WillMove が呼び出されたとき、イベントを発生した操作が成功した場合、このパラメータは adStatusOK に設定されます。保留中の操作の取り消しをこのイベントが要求できない場合、このパラメータは adStatusCantDeny に設定されます。

MoveComplete が呼び出されると、このパラメータは、イベントを発生した操作が成功した場合は adStatusOK、操作が失敗した場合は adStatusErrorsOccurred に設定されます。

WillMove から返る前に、保留中の操作の取り消しを要求するには、このパラメータを adStatusCancel に設定します。MoveComplete から返る前に後続の通知が実行されるのを防ぐには、このパラメータを adStatusUnwantedEvent に設定します。

pRecordset Recordset オブジェクトです。このイベントによって発生した Recordset です。

解説

WillMove イベントや MoveComplete イベントは、次の Recordset 操作で発生します。Open、Move、MoveFirst、MoveLast、MoveNext、MovePrevious、AddNew、および Requery。これらのイベントは、次のプロパティに基づいて発生します。

Filter、Index、Bookmark、AbsolutePage、および AbsolutePosition。

これらのイベントは、子 Recordset に Recordset イベントが接続されているときに親 Recordset が移動した場合にも発生します。


ADO 列挙定数

ここでは、デバッグ用に各定数の実際の値の一覧を示します。ただし、この値は参考用のものであり、ADO のリリースごとに変更されることがあります。コードを記述するときは、列挙定数の実際の値ではなく、名前のみを使って記述する必要があります。

ADO 列挙定数の概要

列挙 | 説明
ADCPROP_ASYNCTHREADPRIORITY_ENUM | RDS の Recordset オブジェクトに対して、データを取得する非同期スレッドの実行優先順位を表します。
ADCPROP_AUTORECALC_ENUM | 階層 Recordset の集計列と計算列を MSDataShape プロバイダがいつ再計算するかを表します。
ADCPROP_UPDATECRITERIA_ENUM | Recordset オブジェクトがあるデータ ソース行の共有的更新時に、競合の検出に使うフィールドを表します。
ADCPROP_UPDATERESYNC_ENUM | UpdateBatch メソッドの後に含まれる Resync メソッド操作を実行するかを表し、実行する場合は、操作の適用範囲を表します。
AffectEnum | 操作の対象になるレコードを表します。
BookmarkEnum | 操作の開始位置を示すブックマークを表します。
CommandTypeEnum | コマンド引数の説明方法を表します。
CompareEnum | ブックマークで表した 2 つのレコードの相対位置を表します。
ConnectModeEnum | Connection 内のデータの編集、Record のオープン、または Record オブジェクトと Stream オブジェクトの Mode プロパティの値の指定に対する権限を表します。
ConnectOptionEnum | Connection オブジェクトの Open メソッドからの戻りが、接続の確立の後 (同期) か前 (非同期) かを表します。
ConnectPromptEnum | ODBC データ ソースとの接続を開くときに、不足しているパラメータを要求するダイアログ ボックスを表示するかどうかを表します。
CopyRecordOptionsEnum | CopyRecord メソッドの動作を表します。
CursorLocationEnum | カーソル エンジンの場所を表します。
CursorOptionEnum | Supports メソッドがテストする機能を表します。
CursorTypeEnum | Recordset オブジェクトが使うカーソル タイプを表します。
DataTypeEnum | Field、Parameter、または Property のデータ型を表します。
EditModeEnum | レコードの編集ステータスを表します。
ErrorValueEnum | ADO 実行時エラーの種類を表します。
EventReasonEnum | イベントが発生する理由を表します。
EventStatusEnum | イベント実行のカレント ステータスを表します。
ExecuteOptionEnum | プロバイダによるコマンドの実行方法を表します。
FieldEnum | Record オブジェクトの Fields コレクションで参照する特定のフィールドを表します。
FieldAttributeEnum | 1 つ以上の Field オブジェクトの属性を表します。
FilterGroupEnum | Recordset でフィルタの対象となるレコード グループを表します。
GetRowsOptionEnum | Recordset から取得するレコード数を表します。
IsolationLevelEnum | Connection オブジェクトのトランザクション分離レベルを表します。
LineSeparatorsEnum | テキスト Stream オブジェクトの行区切りに使われている文字を表します。
LockTypeEnum | 編集時にレコードに適用されるロックの種類を表します。
MarshalOptionsEnum | サーバーにどのレコードが返されるかを表します。
MoveRecordOptionsEnum | Record オブジェクトの MoveRecord メソッドの動作を表します。
ObjectStateEnum | オブジェクトを開いているか閉じているか、データ ソースに接続中か、コマンドを実行中か、またはデータをフェッチ中かどうかを表します。
ParameterAttributesEnum | Parameter オブジェクトの属性を表します。
ParameterDirectionEnum | Parameter が入力パラメータと出力パラメータのどちらか、またはその両方を表すのか、あるいはストアド プロシージャからの戻り値であるかどうかを表します。
PersistFormatEnum | Recordset に保存するときの形式を表します。
PositionEnum | Recordset 内のレコード ポインタの現在の位置を表します。
PropertyAttributesEnum | Property オブジェクトの属性を表します。
RecordCreateOptionsEnum | Record オブジェクトの Open メソッドに対し、既存の Record を開くか、新しい Record を作成するかを表します。
RecordOpenOptionsEnum | Record を開くときのオプションを表します。これらの値は OR 演算子で結合することもできます。
RecordStatusEnum | バッチ更新または別の一括操作に関するレコードのステータスを表します。
RecordTypeEnum | Record オブジェクトの種類を表します。
ResyncEnum | Resync の呼び出しによって基になる値が上書きされるかどうかを表します。
SaveOptionsEnum | Stream オブジェクトからファイルを保存するときにファイルを作成するか、上書きするかを表します。これらの値は AND 演算子で結合することもできます。
SchemaEnum | OpenSchema メソッドが取得するスキーマ Recordset の種類を表します。
SearchDirectionEnum | Recordset 内のレコードの検索方向を表します。
SeekEnum | 実行する Seek オブジェクトの種類を表します。
StreamOpenOptionsEnum | Stream オブジェクトを開くときのオプションを表します。これらの値は AND 演算子で結合することもできます。
StreamReadEnum | Stream オブジェクトから、ストリーム全体、または次の行を読み取るかどうかを表します。
StreamTypeEnum | Stream オブジェクトに保存するデータの種類を表します。
StreamWriteEnum | Stream オブジェクトに書き込む文字列に行区切り文字を追加するかどうかを表します。
StringFormatEnum | 文字列として Recordset を取得するときの形式を表します。
XactAttributeEnum | Connection オブジェクトのトランザクション属性を表します。


ADCPROP_ASYNCTHREADPRIORITY_ENUM

RDS の Recordset オブジェクトに対して、データを取得する非同期スレッドの実行優先順位を表します。

これらの定数は、Recordset "Background Thread Priority" ダイナミック プロパティで使用されます。このプロパティについては、「ADO ダイナミック プロパティ インデックス」を参照してください。また、「Microsoft Cursor Service for OLE DB」でも説明しています。

定数 | 値 | 説明
adPriorityAboveNormal | 4 | 優先順位を標準と最高の間に設定します。
adPriorityBelowNormal | 2 | 優先順位を標準と最低の間に設定します。
adPriorityHighest | 5 | 優先順位を最高限度に設定します。
adPriorityLowest | 1 | 優先順位を最低限度に設定します。
adPriorityNormal | 3 | 優先順位を標準に設定します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.AdcPropAsyncThreadPriority.ABOVENORMAL
AdoEnums.AdcPropAsyncThreadPriority.BELOWNORMAL
AdoEnums.AdcPropAsyncThreadPriority.HIGHEST
AdoEnums.AdcPropAsyncThreadPriority.LOWEST
AdoEnums.AdcPropAsyncThreadPriority.NORMAL


ADCPROP_AUTORECALC_ENUM

階層 Recordset の集計列と計算列を MSDataShape プロバイダがいつ再計算するかを表します。

これらの定数は、MSDataShape プロバイダと Recordset "Auto Recalc" ダイナミック プロパティにだけ使います。このプロパティについては、「ADO ダイナミック プロパティ インデックス」を参照してください。また、「Microsoft Cursor Service for OLE DB」および「Microsoft Data Shaping Service for OLE DB」でも説明しています。

定数 | 値 | 説明
adRecalcAlways | 1 | 既定値です。MSDataShape プロバイダが、計算列が依存する値が変更されたと判断すると再計算します。
adRecalcUpFront | 0 | 階層 Recordset の最初の作成時にのみ計算します。

ADO/WFC 等価

これらの定数には ADO/WFC 等価はありません。


ADCPROP_UPDATECRITERIA_ENUM

Recordset オブジェクトがあるデータ ソース行の共有的更新時に、競合の検出に使うフィールドを表します。

これらの定数は、Recordset "Update Criteria" ダイナミック プロパティに使います。このプロパティについては、「ADO ダイナミック プロパティ インデックス」を参照してください。また、「Microsoft Cursor Service for OLE DB」でも説明しています。

定数 | 値 | 説明
adCriteriaAllCols | 1 | データ ソース行の列が変更された場合に競合を検出します。
adCriteriaKey | 0 | データ ソース行のキー列の変更、すなわち行が削除された場合に競合を検出します。
adCriteriaTimeStamp | 3 | データ ソース行のタイムスタンプの変更、すなわち Recordset の取り出し後に行にアクセスされた場合に競合を検出します。
adCriteriaUpdCols | 2 | Recordset の更新フィールドに対応するデータ ソース行の列が変更された場合に競合を検出します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.AdcPropUpdateCriteria.ALLCOLS
AdoEnums.AdcPropUpdateCriteria.KEY
AdoEnums.AdcPropUpdateCriteria.TIMESTAMP
AdoEnums.AdcPropUpdateCriteria.UPDCOLS


ADCPROP_UPDATERESYNC_ENUM

UpdateBatch メソッドの後に含まれる Resync メソッド操作を実行するかを表し、実行する場合は、操作の適用範囲を表します。

定数 | 値 | 説明
adResyncAll | 15 | 変更が保留されている各行に Resync を呼び出します。
adResyncAutoIncrement | 1 | 既定値です。Microsoft Jet AutoNumber フィールドや Microsoft SQL Server Idendity 列など、自動的に増分される列またはデータ ソースによって生成される列について、新しい識別値を取得します。
adResyncConflicts | 2 | 同時競合の発生により、更新または削除操作が失敗したすべての行に対し、Resync を呼び出します。
adResyncInserts | 8 | 挿入が成功したすべての行に対し、Resync を呼び出します。ただし、主キー列の値は再同期しません。その代わりに、新しく挿入された行の内容については、既存の主キーの値を基に再同期が実行されます。主キーの値を変更すると、Resync では目的の行の内容を取得しません。インクリメント主キーの値の場合、まず adResyncAutoIncrement で UpdateBatch が呼び出され、データ ソースで生成された主キーの値が取得されます。
adResyncNone | 0 | Resync を呼び出しません。
adResyncUpdates | 4 | 更新が成功したすべての行に対し、Resync を呼び出します。


AffectEnum

操作の対象になるレコードを表します。

定数 | 値 | 説明
adAffectAll | 3 | Recordset に適用される Filter がない場合、すべてのレコードが対象です。 Filter プロパティを文字列基準 ("Author='Smith'" など) に設定すると、操作はカレント チャプタの可視レコードに反映されます。 Filter プロパティを FilterGroupEnum のメンバまたは Bookmarks の配列に設定すると、操作は Recordset のすべての行に反映されます。 注意 adAffectAll は、Visual Basic Object Browser で非表示です。
adAffectAllChapters | 4 | 現在適用されている Filter で非表示になっているものを含めて、Recordset のすべての兄弟チャプタに全レコードが反映されます。
adAffectCurrent | 1 | カレント レコードにだけ反映されます。
adAffectGroup | 2 | 現在の Filter プロパティ設定を満たすレコードにだけ反映されます。このオプションを使うには、Filter プロパティを FilterGroupEnum 値か、Bookmarks の配列に設定します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.Affect.ALL
AdoEnums.Affect.ALLCHAPTERS
AdoEnums.Affect.CURRENT
AdoEnums.Affect.GROUP


BookmarkEnum

操作の開始位置を示すブックマークを表します。

定数 | 値 | 説明
adBookmarkCurrent | 0 | カレント レコードで開始します。
adBookmarkFirst | 1 | 最初のレコードで開始します。
adBookmarkLast | 2 | 最後のレコードで開始します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.Bookmark.CURRENT
AdoEnums.Bookmark.FIRST
AdoEnums.Bookmark.LAST


CommandTypeEnum

コマンド引数の説明方法を表します。

定数 | 値 | 説明
adCmdUnspecified | -1 | コマンド タイプ引数を指定しません。
adCmdText | 1 | CommandText をコマンド、またはストアド プロシージャ呼び出しの、文字列による定義として評価します。
adCmdTable | 2 | CommandText を、列が内部で生成された SQL クエリによってすべて返されるテーブル名として評価します。
adCmdStoredProc | 4 | CommandText をストアド プロシージャ名として評価します。
adCmdUnknown | 8 | 既定値です。CommandText プロパティのコマンド タイプが不明であることを表します。
adCmdFile | 256 | 永続的に保存された Recordset のファイル名として CommandText を評価します。
adCmdTableDirect | 512 | 列がすべて返されるテーブル名として CommandText を評価します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.CommandType.UNSPECIFIED
AdoEnums.CommandType.TEXT
AdoEnums.CommandType.TABLE
AdoEnums.CommandType.STOREDPROC
AdoEnums.CommandType.UNKNOWN
AdoEnums.CommandType.FILE
AdoEnums.CommandType.TABLEDIRECT


CompareEnum

ブックマークで表された 2 つのレコードの相対位置を表します。

定数 | 値 | 説明
adCompareEqual | 1 | ブックマークが等しいことを表します。
adCompareGreaterThan | 2 | 最初のブックマークが 2 番目のブックマークの後になることを表します。
adCompareLessThan | 0 | 最初のブックマークが 2 番目のブックマークの前になることを表します。
adCompareNotComparable | 4 | ブックマークを比較できないことを表します。
adCompareNotEqual | 3 | これらのブックマークは異なっており、順位がないことを表します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.Compare.EQUAL
AdoEnums.Compare.GREATERTHAN
AdoEnums.Compare.LESSTHAN
AdoEnums.Compare.NOTCOMPARABLE
AdoEnums.Compare.NOTEQUAL


ConnectModeEnum

Connection 内のデータの編集、Record のオープン、または Record オブジェクトと Stream オブジェクトの Mode プロパティの値の指定に対する権限を表します。

定数 | 値 | 説明
adModeRead | 1 | 読み取り専用の権限を表します。
adModeReadWrite | 3 | 読み取り/書き込みの権限を表します。
adModeRecursive | 0x400000 | カレント Record のすべてのサブレコードに共有制限を割り当てるために、別の *ShareDeny* 値 (adModeShareDenyNone、adModeShareDenyWrite、または adModeShareDenyRead) と組み合わせて使用します。Record に子がない場合は機能しません。adModeShareDenyNone だけに使うと実行時エラーになります。ただし、その他の値と結合すれば、adModeShareDenyNone に使うことができます。たとえば、"adModeRead Or adModeShareDenyNone Or adModeRecursive" は使用可能です。
adModeShareDenyNone | 16 | 権限の種類に関係なく、ほかのユーザーにも接続を許可します。ほかのユーザーにも読み取り、書き込みの両方のアクセスを許可します。
adModeShareDenyRead | 4 | 読み取り権限によるほかのユーザーからの接続を禁止します。
adModeShareDenyWrite | 8 | 書き込み権限によるほかのユーザーからの接続を禁止します。
adModeShareExclusive | 12 | ほかのユーザーの接続を禁止します。
adModeUnknown | 0 | 既定値です。権限が設定されていないか、設定が不明であることを表します。
adModeWrite | 2 | 書き込み専用の権限を表します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.ConnectMode.READ
AdoEnums.ConnectMode.READWRITE
(AdoEnums.ConnectMode.RECURSIVE と等しいものはありません)
AdoEnums.ConnectMode.SHAREDENYNONE
AdoEnums.ConnectMode.SHAREDENYREAD
AdoEnums.ConnectMode.SHAREDENYWRITE
AdoEnums.ConnectMode.SHAREEXCLUSIVE
AdoEnums.ConnectMode.UNKNOWN
AdoEnums.ConnectMode.WRITE


ConnectOptionEnum

Connection オブジェクトの Open メソッドからの戻りが、接続の確立の後 (同期) か前 (非同期) かを表します。

定数 | 値 | 説明
adAsyncConnect | 16 | 非同期で接続します。ConnectComplete イベントを使用して、いつ接続できるかを決定することもあります。
adConnectUnspecified | -1 | 既定値です。同期で接続します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.ConnectOption.ASYNCCONNECT
AdoEnums.ConnectOption.CONNECTUNSPECIFIED


ConnectPromptEnum

ODBC データ ソースとの接続を開くときに、不足しているパラメータを要求するダイアログ ボックスを表示するかどうかを表します。

定数 | 値 | 説明
adPromptAlways | 1 | 常に要求します。
adPromptComplete | 2 | 更に情報が必要な場合に要求します。
adPromptCompleteRequired | 3 | 更に情報が必要だが、任意のパラメータが禁止されている場合に要求します。
adPromptNever | 4 | 要求しません。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.ConnectPrompt.ALWAYS
AdoEnums.ConnectPrompt.COMPLETE
AdoEnums.ConnectPrompt.COMPLETEREQUIRED
AdoEnums.ConnectPrompt.NEVER


CopyRecordOptionsEnum

CopyRecord メソッドの動作を表します。

定数 | 値 | 説明
adCopyAllowEmulation | 4 | "コピー先" が別のサーバーにあるか、または "コピー元" 以外のプロバイダのサービスを受けているこのメソッドが失敗した場合、"コピー元" プロバイダがダウンロード操作とアップロード操作を行ってコピーをシミュレートしようとしていることを表します。異なるプロバイダ間で操作すると、パフォーマンスが低下したりデータが失われることがあるので注意してください。
adCopyNonRecursive | 2 | 宛先にカレント ディレクトリをコピーしますが、サブディレクトリはコピーしません。コピー操作は再帰的ではありません。
adCopyOverWrite | 1 | "コピー先" が既存のファイルやディレクトリを示す場合、そのファイルやディレクトリを上書きします。
adCopyUnspecified | -1 | 既定値です。既定のコピー操作を実行します。宛先ファイルやディレクトリが既にあり、操作が再帰的にコピーされると、操作は失敗します。

ADO/WFC 等価

これらの定数に ADO/WFC 等価はありません。


CursorLocationEnum

カーソル サービスの場所を表します。

定数 | 値 | 説明
adUseClient | 3 | ローカル カーソル ライブラリより供給されたクライアント側 カーソルを使います。ローカル カーソル サービスにはドライバによって供給されるカーソルよりも多くのカーソル機能があるので、この設定を利用すればより高度な機能を提供できます。以前のバージョンとの互換性を保つために、同じ意味を持つ adUseClientBatch もサポートしています。
adUseNone | 1 | カーソル サービスを使いません。(この定数は現行バージョン用ではなく、以前のバージョンとの互換性を保つために装備されています。)
adUseServer | 2 | 既定値です。データ プロバイダ カーソルまたはドライバによって供給されるカーソルを使用します。これらのカーソルは、場合によっては柔軟性が高く、ほかのユーザーが行うデータ ソースへの変更を検出できます。ただし、「Microsoft Cursor Service for OLE DB」にはサーバー側カーソルではシミュレートできない機能 (独立した Recordset オブジェクトなど) があり、そのような機能はこの設定では利用できません。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.CursorLocation.CLIENT
AdoEnums.CursorLocation.NONE
AdoEnums.CursorLocation.SERVER


CursorOptionEnum

Supports メソッドがテストする機能を表します。

定数 | 値 | 説明
adAddNew | 0x1000400 | 新規レコードを追加する AddNew メソッドをサポートします。
adApproxPosition | 0x4000 | AbsolutePosition プロパティと AbsolutePage プロパティをサポートします。
adBookmark | 0x2000 | 特定のレコードへのアクセスを確保する Bookmark プロパティをサポートします。
adDelete | 0x1000800 | レコードを削除する Delete メソッドをサポートします。
adFind | 0x80000 | Recordset 内の行の位置を確認する Find メソッドをサポートします。
adHoldRecords | 0x100 | 保留中のすべての変更を実行せずに、新たなレコードを格納するか、または次の格納位置を変更します。
adIndex | 0x800000 | インデックスに名前を付ける Index プロパティをサポートします。
adMovePrevious | 0x200 | ブックマークを使用せずにカレント レコードの位置を後方に移動する MoveFirst、MovePrevious メソッドおよび Move、または GetRows メソッドをサポートします。
adNotify | 0x40000 | 基になるデータ プロバイダが通知をサポートしていることを表します (これにより Recordset イベントのサポートの有無が決まります)。
adResync | 0x20000 | 基になるデータベースのカーソルにある可視データを更新する Resync メソッドをサポートします。
adSeek | 0x400000 | Recordset 内の行に割り当てる Seek メソッドをサポートします。
adUpdate | 0x1008000 | 既存のデータを変更する Update メソッドをサポートします。
adUpdateBatch | 0x10000 | 複数の変更をグループとしてプロバイダに送信するバッチ更新 (UpdateBatch メソッドと CancelBatch メソッド) をサポートします。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.CursorOption.ADDNEW
AdoEnums.CursorOption.APPROXPOSITION
AdoEnums.CursorOption.BOOKMARK
AdoEnums.CursorOption.DELETE
AdoEnums.CursorOption.FIND
AdoEnums.CursorOption.HOLDRECORDS
AdoEnums.CursorOption.INDEX
AdoEnums.CursorOption.MOVEPREVIOUS
AdoEnums.CursorOption.NOTIFY
AdoEnums.CursorOption.RESYNC
AdoEnums.CursorOption.SEEK
AdoEnums.CursorOption.UPDATE
AdoEnums.CursorOption.UPDATEBATCH


CursorTypeEnum

Recordset オブジェクトが使うカーソル タイプを表します。

定数 | 値 | 説明
adOpenDynamic | 2 | 動的カーソルを使います。ほかのユーザーによる追加、変更、および削除を確認できます。プロバイダがブックマークをサポートしていない場合を除き、Recordset 内でのすべての動作を許可します。
adOpenForwardOnly | 0 | 既定値です。前方専用カーソルを使います。レコードのスクロール方向が前方向に限定されていることを除き、静的カーソルと同じ働きをします。Recordset のスクロールが 1 回だけで十分な場合は、これでパフォーマンスを向上できます。
adOpenKeyset | 1 | キーセット カーソルを使います。ほかのユーザーが追加したレコードは表示できない点を除き、動的カーソルと同じく、自分の Recordset からほかのユーザーが削除したレコードはアクセスできません。ほかのユーザーが変更したデータは表示できます。
adOpenStatic | 3 | キーセット カーソルを開きます。データの検索またはレポートの作成に使用するための、レコードの静的コピーです。ほかのユーザーによる追加、変更、または削除は表示されません。
adOpenUnspecified | -1 | カーソル タイプを指定しません。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.CursorType.DYNAMIC
AdoEnums.CursorType.FORWARDONLY
AdoEnums.CursorType.KEYSET
AdoEnums.CursorType.STATIC
AdoEnums.CursorType.UNSPECIFIED


DataTypeEnum

Field、Parameter、または Property のデータ型を表します。次の表の説明欄のかっこ内に、対応する OLE DB データ型のインジケータを示しています。OLE DB データ型の詳細については、「OLE DB Programmer's Reference」の「Chapter 13」、および「Appendix A」を参照してください。

定数 | 値 | 説明
adArray (ADOX には適用せず。) | 0x2000 | 常に別のデータ型定数と組み合わされ、そのデータ型の配列を示すフラグ値です。
adBigInt | 20 | 8 バイトの符号付き整数を示します (DBTYPE_I8)。
adBinary | 128 | バイナリ値を示します (DBTYPE_BYTES)。
adBoolean | 11 | ブール値を示します (DBTYPE_BYTES)。
adBSTR | 8 | Null で終了する Unicode 文字列を示します (DBTYPE_BSTR)。
adChapter | 136 | 子行セットの行を識別する 4 バイト チャプタ値を示します (DBTYPE_HCHAPTER)。
adChar | 129 | 文字列値を示します (DBTYPE_STR)。
adCurrency | 6 | 通貨値を示します (DBTYPE_CY)。通貨型は小数点以下 4 桁の固定小数点の数値です。スケールが 10,000 の、8 バイトの符号付き整数で格納します。
adDate | 7 | 日付値を示します (DBTYPE_DATE)。日付型は倍精度浮動小数点数型 (Double) で格納され、整数部分は 1899 年 12 月 30 日からの日数を、分数部分は日数の分数を表します。
adDBDate | 133 | 日付値 (yyyymmdd) を示します (DBTYPE_DBDATE)。
adDBTime | 134 | 時刻値 (hhmmss) を示します (DBTYPE_DBTIME)。
adDBTimeStamp | 135 | 日付/時刻スタンプ (yyyymmddhhmmss および 10 億分の 1 桁までの分数) を示します (DBTYPE_DBTIMESTAMP)。
adDecimal | 14 | 固定精度およびスケールの正確な数値を示します (DBTYPE_DECIMAL)。
adDouble | 5 | 倍精度浮動小数点値を示します (DBTYPE_R8)。
adEmpty | 0 | 値を指定しません (DBTYPE_EMPTY)。
adError | 10 | 32 ビット エラー コードを示します (DBTYPE_ERROR)。
adFileTime | 64 | 1601 年 1 月 1 日からの時間を示す 64 ビット値を 100 ナノ秒単位で示します (DBTYPE_FILETIME)。
adGUID | 72 | 固有のグローバル識別子 (GUID) を示します (DBTYPE_GUID)。
adIDispatch | 9 | COM オブジェクトの IDispatch インターフェイスへのポインタを示します (DBTYPE_IDISPATCH)。 注意 このデータ型は、現在は ADO ではサポートしていません。使用すると予期しない結果になることがあります。
adInteger | 3 | 4 バイトの符号付き整数を示します (DBTYPE_I4)。
adIUnknown | 13 | COM オブジェクトの IUnknown インターフェイスへのポインタを示します (DBTYPE_IUNKNOWN)。 注意 このデータ型は、現在は ADO ではサポートしていません。使用すると予期しない結果になることがあります。
adLongVarBinary | 205 | 長バイナリ値を示します (Parameter オブジェクトのみ)。
adLongVarChar | 201 | 長文字列の値を示します (Parameter オブジェクトのみ)。
adLongVarWChar | 203 | Null で終了する Unicode 文字列値を示します (Parameter オブジェクトのみ)。
adNumeric | 131 | 固定精度およびスケールの正確な数値を示します (DBTYPE_NUMERIC)。
adPropVariant | 138 | オートメーション PROPVARIANT を示します (DBTYPE_PROP_VARIANT)。
adSingle | 4 | 単精度浮動小数点値を示します (DBTYPE_R４)。
adSmallInt | 2 | 2 バイトの符号付き整数を示します (DBTYPE_I2)。
adTinyInt | 16 | 1 バイトの符号付き整数を示します (DBTYPE_I1)。
adUnsignedBigInt | 21 | 8 バイトの符号なし整数を示します (DBTYPE_I8)。
adUnsignedInt | 19 | 4 バイトの符号なし整数を示します (DBTYPE_I4)。
adUnsignedSmallInt | 18 | 2 バイトの符号なし整数を示します (DBTYPE_I2)。
adUnsignedTinyInt | 17 | 1 バイトの符号なし整数を示します (DBTYPE_I1)。
adUserDefined | 132 | ユーザー定義の変数を示します (DBTYPE_UDT)。
adVarBinary | 204 | バイナリ値を示します (Parameter オブジェクトのみ)。
adVarChar | 200 | 文字列値を示します (Parameter オブジェクトのみ)。
adVariant | 12 | オートメーション バリアント型 (Variant) を示します (DBTYPE_VARIANT)。 注意 このデータ型は、現在は ADO ではサポートしていません。使用すると予期しない結果になることがあります。
adVarNumeric | 139 | 数値を示します (Parameter オブジェクトのみ)。
adVarWChar | 202 | Null で終了する Unicode 文字列を示します (Parameter オブジェクトのみ)。
adWChar | 130 | Null で終了する Unicode 文字列を示します (DBTYPE_WSTR)。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.DataType.ARRAY
AdoEnums.DataType.BIGINT
AdoEnums.DataType.BINARY
AdoEnums.DataType.BOOLEAN
AdoEnums.DataType.BSTR
AdoEnums.DataType.CHAPTER
AdoEnums.DataType.CHAR
AdoEnums.DataType.CURRENCY
AdoEnums.DataType.DATE
AdoEnums.DataType.DBDATE
AdoEnums.DataType.DBTIME
AdoEnums.DataType.DBTIMESTAMP
AdoEnums.DataType.DECIMAL
AdoEnums.DataType.DOUBLE
AdoEnums.DataType.EMPTY
AdoEnums.DataType.ERROR
AdoEnums.DataType.FILETIME
AdoEnums.DataType.GUID
AdoEnums.DataType.IDISPATCH
AdoEnums.DataType.INTEGER
AdoEnums.DataType.IUNKNOWN
AdoEnums.DataType.LONGVARBINARY
AdoEnums.DataType.LONGVARCHAR
AdoEnums.DataType.LONGVARWCHAR
AdoEnums.DataType.NUMERIC
AdoEnums.DataType.PROPVARIANT
AdoEnums.DataType.SINGLE
AdoEnums.DataType.SMALLINT
AdoEnums.DataType.TINYINT
AdoEnums.DataType.UNSIGNEDBIGINT
AdoEnums.DataType.UNSIGNEDINT
AdoEnums.DataType.UNSIGNEDSMALLINT
AdoEnums.DataType.UNSIGNEDTINYINT
AdoEnums.DataType.USERDEFINED
AdoEnums.DataType.VARBINARY
AdoEnums.DataType.VARCHAR
AdoEnums.DataType.VARIANT
AdoEnums.DataType.VARNUMERIC
AdoEnums.DataType.VARWCHAR
AdoEnums.DataType.WCHAR


EditModeEnum

レコードの編集ステータスを表します。

定数 | 値 | 説明
adEditNone | 0 | 進行中の編集操作がないことを示します。
adEditInProgress | 1 | カレント レコードのデータが変更されましたが、保存されていないことを示します。
adEditAdd | 2 | AddNew メソッドが呼び出されていて、コピー バッファのカレント レコードが、データベースに保存されていない新規レコードであることを示します。
adEditDelete | 4 | カレント レコードが削除されたことを示します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.EditMode.NONE
AdoEnums.EditMode.INPROGRESS
AdoEnums.EditMode.ADD
AdoEnums.EditMode.DELETE


ErrorValueEnum

ADO 実行時エラーの種類を表します。

エラー番号には 3 種類の形式があります。

  • 正の 10 進値 - 10進数形式の完全エラー番号の下位 2 バイト。この数値は、Visual Basic の既定のエラー メッセージ ダイアログ ボックスに表示されます。たとえば、実行時エラー '3707' がその例です。

  • 負の 10 進値 - 完全エラー番号を 10 進数に変換したもの。

  • 16 進値 - 完全エラー番号の 16 進数表記。Windows 機能コードは 4 桁目です。ADO エラー番号の機能コードは、A です。たとえば、0x800A0E7B がその例です。

注意 OLE DB エラーは、ADO アプリケーションに渡すことができます。通常、これらの値は、Windows 機能コード 4 で表します。たとえば、0x8004... がその例です。これらの数値の詳細については、「OLE DB Programmer's Reference」の「Chapter 16」を参照してください。

定数 | 値 | 説明
adErrBoundToCommand | 3707 -2146824581 0x800A0E7B | Command オブジェクトをソースに持つ Recordset オブジェクトの ActiveConnection プロパティを変更できません。
adErrCannotComplete | 3732 -2146824556 0x800A0E94 | サーバーは操作を完了できません。
adErrCantChangeConnection | 3748 -2146824540 0x800A0EA4 | 接続が拒否されました。要求された新規接続の特性が現在使用中の特性と異なります。
adErrCantChangeProvider | 3220 -2146825068 0X800A0C94 | 供給されたプロバイダは、すでに使用されているものと異なります。
adErrCantConvertvalue | 3724 -2146824564 0x800A0E8C | データの値がデータ オーバーフローまたは符号の不一致以外の原因で変換できませんでした。例として、変換によりデータが切り捨てられた場合があげられます。
adErrCantCreate | 3725 -2146824563 0x800A0E8D | フィールド データ タイプが不明か、プロバイダが操作を実行するのに十分なリソースを持っていなかったため、データの値を設定または取得できません。
adErrCatalogNotSet | 3747 -2146824541 0x800A0EA3 | 操作には有効な ParentCatalog が必要です。
adErrColumnNotOnThisRow | 3726 -2146824562 0x800A0E8E | レコードはフィールドを含んでいません。
adErrDataConversion | 3421 -2146824867 0x800A0D5D | 現在の操作に対して、間違った種類の値を使用しています。
adErrDataOverflow | 3721 -2146824567 0x800A0E89 | データの値がフィールド データ タイプとして表されるには大きすぎます。
adErrDelResOutOfScope | 3738 -2146824550 0x800A0E9A | 削除されるオブジェクトの URL は現在のレコードの範囲外です。
adErrDenyNotSupported | 3750 -2146824538 0x800A0EA6 | プロバイダは共有の制限をサポートしていません。
adErrDenyTypeNotSupported | 3751 -2146824537 0x800A0EA7 | プロバイダは要求された共有の制限をサポートしていません。
adErrFeatureNotAvailable | 3251 -2146825037 0x800A0CB3 | オブジェクトまたはプロバイダは要求された操作を実行できません。
adErrFieldsUpdateFailed | 3749 -2146824539 0x800A0EA5 | フィールドの更新に失敗しました。詳細については、各フィールド オブジェクトの [状態] のプロパティを参照してください。
adErrIllegalOperation | 3219 -2146825069 0x800A0C93 | このコンテキストで操作は許可されていません。
adErrIntegrityViolation | 3719 -2146824569 0x800A0E87 | データの値がフィールドの整合性制約に違反しています。
adErrInTransaction | 3246 -2146825042 0x800A0CAE | Connection オブジェクトをトランザクションの途中で明示的に閉じられません。
adErrInvalidArgument | 3001 -2146825287 0x800A0BB9 | 引数が間違った種類、または許容範囲外であるか、競合しています。
adErrInvalidConnection | 3709 -2146824579 0x800A0E7D | 閉じている、または無効な接続を参照するオブジェクトでの操作は許可されていません。
adErrInvalidParamInfo | 3708 -2146824580 0x800A0E7C | Parameter オブジェクトが適切に定義されていません。矛盾した、または不完全な情報が提供されました。
adErrInvalidTransaction | 3714 -2146824574 0x800A0E82 | 調整トランザクションが無効であるか、開始していません。
adErrInvalidURL | 3729 -2146824559 0x800A0E91 | URL に無効な文字が含まれています。URL が正しく入力されているか確認してください。
adErrItemNotFound | 3265 -2146825023 0x800A0CC1 | 要求された名前、または序数に対応する項目がコレクションで見つかりません。
adErrNoCurrentRecord | 3021 -2146825267 0x800A0BCD | BOF と EOF のいずれかが True になっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。
adErrNotExecuting | 3715 -2146824573 0x800A0E83 | 実行していない間に操作を行うことはできません。
adErrNotReentrant | 3710 -2146824578 0x800A0E7E | イベント処理中に操作を行うことはできません。
adErrObjectClosed | 3704 -2146824584 0x800A0E78 | オブジェクトが閉じている場合は、操作は許可されません。
adErrObjectInCollection | 3367 -2146824921 0x800A0D27 | オブジェクトは既にコレクションに存在します。追加できません。
adErrObjectNotSet | 3420 -2146824868 0x800A0D5C | オブジェクトは、もう有効ではありません。
adErrObjectOpen | 3705 -2146824583 0x800A0E79 | オブジェクトが開いている場合は、操作は許可されません。
adErrOpeningFile | 3002 -2146825286 0x800A0BBA | ファイルを開けませんでした。
adErrOperationCancelled | 3712 -2146824576 0x800A0E80 | ユーザーにより操作が取り消されました。
adErrOutOfSpace | 3734 -2146824554 0x800A0E96 | 操作を実行できません。プロバイダによって十分な格納領域が確保できません。
adErrPermissionDenied | 3720 -2146824568 0x800A0E88 | 権限不足のためフィールドの書き込みはできません。
adErrPropConflicting | 3742 -2146824546 0x800A0E9E | プロパティの値が、関連するプロパティと競合します。
adErrPropInvalidColumn | 3739 -2146824549 0x800A0E9B | プロパティは指定されたフィールドに適用されません。
adErrPropInvalidOption | 3740 -2146824548 0x800A0E9C | プロパティの属性が無効です。
adErrPropInvalidValue | 3741 -2146824547 0x800A0E9D | プロパティの値が無効です。値が正しく入力されているか確認してください。
adErrPropNotAllSettable | 3743 -2146824545 0x800A0E9F | プロパティは読み取り専用のため、設定できません。
adErrPropNotSet | 3744 -2146824544 0x800A0EA0 | オプションのプロパティの値が設定されていません。
adErrPropNotSettable | 3745 -2146824543 0x800A0EA1 | 読み取り専用のプロパティの値が設定されていませんでした。
adErrPropNotSupported | 3746 -2146824542 0x800A0EA2 | プロバイダはプロパティをサポートしていません。
adErrProviderFailed | 3000 -2146825288 0x800A0BB8 | プロバイダは要求された操作に失敗しました。
adErrProviderNotFound | 3706 -2146824582 0x800A0E7A | プロバイダが見つかりません。正しくインストールされていない可能性があります。
adErrReadFile | 3003 -2146825285 0x800A0BBB | ファイルを読み込めませんでした。
adErrResourceExists | 3731 -2146824557 0x800A0E93 | コピー操作を実行できません。あて先の URL によって名前を付けられたオブジェクトがすでに存在します。オブジェクトを置き換えるためには adCopyOverwrite を指定してください。
adErrResourceLocked | 3730 -2146824558 0x800A0E92 | 指定された URL によって表されたオブジェクトは 1 つ以上のほかのプロセスによってロックされています。プロセスが終了するまで待って、操作を再度実行してください。
adErrResourceOutOfScope | 3735 -2146824553 0x800A0E97 | ソースまたはあて先の URL が現在のレコードの範囲外です。
adErrSchemaViolation | 3722 -2146824566 0x800A0E8A | データの値がデータ タイプまたはフィールドの制約と競合しています。
adErrSignMismatch | 3723 -2146824565 0x800A0E8B | データの値は署名されましたが、プロバイダによって使用されるフィールド データ タイプは未署名だったため、変換に失敗しました。
adErrStillConnecting | 3713 -2146824575 0x800A0E81 | 非同期的な接続中に操作を行うことはできません。
adErrStillExecuting | 3711 -2146824577 0x800A0E7F | 非同期的な実行中に操作を行うことはできません。
adErrTreePermissionDenied | 3728 -2146824560 0x800A0E90 | ツリーまたはサブツリーにアクセスするには許可が不十分です。
adErrUnavailable | 3736 -2146824552 0x800A0E98 | 操作の完了に失敗し、状態は利用できません。フィールドが使用できないか操作が実行されなかった可能性があります。
adErrUnsafeOperation | 3716 -2146824572 0x800A0E84 | このコンピュータの安全性の設定により、ほかのドメインのデータ ソースへのアクセスは禁止されています。
adErrURLDoesNotExist | 3727 -2146824561 0x800A0E8F | ソース URL またはあて先の URL の親が存在しません。
adErrURLNamedRowDoesNotExist | 3737 -2146824551 0x800A0E99 | この URL によって名前を付けられたレコードが存在しません。
adErrVolumeNotFound | 3733 -2146824555 0x800A0E95 | プロバイダは URL によって指定された記憶装置を見つけられません。URL が正しく入力されているか確認してください。
adErrWriteFile | 3004 -2146825284 0x800A0BBC | ファイルへ書き込めませんでした。
adWrnSecurityDialog | 3717 -2146824571 0x800A0E85 | 内部使用のため用意されています。使用できません。
adWrnSecurityDialogHeader | 3718 -2146824570 0x800A0E86 | 内部使用のため用意されています。使用できません。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

次の ADO/WFC 等価のサブセットのみを定義します。

定数
AdoEnums.ErrorValue.BOUNDTOCOMMAND
AdoEnums.ErrorValue.DATACONVERSION
AdoEnums.ErrorValue.FEATURENOTAVAILABLE
AdoEnums.ErrorValue.ILLEGALOPERATION
AdoEnums.ErrorValue.INTRANSACTION
AdoEnums.ErrorValue.INVALIDARGUMENT
AdoEnums.ErrorValue.INVALIDCONNECTION
AdoEnums.ErrorValue.INVALIDPARAMINFO
AdoEnums.ErrorValue.ITEMNOTFOUND
AdoEnums.ErrorValue.NOCURRENTRECORD
AdoEnums.ErrorValue.NOTEXECUTING
AdoEnums.ErrorValue.NOTREENTRANT
AdoEnums.ErrorValue.OBJECTCLOSED
AdoEnums.ErrorValue.OBJECTINCOLLECTION
AdoEnums.ErrorValue.OBJECTNOTSET
AdoEnums.ErrorValue.OBJECTOPEN
AdoEnums.ErrorValue.OPERATIONCANCELLED
AdoEnums.ErrorValue.PROVIDERNOTFOUND
AdoEnums.ErrorValue.STILLCONNECTING
AdoEnums.ErrorValue.STILLEXECUTING
AdoEnums.ErrorValue.UNSAFEOPERATION


EventReasonEnum

イベントが発生する理由を表します。

定数 | 値 | 説明
adRsnAddNew | 1 | 新しいレコードが 1 つ追加されました。
adRsnClose | 9 | Recordset が閉じられました。
adRsnDelete | 2 | レコードが 1 つ削除されました。
adRsnFirstChange | 11 | レコードに最初の変更が加えられました。
adRsnMove | 10 | Recordset 内のレコード ポインタが移動しました。
adRsnMoveFirst | 12 | レコード ポインタが Recordset の最初のレコードに移動しました。
adRsnMoveLast | 15 | レコード ポインタが Recordset の最後のレコードに移動しました。
adRsnMoveNext | 13 | レコード ポインタが Recordset の次のレコードに移動しました。
adRsnMovePrevious | 14 | レコード ポインタが Recordset の前のレコードに移動しました。
adRsnRequery | 7 | Recordset が再クエリされました。
adRsnResynch | 8 | Recordset がデータベースと同期しました。
adRsnUndoAddNew | 5 | 新しいレコードの追加が取り消されました。
adRsnUndoDelete | 6 | レコードの削除が取り消されました。
adRsnUndoUpdate | 4 | レコードの更新が取り消されました。
adRsnUpdate | 3 | 既存のレコードが更新されました。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.EventReason.ADDNEW
AdoEnums.EventReason.CLOSE
AdoEnums.EventReason.DELETE
AdoEnums.EventReason.FIRSTCHANGE
AdoEnums.EventReason.MOVE
AdoEnums.EventReason.MOVEFIRST
AdoEnums.EventReason.MOVELAST
AdoEnums.EventReason.MOVENEXT
AdoEnums.EventReason.MOVEPREVIOUS
AdoEnums.EventReason.REQUERY
AdoEnums.EventReason.RESYNCH
AdoEnums.EventReason.UNDOADDNEW
AdoEnums.EventReason.UNDODELETE
AdoEnums.EventReason.UNDOUPDATE
AdoEnums.EventReason.UPDATE


EventStatusEnum

イベント実行のカレント ステータスを表します。

定数 | 値 | 説明
adStatusCancel | 4 | イベントを発生させた操作の取り消しを要求します。
adStatusCantDeny | 3 | 保留中の操作の取り消しを要求できないことを示します。
adStatusErrorsOccurred | 2 | イベントを発生させた操作がエラーによって失敗したことを示します。
adStatusOK | 1 | イベントを発生させた操作が成功したことを示します。
adStatusUnwantedEvent | 5 | イベント メソッドの実行が終了する前に、その後の通知を防ぎます。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.EventStatus.CANCEL
AdoEnums.EventStatus.CANTDENY
AdoEnums.EventStatus.ERRORSOCCURRED
AdoEnums.EventStatus.OK
AdoEnums.EventStatus.UNWANTEDEVENT


ExecuteOptionEnum

プロバイダによるコマンドの実行方法を表します。

定数 | 値 | 説明
adAsyncExecute | 0x10 | コマンドを非同期に実行することを示します。
adAsyncFetch | 0x20 | CacheSize プロパティで指定した初期量の残りの行を非同期で取得することを示します。
adAsyncFetchNonBlocking | 0x40 | 取得中にメイン スレッドがブロックしないことを示します。要求された行がまだ取得されていない場合は、現在の行が自動的にファイルの末尾に移動します。 永続的に保存されている Recordset を持つ Stream から Recordset を開くと、adAsyncFetchNonBlocking は無効になり、操作は同期で実行され、ブロッキングが発生します。 Recordset を開くときに adCmdTableDirect オプションを指定すると、adAsynchFetchNonBlocking は無効になります。
adExecuteNoRecords | 0x80 | コマンド テキストが、行を返さないコマンドまたはストアド プロシージャ (たとえば、データの挿入のみを行うコマンド) であることを示します。取得した行があっても削除されるので、コマンドからは返されません。常に CommandTypeEnum 値の adCmdText または adCmdStoredProc と組み合わせて使用されます。 adExecuteNoRecords は、Command メソッドまたは Connection Execute メソッドへ渡すオプション パラメータとしてのみ使うことができます。Command オブジェクトの CommandType プロパティに対する引数として使うとエラーが発生します。
adOptionUnspecified | -1 | コマンドが指定されていないことを示します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.ExecuteOption.ASYNCEXECUTE
AdoEnums.ExecuteOption.ASYNCFETCH
AdoEnums.ExecuteOption.ASYNCFETCHNONBLOCKING
AdoEnums.ExecuteOption.NORECORDS
AdoEnums.ExecuteOption.UNSPECIFIED


FieldEnum

Record オブジェクトの Fields コレクションで参照される特定のフィールドを表します。

解説

これらの定数は、Record に関連付けられた特定のフィールドにアクセスするための "ショートカット" として利用できます。Fields コレクションから Field オブジェクトを取得し、Field オブジェクトの Value プロパティでその内容を取り出します。

定数 | 値 | 説明
adDefaultStream | -1 | Record に関連付けられた既定の Stream オブジェクトを含んでいるフィールドを参照します。
adRecordURL | -2 | カレント Record の絶対 URL 文字列を含んでいるフィールドを参照します。


FieldAttributeEnum

1 つ以上の Field オブジェクトの属性を表します。

定数 | 値 | 説明
adFldCacheDeferred | 0x1000 | プロバイダでフィールド値がキャッシュされ、その後の読み取りはキャッシュから行われることを示します。
adFldFixed | 0x10 | フィールドが固定長データを含むことを示します。
adFldIsChapter | 0x2000 | フィールドがチャプタ値を含み、親フィールドに関連付けられた特定の子レコードセットを指定していることを示します。通常、チャプタ フィールドはデータ シェイプやフィルタ用に使います。
adFldIsCollection | 0x40000 | レコードが示すリソースが、テキスト ファイルなどの単純なリソースではなく、フォルダなどのようにほかのリソースのコレクションであることを、このフィールドが指定していることを示します。
adFldIsDefaultStream | 0x20000 | フィールドが、レコードが示すリソースの既定ストリームを含むことを示します。たとえば、既定ストリームは、ルート URL を指定すると自動的に提供される、Web サイトのルート フォルダにある HTML コンテンツです。
adFldIsNullable | 0x20 | フィールドに Null 値を指定できることを示します。
adFldIsRowURL | 0x10000 | フィールドが、レコードが示すデータ ストアのリソースを指定する URL を含むことを示します。
adFldKeyColumn | 0x8000 | フィールドが基になる行セットの主キーであることを示します。また、フィールドが複合キーの一部であるかどうかも示します。
adFldLong | 0x80 | フィールドが長バイナリ型のフィールドであることを示します。また、AppendChunk および GetChunk メソッドを利用できることを示します。
adFldMayBeNull | 0x40 | フィールドから Null 値を読み取れることを示します。
adFldMayDefer | 0x2 | フィールドが据え置きであることを示します。フィールド値は、レコード全体のデータ ソースから取得されず、明示的にアクセスした場合にのみ取得されます。
adFldNegativeScale | 0x4000 | 負のスケール値をサポートする列の数値をフィールドが表していることを示します。スケールは、NumericScale プロパティで指定します。
adFldRowID | 0x100 | フィールドが書き込み禁止の永続化された行識別子を含み、行 (レコード番号、一意識別子など) を識別する以外に有効な値は持たないことを示します。
adFldRowVersion | 0x200 | フィールドが更新を記録するための時刻または日付スタンプを含むことを示します。
adFldUnknownUpdatable | 0x8 | プロバイダがフィールドへの書き込み権限を決定できないことを示します。
adFldUnspecified | -1 | プロバイダがフィールド属性を指定しないことを示します。
adFldUpdatable | 0x4 | フィールドに書き込めることを示します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.FieldAttribute.CACHEDEFERRED
AdoEnums.FieldAttribute.FIXED
AdoEnums.FieldAttribute.ISNULLABLE
AdoEnums.FieldAttribute.KEYCOLUMN
AdoEnums.FieldAttribute.LONG
AdoEnums.FieldAttribute.MAYBENULL
AdoEnums.FieldAttribute.MAYDEFER
AdoEnums.FieldAttribute.NEGATIVESCALE
AdoEnums.FieldAttribute.ROWID
AdoEnums.FieldAttribute.ROWVERSION
AdoEnums.FieldAttribute.UNKNOWNUPDATABLE
AdoEnums.FieldAttribute.UNSPECIFIED
AdoEnums.FieldAttribute.UPDATABLE


FieldStatusEnum

Field オブジェクトのステータスを表します。

adFieldPending* 値は、ステータスを設定させた操作を示し、ほかのステータス値と組み合わされる場合があります。

定数 | 値 | 説明
adFieldAlreadyExists | 26 | 指定したフィールドが既にあることを示します。
adFieldBadStatus | 12 | ADO から OLE DB プロバイダに無効なステータス値が送信されたことを示します。原因としては、OLE DB 1.0 プロバイダまたは 1.1 プロバイダ、あるいは不適切な組み合わせの Value と Status が考えられます。
adFieldCannotComplete | 20 | Source で指定した URL のサーバーの操作が終了できないことを示します。
adFieldCannotDeleteSource | 23 | 移動操作で、ツリーまたはサブツリーを新しい位置に移動したがソースを削除できないことを示します。
adFieldCantConvertValue | 2 | フィールドを呼び出したり保存するときにデータが失われてしまうことを示します。
adFieldCantCreate | 7 | プロバイダの限度 (許容フィールド数など) を超えたためにフィールドを追加できないことを示します。
adFieldDataOverflow | 6 | プロバイダから返されたデータがフィールドのデータ型をオーバーフローしたことを示します。
adFieldDefault | 13 | データの設定時にフィールドの既定値が使われたことを示します。
adFieldDoesNotExist | 16 | 指定したフィールドがないことを示します。
adFieldIgnore | 15 | ソースでのデータの設定時にこのフィールドがスキップされたことを示します。プロバイダで値が設定されなかったことを示します。
adFieldIntegrityViolation | 10 | 計算エンティティまたは派生エンティティであるため、フィールドを編集できないことを示します。
adFieldInvalidURL | 17 | データ ソース URL に無効な文字があることを示します。
adFieldIsNull | 3 | プロバイダが Null 値を返したことを示します。
adFieldOK | 0 | 既定値です。フィールドの追加または削除に成功したことを示します。
adFieldOutOfSpace | 22 | 移動またはコピーを実行するための記憶容量をプロバイダが確保できないことを示します。
adFieldPendingChange | 0x40000 | フィールドが削除され、異なるデータ型と共に再度追加されたか、以前にステータスが adFieldOK であったフィールドの値が変更されたことを示します。Update メソッドの呼び出し後に、フィールドの最終形式によって Fields コレクションが変更されます。
adFieldPendingDelete | 0x20000 | Delete 操作でステータスが設定されたことを示します。Update メソッドの呼び出し後に Fields コレクションから削除するフィールドが、マークされました。
adFieldPendingInsert | 0x10000 | Append 操作でステータスが設定されたことを示します。Update メソッドの呼び出し後に Fields コレクションから削除するフィールドが、マークされました。
adFieldPendingUnknown | 0x80000 | フィールド ステータスを設定させた操作をプロバイダが判別できないことを示します。
adFieldPendingUnknownDelete | 0x100000 | フィールド ステータスを設定させた操作をプロバイダが判別できず、Update メソッドの呼び出し後に Fields コレクションからフィールドが削除されることを示します。
adFieldPermissionDenied | 9 | 読み取り専用に定義されているため、フィールドを編集できないことを示します。
adFieldReadOnly | 24 | データ ソース内のフィールドが読み取り専用に定義されていることを示します。
adFieldResourceExists | 19 | 宛先 URL にオブジェクトが既にあり、上書きできないため、プロバイダが操作を実行できないことを示します。
adFieldResourceLocked | 18 | データ ソースが 1 つ以上のほかのアプリケーションまたはプロセスによってロックされているため、プロバイダが操作を実行できないことを示します。
adFieldResourceOutOfScope | 25 | ソース URL または宛先 URL がカレント レコードの適用範囲外にあることを示します。
adFieldSchemaViolation | 11 | 値がフィールドのデータ ソース スキーマ条件に違反していることを示します。
adFieldSignMismatch | 5 | プロバイダが返すデータ値が符号付きで、ADO フィールド値のデータ型が符号なしであることを示します。
adFieldTruncated | 4 | データ ソースからの読み取り時に可変長データが切り捨てられることを示します。
adFieldUnavailable | 8 | データ ソースからの読み取り時にプロバイダが値を判別できないことを示します。たとえば、行が作成されたばかりであること、列の既定値が使用不可であること、または新しい値がまだ設定されていないことが原因です。
adFieldVolumeNotFound | 21 | URL が示す記憶ボリュームをプロバイダが特定できないことを示します。

ADO/WFC 等価

これらの定数に ADO/WFC 等価はありません。


FilterGroupEnum

Recordset でフィルタの対象となるレコード グループを表します。

定数 | 値 | 説明
adFilterAffectedRecords | 2 | 最後に行った Delete、Resync、UpdateBatch、または CancelBatch 呼び出しで影響を受けたレコードのみを表示するようにフィルタ処理します。
adFilterConflictingRecords | 5 | 最後に行ったバッチ更新が失敗したレコードを表示するようにフィルタ処理します。
adFilterFetchedRecords | 3 | データベースから最後に取得されたレコードであるカレント キャッシュ内のレコードを表示するようにフィルタ処理します。
adFilterNone | 0 | カレント フィルタを削除し、すべてのレコードを復元して表示します。
adFilterPendingRecords | 1 | 変更されてもサーバーにまだ送信されていないレコードのみを表示するようにフィルタ処理します。バッチ更新モードの場合にのみ使用できます。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.FilterGroup.AFFECTEDRECORDS
AdoEnums.FilterGroup.CONFLICTINGRECORDS
AdoEnums.FilterGroup.FETCHEDRECORDS
AdoEnums.FilterGroup.NONE
AdoEnums.FilterGroup.PENDINGRECORDS


GetRowsOptionEnum

Recordset から取得するレコード数を表します。

定数 | 値 | 説明
adGetRowsRest | -1 | 現在の位置または GetRows メソッドの Start パラメータで指定されたブックマークから、Recordset 内の残りのレコードを取得します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.GetRowsOption.REST


IsolationLevelEnum

Connection オブジェクトのトランザクション分離レベルを表します。

定数 | 値 | 説明
adXactUnspecified | -1 | プロバイダで指定以外の分離レベルが使われているが、そのレベルを判別できないことを示します。
adXactChaos | 16 | 分離レベルが上位のトランザクションによる保留中の変更を上書きできないことを示します。
adXactBrowse | 256 | 1 つのトランザクションから、ほかのトランザクションでコミットされていない変更を参照できることを示します。
adXactReadUncommitted | 256 | adXactBrowse と同じです。
adXactCursorStability | 4096 | 1 つのトランザクションから、ほかのトランザクションでコミットされた後の変更を参照できることを示します。
adXactReadCommitted | 4096 | adXactCursorStability と同じです。
adXactRepeatableRead | 65536 | 1 つのトランザクションから、ほかのトランザクションで行われた変更を参照できないが、再クエリで新規 Recordset オブジェクトが作成できることを示します。
adXactIsolated | 1048576 | ほかのトランザクションとは別にトランザクションが実行されたことを示します。
adXactSerializable | 1048576 | adXactIsolated と同じです。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.IsolationLevel.UNSPECIFIED
AdoEnums.IsolationLevel.CHAOS
AdoEnums.IsolationLevel.BROWSE
AdoEnums.IsolationLevel.READUNCOMMITTED
AdoEnums.IsolationLevel.CURSORSTABILITY
AdoEnums.IsolationLevel.READCOMMITTED
AdoEnums.IsolationLevel.REPEATABLEREAD
AdoEnums.IsolationLevel.ISOLATED
AdoEnums.IsolationLevel.SERIALIZABLE


LineSeparatorsEnum

テキスト Stream オブジェクトの行区切りに使われている文字を表します。

定数 | 値 | 説明
adCR | 13 | 改行復帰を示します。
adCRLF | -1 | 既定値です。改行復帰行送りを示します。
adLF | 10 | 行送りを示します。

ADO/WFC 等価

これらの定数に ADO/WFC 等価はありません。


LockTypeEnum

編集時にレコードに適用されるロックの種類を表します。

定数 | 値 | 説明
adLockBatchOptimistic | 4 | 共有的バッチ更新を示します。バッチ更新モードの場合にのみ指定できます。
adLockOptimistic | 3 | レコード単位の共有的ロックを示します。Update メソッドを呼び出した場合にのみ、プロバイダは共有的ロックを使ってレコードをロックします。
adLockPessimistic | 2 | レコード単位の排他的ロックを示します。プロバイダは、レコードを確実に編集するための措置を行います。通常は、編集直後のデータ ソースでレコードをロックします。
adLockReadOnly | 1 | 読み取り専用のレコードを示します。データの変更はできません。
adLockUnspecified | -1 | ロック タイプを指定しません。クローンの場合、複製元と同じロック タイプが適用されます。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.LockType.BATCHOPTIMISTIC
AdoEnums.LockType.OPTIMISTIC
AdoEnums.LockType.PESSIMISTIC
AdoEnums.LockType.READONLY
AdoEnums.LockType.UNSPECIFIED


MarshalOptionsEnum

サーバーにどのレコードが返されるかを表します。

定数 | 値 | 説明
adMarshalAll | 0 | 既定値です。すべての行をサーバーに返します。
adMarshalModifiedOnly | 1 | 変更した行のみサーバーに返します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.MarshalOptions.ALL
AdoEnums.MarshalOptions.MODIFIEDONLY


MoveRecordOptionsEnum

Record オブジェクトの MoveRecord メソッドの動作を表します。

定数 | 値 | 説明
adMoveUnspecified | -1 | 既定値です。既定の移動操作を実行します。既存の宛先ファイルまたはディレクトリがある場合は操作が失敗し、ハイパーテキスト リンクが更新されます。
adMoveOverWrite | 1 | 既存の宛先ファイルまたはディレクトリがあっても上書きします。
adMoveDontUpdateLinks | 2 | ソース Record のハイパーテキスト リンクを更新せずに、MoveRecord メソッドの既定動作を編集します。既定動作はプロバイダの機能によって異なります。プロバイダがサポートしていれば、移動操作でリンクが更新されます。プロバイダがリンクの修正をサポートしていない場合、またはこの値が指定されていない場合、リンクを修正しなくても移動は成功します。
adMoveAllowEmulation | 4 | プロバイダによる移動操作 (ダウンロード、更新、削除など) のシミュレーションを要求します。宛先 URL が別のサーバーにあったり、ソース以外の別のプロバイダが提供しているために Record の移動が失敗すると、プロバイダ間でリソースを移動するときのプロバイダの機能の違いにより、遅延時間の増加やデータの損失が起きることがあります。

ADO/WFC 等価

これらの定数に ADO/WFC 等価はありません。


ObjectStateEnum

オブジェクトを開いているか閉じているか、データ ソースに接続中か、コマンドを実行中か、またはデータを取得中かどうかを表します。

定数 | 値 | 説明
adStateClosed | 0 | オブジェクトが閉じていることを示します。
adStateOpen | 1 | オブジェクトが開いていることを示します。
adStateConnecting | 2 | オブジェクトが接続していることを示します。
adStateExecuting | 4 | オブジェクトがコマンドを実行中であることを示します。
adStateFetching | 8 | オブジェクトの行が取得されていることを示します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.ObjectState.CLOSED
AdoEnums.ObjectState.OPEN
AdoEnums.ObjectState.CONNECTING
AdoEnums.ObjectState.EXECUTING
AdoEnums.ObjectState.FETCHING


ParameterAttributesEnum

Parameter オブジェクトの属性を表します。

定数 | 値 | 説明
adParamSigned | 16 | パラメータに符号付きの値を指定できることを表します。
adParamNullable | 64 | パラメータに Null 値を指定できることを表します。
adParamLong | 128 | パラメータに長バイナリ型のデータを指定できることを表します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.ParameterAttributes.SIGNED
AdoEnums.ParameterAttributes.NULLABLE
AdoEnums.ParameterAttributes.LONG


ParameterDirectionEnum

Parameter が入力パラメータと出力パラメータのどちらか、またはその両方を表すのか、あるいはストアド プロシージャからの戻り値であるかどうかを表します。

定数 | 値 | 説明
adParamInput | 1 | 既定値です。パラメータが入力パラメータであることを表します。
adParamInputOutput | 3 | パラメータが入出力パラメータであることを表します。
adParamOutput | 2 | パラメータが出力パラメータであることを表します。
adParamReturnValue | 4 | パラメータが戻り値であることを表します。
adParamUnknown | 0 | パラメータの使用方法が不明であることを表します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.ParameterDirection.INPUT
AdoEnums.ParameterDirection.INPUTOUTPUT
AdoEnums.ParameterDirection.OUTPUT
AdoEnums.ParameterDirection.RETURNVALUE
AdoEnums.ParameterDirection.UNKNOWN


PersistFormatEnum

Recordset を保存するときの形式を表します。

定数 | 値 | 説明
adPersistADTG | 0 | Microsoft Advanced Data TableGram (ADTG) フォーマットであることを表します。
adPersistXML | 1 | Extensible Markup Language (XML) フォーマットであることを表します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.PersistFormat.ADTG
AdoEnums.PersistFormat.XML


PositionEnum

Recordset 内のレコード ポインタの現在の位置を表します。

定数 | 値 | 説明
adPosBOF | -2 | カレント レコードのポインタが BOF にあることを表します (BOF プロパティが True です)。
adPosEOF | -3 | カレント レコードのポインタが EOF にあることを表します (EOF プロパティが True です)。
adPosUnknown | -1 | Recordset が空、現在の位置が不明、またはプロバイダが AbsolutePage プロパティか、または AbsolutePosition プロパティをサポートしていません。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.Position.BOF
AdoEnums.Position.EOF
AdoEnums.Position.UNKNOWN


PropertyAttributesEnum

Property オブジェクトの属性を表します。

定数 | 値 | 説明
adPropNotSupported | 0 | プロバイダがプロパティをサポートしていないことを示します。
adPropRequired | 1 | データ ソースを初期化するには、ユーザーがこのプロパティ値を指定する必要があることを表します。
adPropOptional | 2 | ユーザーがこのプロパティ値を指定しなくてもデータ ソースを初期化できることを表します。
adPropRead | 512 | ユーザーがプロパティを読み取り可能であることを示します。
adPropWrite | 1024 | ユーザーがプロパティを設定できることを示します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.PropertyAttributes.NOTSUPPORTED
AdoEnums.PropertyAttributes.REQUIRED
AdoEnums.PropertyAttributes.OPTIONAL
AdoEnums.PropertyAttributes.READ
AdoEnums.PropertyAttributes.WRITE


RecordCreateOptionsEnum

Record オブジェクトの Open メソッドに対し、既存の Record を開くか、新しい Record を作成するかを表します。これらの値は AND 演算子で結合することもできます。

定数 | 値 | 説明
adCreateCollection | 0x2000 | 既存の Record を開かずに、Source パラメータで指定したノードに新しい Record を作成します。ソースが既存のノードを指定する場合、adCreateCollection が adOpenIfExists または adCreateOverwrite に結合されていない限り、実行時エラーになります。
adCreateNonCollection | 0 | adSimpleRecord 型の新しい Record を作成します。
adCreateOverwrite | 0x4000000 | 作成フラグ adCreateCollection、adCreateNonCollection、および adCreateStructDoc を修飾します。この値と作成フラグの値の 1 つは、OR を使って結合されており、ソース URL が既存のノードまたは Record を指定している場合、既存の Record の上書き、および新しい Record の作成が行われます。この値は、adOpenIfExists とは併用できません。
adCreateStructDoc | 0x80000000 | 既存の Record を開かずに、タイプ adStructDoc の新しい Record を作成します。
adFailIfNotExists | -1 | 既定値です。Source が存在しないノードを指定していると、実行時エラーになります。
adOpenIfExists | 0x2000000 | 作成フラグ adCreateCollection、adCreateNonCollection、および adCreateStructDoc を修正します。この値と作成フラグの値の 1 つは、OR を使って結合されており、ソース URL が既存のノードまたは Record オブジェクトを指定している場合、プロバイダは新しい Record を作成せずに既存の Record を開きます。この値は、adCreateOverwrite とは併用できません。

ADO/WFC 等価

これらの定数に ADO/WFC 等価はありません。


RecordOpenOptionsEnum

Record を開くときのオプションを表します。これらの値は OR 演算子で結合することもできます。

定数 | 値 | 説明
adDelayFetchFields | 0x8000 | プロバイダに対して、Record に関連付けられているフィールドは最初に呼び出さなくても、そのフィールドに最初にアクセスするときに呼び出せることを表します。このフラグがない場合の既定動作では、すべての Record オブジェクト フィールドが呼び出されます。
adDelayFetchStream | 0x4000 | プロバイダに対して、Record に関連付けられている既定ストリームを最初に呼び出さなくてもよいことを表します。このフラグがない場合の既定動作では、この Record オブジェクトに関連付けられている既定ストリームが呼び出されます。
adOpenAsync | 0x1000 | Record オブジェクトが非同期モードで開かれることを表します。
adOpenRecordUnspecified | -1 | 既定値です。オプションが指定されていないことを表します。
adOpenSource | 0x800000 | 実行可能スクリプト (拡張子が .ASP のページなど) があるノードをソースが指定している場合、実行されたコンテンツではなく、そのソースがある Record が開かれることを表します。この値は、コレクションのないレコードにのみ有効です。

ADO/WFC 等価

これらの定数に ADO/WFC 等価はありません。


RecordStatusEnum

バッチ更新または別の一括操作に関するレコードのステータスを表します。

定数 | 値 | 説明
adRecCanceled | 0x100 | 操作が取り消されたため、レコードが保存されなかったことを表します。
adRecCantRelease | 0x400 | 既存のレコードがロックされたため、新しいレコードが保存されなかったことを表します。
adRecConcurrencyViolation | 0x800 | 共有的ロックの同時実行が使用中のため、レコードが保存されなかったことを表します。
adRecDBDeleted | 0x40000 | レコードは既にデータ ソースから削除されていることを表します。
adRecDeleted | 0x4 | レコードが削除されたことを表します。
adRecIntegrityViolation | 0x1000 | ユーザーが整合性の制約に違反したため、レコードが保存されなかったことを表します。
adRecInvalid | 0x10 | ブックマークが無効なため、レコードが保存されなかったことを表します。
adRecMaxChangesExceeded | 0x2000 | 保留中の変更が多すぎたため、レコードが保存されなかったことを表します。
adRecModified | 0x2 | レコードが変更されたことを表します。
adRecMultipleChanges | 0x40 | 複数のレコードに影響があったので、レコードが保存されなかったことを表します。
adRecNew | 0x1 | レコードが新しいことを示します。
adRecObjectOpen | 0x4000 | 開いているストレージ オブジェクトとの競合のため、レコードが保存されなかったことを表します。
adRecOK | 0 | レコードの更新が成功したことを表します。
adRecOutOfMemory | 0x8000 | メモリ不足のためレコードが保存されなかったことを表します。
adRecPendingChanges | 0x80 | 保留中の挿入を参照するので、レコードが保存されなかったことを表します。
adRecPermissionDenied | 0x10000 | ユーザーの権限不足により、レコードが保存されなかったことを表します。
adRecSchemaViolation | 0x20000 | 基になるデータベースの構造に合わないので、レコードが保存されなかったことを表します。
adRecUnmodified | 0x8 | レコードが変更されなかったことを表します。

ADO/WFC 等価

AdoEnums.RecordStatus.

パッケージ: com.ms.wfc.data

定数
AdoEnums.RecordStatus.CANCELED
AdoEnums.RecordStatus.CANTRELEASE
AdoEnums.RecordStatus.CONCURRENCYVIOLATION
AdoEnums.RecordStatus.DBDELETED
AdoEnums.RecordStatus.DELETED
AdoEnums.RecordStatus.INTEGRITYVIOLATION
AdoEnums.RecordStatus.INVALID
AdoEnums.RecordStatus.MAXCHANGESEXCEEDED
AdoEnums.RecordStatus.MODIFIED
AdoEnums.RecordStatus.MULTIPLECHANGES
AdoEnums.RecordStatus.NEW
AdoEnums.RecordStatus.OBJECTOPEN
AdoEnums.RecordStatus.OK
AdoEnums.RecordStatus.OUTOFMEMORY
AdoEnums.RecordStatus.PENDINGCHANGES
AdoEnums.RecordStatus.PERMISSIONDENIED
AdoEnums.RecordStatus.SCHEMAVIOLATION
AdoEnums.RecordStatus.UNMODIFIED


RecordTypeEnum

Record オブジェクトの種類を表します。

定数 | 値 | 説明
adSimpleRecord | 0 | "単一の" レコード (子ノードがないレコード) を表します。
adCollectionRecord | 1 | "コレクション" レコード (子ノードがあるレコード) を表します。
adStructDoc | 2 | COM 構造化ドキュメントを表す特殊な "コレクション" レコードを表します。

ADO/WFC 等価

これらの定数に ADO/WFC 等価はありません。


ResyncEnum

Resync の呼び出しによって基になる値が上書きされるかどうかを表します。

定数 | 値 | 説明
adResyncAllValues | 2 | 既定値です。データは上書きされ、保留中の更新は取り消されます。
adResyncUnderlyingValues | 1 | データは上書きされず、保留中の更新は取り消されません。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.Resync.ALLVALUES
AdoEnums.Resync.UNDERLYINGVALUES


SaveOptionsEnum

Stream オブジェクトからファイルを保存するときにファイルを作成するか、上書きするかを表します。これらの値は併用できません。

定数 | 値 | 説明
adSaveCreateNotExist | 1 | 既定値です。FileName パラメータで指定したファイルがない場合は新しいファイルが作成されます。
adSaveCreateOverwrite | 2 | FileName パラメータで指定したファイルがある場合は、現在開かれている Stream オブジェクトのデータでファイルを上書きします。

ADO/WFC 等価

これらの定数に ADO/WFC 等価はありません。


SchemaEnum

OpenSchema メソッドが取得するスキーマ Recordset の種類を表します。

解説

各 ADO 定数に返される関数と列については、「OLE DB Programmer’s Reference」の「Appendix B」を参照してください。各トピックの名前は、次の表の説明の箇所でかっこ書きになっています。

各 ADO MD 定数に返される関数と列については、「OLE DB for OLAP」の「Chapter 22」を参照してください。各トピックの名前は、次の表の説明の箇所でかっこ書きとアスタリスク (*) で表しています。

OLE DB ドキュメントの中の列のデータ型は、ADO の「DataTypeEnum」の説明を参考に、ADO データ型に読み換えてください。たとえば、OLE DB データ型 DBTYPE_WSTR は、ADO データ型 adWChar と等価です。

ADO では、定数 adSchemaDBInfoKeywords と定数 adSchemaDBInfoLiterals についてはスキーマ的結果を生成します。ADO は Recordset を作成し、IDBInfo::GetKeywords メソッドと IDBInfo::GetLiteralInfo メソッドが返す値をそれぞれの行に代入します。前述のメソッドの詳細については、「OLE DB Programmer's Reference」の「IDBInfo」を参照してください。

定数 | 値 | 説明 | 制約列
adSchemaAsserts | 0 | 所定のユーザーが所有する、カタログに定義されたアサーションを返します。 (ASSERTIONS 行セット) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME
adSchemaCatalogs | 1 | DBMS からアクセスできるカタログに関連付けられている物理的属性を返します。 (CATALOGS 行セット) | CATALOG_NAME
adSchemaCharacterSets | 2 | 所定のユーザーがアクセスできる、カタログに定義された文字セットを返します。 (CHARACTER_SETS 行セット) | CHARACTER_SET_CATALOG CHARACTER_SET_SCHEMA CHARACTER_SET_NAME
adSchemaCheckConstraints | 5 | 所定のユーザーが所有するカタログに定義されたチェック制約を返します。 (CHECK_CONSTRAINTS 行セット) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME
adSchemaCollations | 3 | 所定のユーザーがアクセスできる、カタログに定義された文字照合を返します。 (COLLATIONS 行セット) | COLLATION_CATALOG COLLATION_SCHEMA COLLATION_NAME
adSchemaColumnPrivileges | 13 | 所定のユーザーが利用できる、あるいは権限を持つカタログに定義されたテーブルの列に対する特権を返します。 (COLUMN_PRIVILEGES 行セット) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME GRANTOR GRANTEE
adSchemaColumns | 4 | 所定のユーザーがアクセスできるカタログに定義されたテーブルの列 (ビューも含む) を返します。 (COLUMNS 行セット) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME
adSchemaColumnsDomainUsage | 11 | カタログに定義されたドメインに依存し、所定のユーザーが所有するカタログに定義された列を返します。 (COLUMN_DOMAIN_USAGE 行セット) | DOMAIN_CATALOG DOMAIN_SCHEMA DOMAIN_NAME COLUMN_NAME
adSchemaConstraintColumnUsage | 6 | 参照制約、一意制約、チェック制約、およびアサーションに使う列で、カタログに定義され、所定のユーザーが所有する列を返します。 (CONSTRAINT_COLUMN_USAGE 行セット) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME
adSchemaConstraintTableUsage | 7 | 参照制約、一意制約、チェック制約、およびアサーションに使うテーブルで、カタログに定義され、所定のユーザーが所有する列を返します。 (CONSTRAINT_TABLE_USAGE 行セット) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
adSchemaCubes | 32 | スキーマ (プロバイダがスキーマをサポートしていない場合はカタログ) 内の利用できるキューブに関する情報を返します。 (CUBES 行セット*) | CATALOG_NAME SCHEMA_NAME CUBE_NAME
adSchemaDBInfoKeywords | 30 | プロバイダ固有のキーワードの一覧を返します。 (IDBInfo::GetKeywords *) | <なし>
adSchemaDBInfoLiterals | 31 | テキスト コマンドで使う、プロバイダ固有のリテラルの一覧を返します。 (IDBInfo::GetLiteralInfo *) | <なし>
adSchemaDimensions | 33 | 所定のキューブの次元に関する情報を返します。次元ごとに 1 行が割り当てられます。 (DIMENSIONS 行セット*) | CATALOG_NAME SCHEMA_NAME CUBE_NAME DIMENSION_NAME DIMENSION_UNIQUE_NAME
adSchemaForeignKeys | 27 | 所定のユーザーがカタログに定義した外部キー列を返します。 (FOREIGN_KEYS 行セット) | PK_TABLE_CATALOG PK_TABLE_SCHEMA PK_TABLE_NAME FK_TABLE_CATALOG FK_TABLE_SCHEMA FK_TABLE_NAME
adSchemaHierarchies | 34 | 次元で利用できる階層に関する情報を返します。 (HIERARCHIES 行セット *) | CATALOG_NAME SCHEMA_NAME CUBE_NAME DIMENSION_UNIQUE_NAME HIERARCHY_NAME HIERARCHY_UNIQUE_NAME
adSchemaIndexes | 12 | 所定のユーザーが所有する、カタログに定義されたインデックスを返します。 (INDEXES 行セット) | TABLE_CATALOG TABLE_SCHEMA INDEX_NAME TYPE TABLE_NAME
adSchemaKeyColumnUsage | 8 | 所定のユーザーがキーとして条件化した、カタログに定義された列を返します。 (KEY_COLUMN_USAGE 行セット) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME
adSchemaLevels | 35 | 次元で利用できるレベルに関する情報を返します。 (LEVELS 行セット*) | CATALOG_NAME SCHEMA_NAME CUBE_NAME DIMENSION_UNIQUE_NAME HIERARCHY_UNIQUE_NAME LEVEL_NAME LEVEL_UNIQUE_NAME
adSchemaMeasures | 36 | 利用できる単位に関する情報を返します。 (MEASURES 行セット*) | CATALOG_NAME SCHEMA_NAME CUBE_NAME MEASURE_NAME MEASURE_UNIQUE_NAME
adSchemaMembers | 38 | 利用できるメンバに関する情報を返します。 (MEMBERS 行セット *) | CATALOG_NAME SCHEMA_NAME CUBE_NAME DIMENSION_UNIQUE_NAME HIERARCHY_UNIQUE_NAME LEVEL_UNIQUE_NAME LEVEL_NUMBER MEMBER_NAME MEMBER_UNIQUE_NAME MEMBER_CAPTION MEMBER_TYPE ツリー演算子 (詳細については、「OLE DB for OLAP」を参照してください。
adSchemaPrimaryKeys | 28 | 所定のユーザーがカタログに定義した主キー列を返します。 (PRIMARY_KEYS 行セット) | PK_TABLE_CATALOG PK_TABLE_SCHEMA PK_TABLE_NAME
adSchemaProcedureColumns | 29 | プロシージャが返す行セットの列に関する情報を返します (PROCEDURE_COLUMNS 行セット) | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME COLUMN_NAME
adSchemaProcedureParameters | 26 | パラメータとプロシージャの戻りコードに関する情報を返します (PROCEDURE_PARAMETERS 行セット) | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME PARAMETER_NAME
adSchemaProcedures | 16 | 所定のユーザーが所有するカタログに定義されたプロシージャを返します。 (PROCEDURES 行セット) | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME PROCEDURE_TYPE
adSchemaProperties | 37 | 次元のレベルごとに利用できるプロパティに関する情報を返します。 (PROPERTIES 行セット *) | CATALOG_NAME SCHEMA_NAME CUBE_NAME DIMENSION_UNIQUE_NAME HIERARCHY_UNIQUE_NAME LEVEL_UNIQUE_NAME MEMBER_UNIQUE_NAME PROPERTY_TYPE PROPERTY_NAME
adSchemaProviderSpecific | -1 | プロバイダが非標準の専用のスキーマ クエリを定義する場合に使います。 | <プロバイダ固有>
adSchemaProviderTypes | 22 | データ プロバイダがサポートする (基本) データ型を返します。 (PROVIDER_TYPES 行セット) | DATA_TYPE BEST_MATCH
adSchemaReferentialConstraints | 9 | 所定のユーザーが所有するカタログに定義された参照制約を返します。 (REFERENTIAL_CONSTRAINTS 行セット) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME
adSchemaSchemata | 17 | 所定のユーザーが所有するスキーマ (データベース オブジェクト) を返します。 (SCHEMATA 行セット) | CATALOG_NAME SCHEMA_NAME SCHEMA_OWNER
adSchemaSQLLanguages | 18 | カタログに定義された SQL 実装処理データがサポートする合致レベル、オプション、文法を返します。 (SQL_LANGUAGES 行セット) | <なし>
adSchemaStatistics | 19 | 所定のユーザーが所有するカタログに定義された統計値を返します。 (STATISTICS 行セット) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
adSchemaTableConstraints | 10 | 所定のユーザーが所有するカタログに定義されたテーブル制約を返します。 (TABLE_CONSTRAINTS 行セット) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE
adSchemaTablePrivileges | 14 | 所定のユーザーが利用できるカタログまたは権限のあるカタログに定義されたテーブルに対する権限を返します。 (TABLE_PRIVILEGES 行セット) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME GRANTOR GRANTEE
adSchemaTables | 20 | 所定のユーザーがアクセスできるカタログに定義されたテーブル (ビューも含む) を返します。 (TABLES 行セット) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE
adSchemaTranslations | 21 | 所定のユーザーがアクセスできるカタログに定義された文字変換を返します。 (TRANSLATIONS 行セット) | TRANSLATION_CATALOG TRANSLATION_SCHEMA TRANSLATION_NAME
adSchemaTrustees | 39 | 将来用。 |
adSchemaUsagePrivileges | 15 | 所定のユーザーが利用できるカタログまたは権限のあるカタログに定義されたオブジェクトの USAGE 権限を返します。 (USAGE_PRIVILEGES 行セット) | OBJECT_CATALOG OBJECT_SCHEMA OBJECT_NAME OBJECT_TYPE GRANTOR GRANTEE
adSchemaViewColumnUsage | 24 | カタログに定義され、所定のユーザーが所有する、表示テーブルが依存する列を返します。 (VIEW_COLUMN_USAGE 行セット) | VIEW_CATALOG VIEW_SCHEMA VIEW_NAME
adSchemaViews | 23 | 所定のユーザーがアクセスできるカタログに定義されたビューを返します。 (VIEWS 行セット) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
adSchemaViewTableUsage | 25 | カタログに定義され、所定のユーザーが所有する、表示テーブルが依存するテーブルを返します。 (VIEW_TABLE_USAGE 行セット) | VIEW_CATALOG VIEW_SCHEMA VIEW_NAME

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.Schema.ASSERTS
AdoEnums.Schema.CATALOGS
AdoEnums.Schema.CHARACTERSETS
AdoEnums.Schema.CHECKCONSTRAINTS
AdoEnums.Schema.COLLATIONS
AdoEnums.Schema.COLUMNPRIVILEGES
AdoEnums.Schema.COLUMNS
AdoEnums.Schema.COLUMNSDOMAINUSAGE
AdoEnums.Schema.CONSTRAINTCOLUMNUSAGE
AdoEnums.Schema.CONSTRAINTTABLEUSAGE
AdoEnums.Schema.CUBES
AdoEnums.Schema.DBINFOKEYWORDS
AdoEnums.Schema.DBINFOLITERALS
AdoEnums.Schema.DIMENSIONS
AdoEnums.Schema.FOREIGNKEYS
AdoEnums.Schema.HIERARCHIES
AdoEnums.Schema.INDEXES
AdoEnums.Schema.KEYCOLUMNUSAGE
AdoEnums.Schema.LEVELS
AdoEnums.Schema.MEASURES
AdoEnums.Schema.MEMBERS
AdoEnums.Schema.PRIMARYKEYS
AdoEnums.Schema.PROCEDURECOLUMNS
AdoEnums.Schema.PROCEDUREPARAMETERS
AdoEnums.Schema.PROCEDURES
AdoEnums.Schema.PROPERTIES
AdoEnums.Schema.PROVIDERSPECIFIC
AdoEnums.Schema.PROVIDERTYPES
AdoEnums.Schema.REFERENTIALCONTRAINTS
AdoEnums.Schema.SCHEMATA
AdoEnums.Schema.SQLLANGUAGES
AdoEnums.Schema.STATISTICS
AdoEnums.Schema.TABLECONSTRAINTS
AdoEnums.Schema.TABLEPRIVILEGES
AdoEnums.Schema.TABLES
AdoEnums.Schema.TRANSLATIONS
AdoEnums.Schema.TRUSTEES
AdoEnums.Schema.USAGEPRIVILEGES
AdoEnums.Schema.VIEWCOLUMNUSAGE
AdoEnums.Schema.VIEWS
AdoEnums.Schema.VIEWTABLEUSAGE


SearchDirectionEnum

Recordset 内のレコードの検索方向を表します。

定数 | 値 | 説明
adSearchBackward | -1 | 後方検索をし、Recordset の先頭で終了します。一致するレコードが見つからない場合、レコード ポインタは BOF に移動します。
adSearchForward | 1 | 前方検索をし、Recordset の末尾で終了します。一致するレコードが見つからない場合、レコード ポインタは EOF に移動します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.SearchDirection.BACKWARD
AdoEnums.SearchDirection.FORWARD


SeekEnum

実行する Seek オブジェクトの種類を表します。

定数 | 値 | 説明
adSeekFirstEQ | 1 | KeyValues と一致する最初のキーを検索します。
adSeekLastEQ | 2 | KeyValues と一致する最後のキーを検索します。
adSeekAfterEQ | 4 | KeyValues と一致するキー、またはその直後のキーのどちらかを検索します。
adSeekAfter | 8 | KeyValues と一致するキーの直後のキーを検索します。
adSeekBeforeEQ | 16 | KeyValues と一致するキー、またはその直前のキーのどちらかを検索します。
adSeekBefore | 32 | KeyValues と一致するキーの直前のキーを検索します。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.Seek.FIRSTEQ
AdoEnums.Seek.LASTEQ
AdoEnums.Seek.AFTEREQ
AdoEnums.Seek.AFTER
AdoEnums.Seek.BEFOREEQ
AdoEnums.Seek.BEFORE


StreamOpenOptionsEnum

Stream オブジェクトを開くときのオプションを表します。これらの値は OR 演算子で結合することもできます。

定数 | 値 | 説明
adOpenStreamAsync | 1 | 非同期モードで Stream オブジェクトを開きます。
adOpenStreamFromRecord | 4 | Source パラメータの内容を、既に開かれている Record オブジェクトとして識別します。既定動作では、Source は、ツリー構造のノードを直接指定する URL として処理します。このノードに関連付けられた既定ストリームが開かれます。
adOpenStreamUnspecified | -1 | 既定値です。既定オプションで Stream オブジェクトを開くことを指定します。

ADO/WFC 等価

これらの定数に ADO/WFC 等価はありません。


StreamReadEnum

Stream オブジェクトから、ストリーム全体、または次の行を読み取るかどうかを表します。

定数 | 値 | 説明
adReadAll | -1 | 既定値です。現在の位置から EOS マーカー方向に、すべてのバイトをストリームから読み取ります。これは、バイナリ ストリームに有効な唯一の StreamReadEnum 値です (Type は adTypeBinary)。
adReadLine | -2 | ストリームから次の行を読み取ります (LineSeparator プロパティで指定)。

ADO/WFC 等価

これらの定数に ADO/WFC 等価はありません。


StreamTypeEnum

Stream オブジェクトに保存するデータの種類を表します。

定数 | 値 | 説明
adTypeBinary | 1 | バイナリ データを表します。
adTypeText | 2 | 既定値です。Charset で指定された文字セットにあるテキスト データを表します。

ADO/WFC 等価

これらの定数に ADO/WFC 等価はありません。


StreamWriteEnum

Stream オブジェクトに書き込む文字列に行区切り文字を追加するかどうかを表します。

定数 | 値 | 説明
adWriteChar | 0 | 既定値です。Stream オブジェクトに対して、Data パラメータで指定したテキスト文字列を書き込みます
adWriteLine | 1 | Stream オブジェクトに、テキスト文字列と行区切り文字を書き込みます。LineSeparator プロパティが定義されていない場合は、既定値 adCRLF を書き込みます。

ADO/WFC 等価

これらの定数に ADO/WFC 等価はありません。


StringFormatEnum

文字列として Recordset を取得するときの形式を表します。

定数 | 値 | 説明
adClipString | 2 | 行が RowDelimiter によって、列が ColumnDelimiter によって、Null 値が NullExpr によって区切られます。GetString メソッドのこれら 3 つのパラメータは、adClipString の StringFormat とのみ併用できます。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.StringFormat.CLIPSTRING


XactAttributeEnum

Connection オブジェクトのトランザクション属性を表します。

定数 | 値 | 説明
adXactAbortRetaining | 262144 | 連続してアボートを実行します。RollbackTrans を呼び出すと自動的に新規トランザクションを開始します。この設定をサポートしていないプロバイダもあります。
adXactCommitRetaining | 131072 | 連続してコミットを実行します。CommitTrans を呼び出すと、自動的に新規トランザクションを開始します。この設定をサポートしていないプロバイダもあります。

ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.XactAttribute.ABORTRETAINING
AdoEnums.XactAttribute.COMMITRETAINING


ADO エラー

特定のエラー メッセージの詳細については、次のトピックを参照してください。

  • ADO エラー コード

  • RDS.DataControl エラー コード

  • Internet Explorer エラー コード

  • Internet Information Services エラー コード


ADO エラー コード

Errors コレクションの Error オブジェクトで返されるプロバイダ エラーに加えて、ADO 自体も実行時環境の例外処理機構にエラーを返すことができます。ADO エラーのトラップには、Visual Basic の On Error ステートメント、Visual C++ または Visual J++ の try-catch ブロックなど、プログラミング言語のエラー トラップ機能を利用してください。

ADO エラー コードの一覧については、「ErrorValueEnum」を参照してください。


DataControl エラー コード

次の表は RDS.DataControl オブジェクト エラー コードの一覧です。下位 2 バイトを正の 10 進数に変換した値、エラー コード全体を負の 10 進数に変換した値、および 16 進数値を示します。

RDS.DataControl エラーコード | 番号 | 説明
IDS_AsyncPending | 4113 -2146824175 0x800A1011 | 非同期操作保留中により、操作は実行できません。
IDS_BadInlineTablegram | 4105 -2146824183 0x800A1009 | 不良なインライン テーブルグラムです。
IDS_CantConnect | 4099 -2146824189 0x800A1003 | サーバーに接続できません。
IDS_CantCreateObject | 4100 -2146824188 0x800A1004 | ビジネス オブジェクトは作成できません。
IDS_CantFindDataspace | 4102 -2146824186 0x800A1006 | Dataspace プロパティは無効です。
IDS_CantInvokeMethod | 4101 -2146824187 0x800A1005 | ビジネス オブジェクトのメソッドを呼び出せません。
IDS_CrossDomainWarning | 4118 -2146824170 0x800A1016 | このページはほかのドメイン上のデータにアクセスしようとしています。操作を許可しますか?Internet Explorer でこのメッセージを非表示するには、セキュリティで保護された Web サイトを [インターネット オプション] ダイアログ ボックスの [セキュリティ] タブで [信頼済みサイト ゾーン] へ追加します。
IDS_InvalidADCClientVersion | 4112 -2146824176 0x800A1010 | 無効な RDS クライアント バージョン - クライアントは、サーバーより新しいバージョンです。
IDS_INVALIDARG | 5376 -2147019520 0x80071500 | いくつかの引数は無効です。
IDS_InvalidBindings | 4097 -2146824191 0x800A1001 | プロパティのバインディング エラーです。
IDS_InvalidParam | 4116 -2146824172 0x800A1014 | いくつかの引数は無効です。
IDS_NOINTERFACE | 5377 -2147019519 0x80071501 | そのインターフェイスはサポートされていません。
IDS_NotReentrant | 4117 -2146824171 0x800A1015 | イベント ハンドラが処理中に要求を実行することはできません。
IDS_ObjectNotSafe | 4103 -2146824185 0x800A1007 | このコンピュータの安全性の設定により、ビジネス オブジェクトの作成が禁止されています。
IDS_RecordsetNotOpen | 4115 -2146824173 0x800A1013 | Recordset はオープンの状態ではありません。
IDS_ResetInvalidField | 4114 -2146824174 0x800A1012 | SortColumn、FilterColumn に指定された列は存在しません。
IDS_RowsetNotUpdateable | 4104 -2146824184 0x800A1008 | Rowset は更新できません。
IDS_UnexpectedError | 4351 -2146823937 0x800A10FF | 予期しないエラーです。
IDS_UpdatesFailed | 4098 -2146824190 0x800A1002 | データベースを更新できません。
IDS_URLMONNotFound | 4119 -2146824169 0x800A1017 | DataControl URL プロパティにはシステム ファイル Urlmon.dll が必要ですが、ファイルが見つかりません。


Internet Explorer エラー コード

次の表は、Remote Data Service (RDS) の使用に関連する、Internet Explorer のエラー コードの一覧です。下位 2 バイトを正の 10 進数に変換した値、エラー コード全体を負の 10 進数に変換した値、および 16 進数値を示します。

Internet Explorer (Wininet) エラー コード | 番号 | 説明
IDS_WinInet_CantConnect | 8195 -2146820093 0x800A2003 | インターネット クライアント エラー : サーバーに接続できません。
IDS_WinInet_ ConnectionReset | 12031 -2146816257 0x800A2EFF | インターネット クライアント エラー : 接続リセット。
IDS_WinInet_Error | 8193 -2146820095 0x800A2001 | インターネット クライアント エラーです。
IDS_WinInet_ InvalidServerResponse | 8430 -2146819858 0x800A20EE | インターネット クライアント エラー : 無効なサーバーの応答です。
IDS_WinInet_ SSLPostLimitation | 8196 -2146820092 0x800A2004 | インターネット クライアント エラー : SSL エラー (おそらく 32KB のデータ アップロード限度のため)。
IDS_WinInet_Timeout | 8194 -2146820094 0x800A2002 | インターネット クライアント エラー : 要求はタイムアウトしました。


Internet Information Services エラー コード

次の表は、Remote Data Service の使用に関連する、Internet Information Services のエラー コードの一覧です。下位 2 バイトを正の 10 進数に変換した値、エラー コード全体を負の 10 進数に変換した値、および 16 進数値を示します。

Internet Information Services エラー コード | 番号 | 説明
IDS_IIS_AccessDenied | 8208 -2146820080 0x800A2010 | インターネット サーバー エラー : アクセスは拒否されました。
IDS_IIS_ObjectNotFound | 8209 -2146820079 0x800A2011 | インターネット サーバー エラー : オブジェクト/モジュールが見つかりません。
IDS_IIS_RequestForbidden | 8210 -2146820078 0x800A2012 | インターネット サーバー エラー : 要求は禁止されています。
IDS_IIS_UnexpectedError | 8447 -2146819841 0x800A20FF | インターネット サーバー エラーです。


ADO を使用したプログラミング

ADO は、Microsoft Visual Basic、VBScript、JScript、Visual C++、Visual J++ など、さまざまなプログラミング言語に利用できる COM オートメーション インターフェイス コンポーネントです。ADO のいずれかのバージョンは、これらのツールや、その他 Microsoft® Office® や Microsoft SQL Server などのアプリケーションと共にインストールされます。ADO の最新バージョンは、Microsoft Data Access コンポーネントとは別に入手できます。詳細については、Microsoft Data Access の Web サイトを参照してください。

ADO ライブラリのファイル名は Msado15.dll、またプログラムID (ProgID) は "ADODB" です。たとえば、ADO Recordset を明示的に参照するには、ADODB.Recordset を使います。

各種開発環境における ADO によるプログラミングの詳細については、次のトピックを参照してください。

  • Microsoft Visual Basic での ADO の使用

  • スクリプト言語での ADO の使用

  • Microsoft Visual C++ での ADO の使用

  • Microsoft Visual J++ での ADO の使用


Microsoft Visual Basic での ADO の使用

ADO プロジェクトのセットアップと ADO コードの作成は、Visual Basic と Visual Basic for Applications のどちらを使う場合も、ほとんど変わりありません。このトピックでは、Visual Basic と Visual Basic for Applications の両方における ADO の使用方法と違いについて説明します。

ADO プロジェクトの作成

ADO ライブラリは、オブジェクトで参照します。

Microsoft Visual Basic から ADO を参照するには

  1. Visual Basic の [プロジェクト] メニューで [参照設定] をクリックします。

  2. 一覧から [Microsoft ActiveX Data Objects x.x Library] を選択します。少なくとも、次のライブラリが選択されているかを確認します。
    • Visual Basic for Applications

    • Visual Basic 実行時オブジェクトとプロシージャ

    • Visual Basic オブジェクトとプロシージャ

    • OLE Automation
  3. [OK] をクリックします。

たとえば、Microsoft Access を使って Visual Basic for Applications で簡単に ADO を実行することができます。

Microsoft Access から ADO を参照するには

  1. Microsoft Access で、[データベース] ウィンドウの [モジュール] タブからモジュールを選択または作成します。

  2. [ツール] メニューの [参照設定] をクリックします。

  3. 一覧から [Microsoft ActiveX Data Objects x.x Library] を選択します。少なくとも、次のライブラリも選択されているかを確認します。
    • Visual Basic for Applications

    • Microsoft Access 8.0 オブジェクト ライブラリ (またはそれ以降のバージョン)

    • Microsoft DAO 3.5 オブジェクト ライブラリ (またはそれ以降のバージョン)
  4. [OK] をクリックします。

Visual Basic における ADO オブジェクトの作成

オートメーション変数を作成し、その変数のオブジェクトをインスタンス化するには、Dim または CreateObject の 2 つのメソッドのどちらかを使います。

Dim

Dim では、New キーワードを使って一度に ADO オブジェクトを宣言してインスタンス化できます。

Dim conn As New ADODB.Connection

または、Dim ステートメントの宣言とオブジェクトのインスタンス化を 2 段階で行うこともできます。

Dim conn As ADODB.Connection
Set conn = New ADODB.Connection

注意 プロジェクト内で ADO ライブラリが正しく参照されていれば、ADODB progid を Dim ステートメントで明示的に指定する必要はありません。ただし、Dim ステートメントを使えばほかのライブラリとの命名の競合を確実に回避できます。

たとえば、同じプロジェクトで ADO と DAO の両方に対する参照を使う場合は、Recordset オブジェクトのインスタンス化のときにどちらのオブジェクト モデルを使うかを区別するために、次のようなコードで修飾子を追加する必要があります。

Dim adoRS As ADODB.Recordset
Dim daoRS As DAO.Recordset

CreateObject

CreateObject メソッドでは、2 つの異なる手順で宣言とオブジェクトのインスタンス化を行います。

Dim conn1
Set conn1 = CreateObject("ADODB.Connection") As Object

CreateObject を使ってインスタンス化されたオブジェクトは実行時にバインドされます。すなわち、型が明確に決定されていないため、完全にコマンド行を確定できません。ただし、プロジェクトから ADO ライブラリに対する参照を省略することはでき、特定のオブジェクト バージョンのインスタンス化が可能です。次に例を示します。

Set conn1 = CreateObject("ADODB.Connection.2.0") As Object

ADO Version 2.0 タイプ ライブラリに対する参照を作成し、またオブジェクトを作成することができます。

CreateObject メソッドでオブジェクトをインスタンス化する方法は、一般的に Dim ステートメントを使う方法よりも時間がかかります。

Visual Basic の例

ADO のマニュアルには、さまざまな Visual Basic の例が掲載されています。詳細については「Microsoft Visual Basic での ADO コードの例」を参照してください。


スクリプト言語での ADO の使用

スクリプト環境では、ADO を使って、サーバー側スクリプトによりデータを公開できます。この方法では、ADO、ADO が使う基になる OLE DB プロバイダ、および所定のデータ ストアを参照するコンポーネントが、Internet Information Services (IIS) を実行するサーバーにインストールされます。たとえば、Active Server Pages (ASP) を使う ADO は、HTML を生成できるスクリプトで参照されるコンポーネントです。この HTML コンテンツは、HTTP によって Web ブラウザに渡すことができます。スクリプトを使えば、Web ページからのアクションをサーバー側スクリプトに戻して、特定のデータを更新、移動、および表示することができます。

ODBC データ ソースは、スクリプト ADO コードと非スクリプト ADO コードの大きな違いのひとつです。非スクリプト アプリケーションの場合、ODBC データ ソース アドミニストレータでユーザー DSN を作成できます。IIS で実行するスクリプトの場合、システム DSN を作成する必要があります。システム DSN を作成しないと、スクリプトは作成したデータ ソースを認識できません。このことは、Microsoft IIS から Microsoft OLE DB Provider for ODBC を使うすべての ADO スクリプト アプリケーションに当てはまります。

次のトピックは、ADO をスクリプト言語で実行する場合の具体的な説明です。

  • VBScript で実行する ADO

  • JScript で実行する ADO


VBScript で実行する ADO

ADO プロジェクトの作成

VBScript では、タイプ ライブラリをサポートしていないので、プロジェクトの ADO を参照する必要はありません。したがって、コマンド行を完全に確定するなど、関連付け機能はサポートしていません。また、VBScript において、既定では ADO 列挙定数を定義しません。

ただし、ADO では、VBScript 用の次の定義を納めた 2 つのインクルード ファイルを用意しています。

  • サーバー側スクリプトには、Adovbs.inc を使います。これは既定で c:\Program Files\Common Files\System\ado\ フォルダにインストールされます。

  • クライアント側スクリプトには、Adcvbs.inc を使います。これは既定で c:\Program Files\Common Files\System\msdac\ フォルダにインストールされます。

定数定義は、これらのファイルから ASP ページにコピーして貼り付けるか、またはサーバー側スクリプトを行う場合、Adovbs.inc ファイルを Web サイトのフォルダにコピーして、次のように ASP ページから参照します。

<!--#include File="adovbs.inc"-->

Visual Basic における ADO オブジェクトの作成

Dim ステートメントでは、オブジェクトを VBScript の特定の型に割り当てることはできません。また、VBScript では、Visual Basic for Applications の Dim ステートメントに使う New 構文をサポートしていません。代わりに、CreateObject 関数の呼び出しを使います。

Dim Rs1
Set Rs1 = Server.CreateObject( "ADODB.Recordset" )

VBScript の例

次のコードは、Active Server Pages (ASP) ファイルにおける VBScript サーバー側プログラミングの一般的な例です。

<%  @LANGUAGE="VBSCRIPT" %>
<%  Option Explicit %>
<!--#include File="adovbs.inc"-->
<HTML>
    <BODY BGCOLOR="White" topmargin="10" leftmargin="10">

    <!-- Your ASP Code goes here -->
<%
Dim Source
Dim Connect
Dim Rs1

Source = "SELECT * FROM Authors"
Connect = "Provider=sqloledb;Data Source=srv;" & _
    "Initial Catalog=Pubs;User Id=sa;Password=;"

Set Rs1 = Server.CreateObject( "ADODB.Recordset" )
Rs1.Open Source, Connect, adOpenForwardOnly
Response.Write("Success!")
%>
    </BODY>
</HTML>

VBScript のより具体的な例については、ADO のマニュアルを参照してください。詳細については、「Microsoft Visual Basic, Scripting Edition での ADO コードの例」を参照してください。

VBScript と Visual Basic の違い

構文の使用方法をはじめ、VBScript で ADO を実行することは、Visual Basic で ADO を実行する場合と、さまざまな点で似ています。ただし、いくつか大きな違いもあります。

  • VBScript はバリアント型 (Variant) だけをサポートしています。このデータ型でさまざまな種類のデータを格納できます。バリアント データ型で必要なデータを保存しても、そのデータは VBScript によってキャストされるので正しく機能します。VBScript は ADO に必要な型を認識し、値をバリアント型に変換します。

  • on error goto <label> は VBScript 内では使えません。

  • VBScript は、Msgbox、Date、および IsNumeric などのビルトイン Visual Basic 関数をサポートしています。ただし、VBScript は Visual Basic のサブセットなので、すべてのビルトイン関数をサポートしているわけではありません。たとえば、VBScript は Format 関数とファイル入出力関数をサポートしていません。


JScript で実行する ADO

ADO プロジェクトの作成

JScript では、タイプ ライブラリをサポートしていないので、プロジェクトの ADO を参照する必要はありません。したがって、コマンド行の完全な確定など、関連付け機能はサポートしていません。また、JScript において、既定では ADO 列挙定数を定義しません。

ただし、ADO では JScript 用の次の定義を納めた 2 つのインクルード ファイルを用意しています。

  • サーバー側スクリプトには、Adojavas.inc を使います。これは既定で c:\Program Files\Common Files\System\ado\ フォルダにインストールされます。

  • クライアント側スクリプトには、Adcjavas.inc を使います。これは既定で c:\Program Files\Common Files\System\msdac\ フォルダにインストールされます。

定数定義は、これらのファイルから ASP ページにコピーして貼り付けるか、またはサーバー側スクリプトを行う場合、Adojavas.inc ファイルを Web サイトのフォルダにコピーして、次のように ASP ページから参照します。

<!--#include File="adojavas.inc"-->

JScript における ADO オブジェクトの作成

CreateObject 関数呼び出しを使います。

var Rs1;
Rs1 = Server.CreateObject("ADODB.Recordset");

JScript の例

次のコードは、Recordset オブジェクトを開く Active Server Pages (ASP) ファイルにおける JScript サーバー側プログラミングの一般的な例です。

<%  @LANGUAGE="JScript" %>
<!--#include File="adojavas.inc"-->
<HTML>
<BODY BGCOLOR="White" topmargin="10" leftmargin="10">
<%
var Source = "SELECT * FROM Authors";
var Connect =  "Provider=sqloledb;Data Source=srv;" +
    "Initial Catalog=Pubs;User Id=sa;Password=;"
var Rs1 = Server.CreateObject( "ADODB.Recordset.2.5" );
Rs1.Open(Source,Connect,adOpenForwardOnly);
Response.Write("Success!");
%>
</BODY>
</HTML>


Microsoft Visual C++ での ADO の使用

Visual C++ での ADO の使用方法については、次のトピックを参照してください。

  • Visual C++ ユーザーのための ADO マニュアルの読み方

  • Visual C++ Extensions for ADO

  • ADO for Visual C++ の COM 構文インデックス

  • ADO for Visual C++ 構文インデックス #import 付き


Visual C++ ユーザーのための ADO マニュアルの読み方

「ADO API リファレンス」では、Microsoft Visual Basic に似た構文を使用して ADO アプリケーション プログラミング インターフェイス (API) の機能を説明します。あらゆるユーザーを対象に書かれたマニュアルですが、ADO プログラマが利用する言語は、Visual Basic、Visual C++ (#import ディレクティブ付きとなし)、Visual J++ (ADO/WFC クラス パッケージ付き) などさまざまです。

この多様性に対応するため、「Microsoft Visual C++ での ADO の使用」では、「ADO API リファレンス」での、機能、パラメータ、例外処理などの共通の説明にリンクした Visual C++ 言語固有の構文を用意しました。

ADO は COM (コンポーネント オブジェクト モデル) インターフェイスで実装されています。ただし、プログラマにとって、COM はほかのどの言語よりも使い慣れた言語で処理する方が容易です。たとえば、Visual Basic プログラマの場合、COM のほとんどすべては暗黙的に処理されますが、Visual C++ プログラマの場合は自分で処理しなくてはなりません。

次のトピックでは、ADO と #import ディレクティブを使う C プログラマと C++ プログラマのために使用方法の概要を説明します。COM (Variant、BSTR、SafeArray) に固有のデータ型とエラー処理 (_com_error) を中心に説明します。

#import コンパイラ ディレクティブの使用

#import Visual C++ コンパイラ ディレクティブを利用すれば、簡単に ADO のメソッドとプロパティを処理できます。このディレクティブは、ADO .dll (Msado15.dll) など、タイプ ライブラリを収めたファイルの名前を受けて、typedef 宣言、インターフェイスのスマート ポインタ、および列挙定数を組み込んだヘッダー ファイルを生成します。各インターフェイスはクラスにカプセル化、またはラップされます。

クラス内の操作 (メソッドやプロパティの呼び出し) ごとに、操作を直接呼び出す ("raw" の形式の操作) ための宣言と、raw operation を呼び出して、操作の実行が失敗したときに COM エラーを生成するための宣言が必要です。操作がプロパティ関連の場合は、Visual Basic に似た構文の操作のために、代替構文を作成するコンパイラ ディレクティブが実行されます。

プロパティの値を取得する操作には、Get Property という形式の名前が割り当てられます。

プロパティの値を設定する操作には、Put Property という形式の名前が割り当てられます。

ADO オブジェクトに対するポインタを持つプロパティの値を設定する操作には、PutRef Property という形式の名前が割り当てられます。

プロパティの取得や設定は、次の形式の呼び出しで行います。

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

プロパティ ディレクティブの使用

__declspec(property...) コンパイラ ディレクティブは、Microsoft 固有の C 言語拡張機能であり、プロパティとして利用される関数を宣言して代替構文を設定します。そのため、プロパティの値の設定や取得は、Visual Basic に似た方法で行うことができます。たとえば、プロパティの設定や取得は、次のように行います。

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

ここでは、コーディングが不要な点に注意してください。

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

コンパイラは、宣言された代替構文と、プロパティが読み取り専用か、書き込み専用かに基づいて、対応する Get-、Put-、または PutRef Property 呼び出しを生成します。

__declspec(property...) コンパイラ ディレクティブでは、関数には、get、put、または get と put の代替構文しか宣言できません。読み取り専用操作では get 宣言だけを、書き込み専用操作では put 宣言だけを、また読み書き両方の操作では get 宣言と put 宣言を組み込みます。

このディレクティブで使える宣言は 2 つだけですが、各プロパティには、Get Property、Put Property、および PutRef Property の 3 つのプロパティ関数を組み込むことができます。その場合、代替構文を使えるのは 2 つのプロパティ形式だけです。

たとえば、Command オブジェクト ActiveConnection プロパティは、Get ActiveConnection と PutRef ActiveConnection の代替構文で宣言します。適切な選択は PutRef- 構文です。なぜなら、一般には、このプロパティには開かれた Connection オブジェクト (すなわち、Connection オブジェクト ポインタ) を書き込むことが多いためです。一方、Recordset オブジェクトには、Get-、Put-、および PutRef ActiveConnection の各操作が対応しますが、代替構文はありません。

コレクション、GetItem メソッド、Item プロパティ

ADO では、Fields、Parameters、Properties、および Errors などいくつかのコレクションを定義しています。Visual C++ では、GetItem(index) メソッドは、このコレクション メンバを返します。Index はバリアント型 (Variant) であり、この値は、コレクション メンバの数値インデックスか、メンバ名を組み込んだ文字列です。

__declspec(property...) コンパイラ ディレクティブは、各コレクションの基本 GetItem() メソッドに対する代替構文として Item プロパティを宣言します。代替構文は角かっこを使い、配列参照に似ています。一般には、次のような 2 つの形式が使われます。

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

たとえば、rs という名前の Recordset オブジェクトのフィールドに、pubs データベースの authors テーブルから取り出した値を代入します。Recordset オブジェクト Fields コレクションの 3 番目の Field をアクセスするには、Item() プロパティを使います (コレクションは 0 からインデックスを設定し、3 番目のフィールド名は au_fname と想定)。Field オブジェクトで Value() メソッドを呼び出して、文字列値を代入します。

これを Visual Basic で記述すると次のようになります。(最後の 2 つの 形式は Visual Basic 固有の形式であり、ほかの言語に等価形式はありません)。

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

上の最初の 2 形式に対する Visual C++ の等価形式は次のとおりです。

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

- または - (Value プロパティの代替構文は次のとおり)

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

COM 固有のデータ型

一般に、「ADO API リファレンス」で使われている Visual Basic のデータ型には Visual C++ の等価となるデータ型があります。そのようなデータ型には、Visual Basic の Byte に対応する unsigned char、Integer に対応する short、Long に対応する long などがあります。各メソッドやプロパティのオペランドに必要な内容については、「構文インデックス」を参照してください。

このルールを適用できないのは、バリアント型 (Variant)、BSTR、および SafeArray の、COM 固有の次のデータ型です。

バリアント型 (Variant)

バリアント型 (Variant) は、値メンバとデータ型メンバを格納する構造化データ型です。バリアント型 (Variant) には、別のバリアント型 (Variant)、BSTR、ブール型 (Boolean)、IDispatch、または IUnknown ポインタ、通貨、日付などさまざまな異なるデータ型を格納できます。COM には、簡単にデータ型間の変換が行えるメソッドが用意されています。

_variant_t クラスは、バリアント型 (Variant) データをカプセル化し、管理します。

「ADO API リファレンス」で、メソッド オペランドやプロパティ オペランドが値をとるというとき、一般には _variant_t で値を渡すことを意味します。

「ADO API リファレンス」のトピックの「パラメータ」でオペランドがバリアント型 (Variant) というとき、無条件にこのルールを適用します。ただし、マニュアルでオペランドが長整数型 (Long)、バイト型 (Byte)、または列挙など標準データ型をとると明示してある場合は除きます。また、オペランドが文字列型 (String) をとる場合も除きます。

BSTR

BSTR (Basic STRing) は、文字列と文字長を格納する構造化データ型です。COM には、BSTR を割り当て、操作、解放するメソッドが用意されています。

_bstr_t クラスは BSTR データ型をカプセル化し、管理します。

「ADO API リファレンス」で、メソッド オペランドやプロパティ オペランドが文字列型 (String) の値をとるというとき、一般には _bstr_t で値を渡すことを意味します。

_variant_t クラスと _bstr_t クラスのキャスティング

演算に対して _variant_t または _bstr_t を引数で明示的にコーディングする必要は通常ありません。引数のデータ型に応じたコンストラクタが _variant_t クラスまたは _bstr_t クラスにある場合、必要な _variant_t または _bstr_t がコンパイラによって生成されます。

ただし、引数のデータ型が複数のコンストラクタに対応するなど引数が不明確な場合、対応したデータ型で引数をキャスティングしないと正しいコンストラクタを呼び出すことはできません。

次に Recordset::Open メソッドの宣言例を示します。

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

ActiveConnection 引数は、_variant_t に対する参照をとります。これは、開かれた Connection オブジェクトに対する接続文字列またはポインタとしてコーディングできます。

"DSN=pubs;uid=sa;pwd=;" などの文字列または "(IDispatch *) pConn" などのポインタを渡せば、正しい _variant_t が自動的に生成されます。

あるいは、"_variant_t((IDispatch *) pConn, true)" などのポインタを組み込んだ _variant_t を明示的にコーディングする方法もあります。キャスト (IDispatch *) により、IUnknown インターフェイスに対するポインタをとる別のコンストラクタとのあいまいさが解消されます。

あまり取り上げられることはありませんが、ADO が IDispatch インターフェイスであるということに注意してください。ADO オブジェクトに対するポインタをバリアント型 (Variant) として渡すとき、そのポインタは IDispatch インターフェイスに対するポインタとしてキャスティングする必要があるためです。

最後の例では、コンストラクタの 2 番目のブール型 (Boolean) 引数を、オプションの既定値 True で明示的にコーディングしています。この引数の指定により、バリアント型 (Variant) コンストラクタが AddRef() メソッドを呼び出し、このメソッドは、ADO メソッドまたはプロパティの呼び出しが終了すると、_variant_t::Release() メソッドを自動的に呼び出す ADO を補償します。

SafeArray

SafeArray は、別のデータ型の配列を格納する構造化データ型です。SafeArray が "Safe (安全)" であるとされているのは、各配列の次元の範囲に関する情報を SafeArray が格納し、配列要素に対するアクセスをそれらの範囲内に制限するためです。

「ADO API リファレンス」で、「メソッドやプロパティが配列をとる」、または「返す」というとき、メソッドやプロパティが、ネイティブ C/C++ 配列ではなく SafeArray をとること、または返すことを意味します。

たとえば、Connection オブジェクト OpenSchema メソッドの 2 番目のパラメータには、バリアント型 (Variant) の値の配列が必要です。これらのバリアント型 (Variant) の値は、SafeArray の要素として渡され、その SafeArray は別の Variant の値として設定されます。OpenSchema の 2 番目の引数として渡されるのは、別のバリアント型 (Variant) です。

さらに別の例として、Find メソッドの最初の引数がバリアント型 (Variant) で、その値が一次元の SafeArray の場合、AddNew の最初と 2 番目の任意の引数は、それぞれ一次元 SafeArray であり、GetRows メソッドの戻り値は、値が二次元 SafeArray のバリアント型 (Variant) です。

パラメータの省略と既定パラメータ

Visual Basic では、メソッドのパラメータを省略できます。たとえば、Recordset オブジェクトの Open メソッドには 5 つのパラメータがありますが、中間のパラメータを省略して、後続のパラメータはそのまま使用することができます。省略したオペランドのデータ型に応じて、既定の BSTR やバリアント型 (Variant) が代用されます。

C/C++ では、すべてのオペランドを指定する必要があります。データ型が文字列の省略パラメータを指定するには、Null 値を格納した _bstr_t を指定します。データ型がバリアント型 (Variant) の省略パラメータを指定するには、値を DISP_E_PARAMNOTFOUND、型を VT_ERROR で _variant_t を指定します。または、#import ディレクティブが備える等価の _variant_t 定数である vtMissing を指定します。

vtMissing の一般的な使用方法にあてはまらないメソッドが 3 つあります。それは、Connection オブジェクトと Command オブジェクトの Execute メソッド、Recordset オブジェクトの NextRecordset メソッドです。次に、そのシグネチャを示します。

_RecordsetPtr ExecutemdmthCnnExecute( _bstr_t CommandText, VARIANT * RecordsAffected,
        long Options );  // Connection
_RecordsetPtr ExecutemdmthCmdExecute( VARIANT * RecordsAffected, VARIANT * Parameters,
        long Options );  // Command
_RecordsetPtr NextRecordsetmdmthNextRec( VARIANT * RecordsAffected );  // Recordset

パラメータ RecordsAffected と Parameters は 1 つのバリアント型 (Variant) に対するポインタです。Parameters は、実行するコマンドを変更する 1 つのパラメータまたはパラメータの配列を格納するバリアント型 (Variant) のアドレスを指定する入力パラメータです。RecordsAffected は、メソッドによって影響を受ける行数を返すバリアント型 (Variant) のアドレスを指定する出力パラメータです。

Command オブジェクトの Execute メソッドで、パラメータの省略を指定するには、Parameters を &vtMissing (推奨) か、Null ポインタ (NULL またはゼロ (0)) に設定します。Parameters を Null ポインタに設定すると、メソッドは vtMissing の等価に内部的に置換して操作を実行します。

すべてのメソッドで、RecordsAffected を Null ポインタに設定して、影響を受けるレコードの数を返さないように指定します。この場合の Null ポインタは省略パラメータではなく、影響を受けるレコードの数をメソッドで破棄せよという指示です。

したがって、これら 3 つのメソッドの場合、次のようなコーディングも可能です。

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

エラー処理

COM では、ほとんどの操作で HRESULT 戻りコードが返ります。これは関数が成功したかどうかを示すコードです。#import ディレクティブは、raw メソッドやプロパティごとにラッパー コードを生成して、返された HRESULT を調べます。HRESULT がエラーを示すとき、ラッパー コードは、HRESULT 戻りコードを引数として _com_issue_errorex() を呼び出して COM エラーを生成します。COM エラー オブジェクトは、try-catch ブロックで捕捉できます。(効率性を考えて、_com_error オブジェクトに対する参照を使います。)

これらは、ADO 操作の失敗で生成される ADO エラーであることを念頭に置いておきます。基になるプロバイダが返すエラーは、Connection オブジェクト Errors コレクションに Error オブジェクトとして表示されます。

#import ディレクティブでは、ADO .dll で宣言したメソッドとプロパティにだけエラー処理ルーチンを作成します。ただし、自分でエラー確認マクロやインライン関数を記述すれば、同じエラー処理機能を利用できます。例については、「Visual C++ Extensions for ADO」または、後述のコードを参照してください。

Visual Basic 規約と等しい Visual C++ 規約

次に、Visual Basic と等しい Visual C++ でコーディングした ADO マニュアルの規約の概要を示します。

ADO オブジェクトの宣言

Visual Basic では、ADO オブジェクト変数 (この場合は Recordset オブジェクト) は、次のように宣言します。

Dim rst As ADODB.Recordset

句 "ADODB.Recordset" は、レジストリで定義した Recordset オブジェクトの ProgID です。Record オブジェクトの新しいインスタンスは次のように宣言します。

Dim rst As New ADODB.Recordset

- または -

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

Visual C++ では、#import ディレクティブによってスマート ポインタ型宣言がすべての ADO オブジェクトに対して生成されます。たとえば、_Recordset オブジェクトを指定する変数は、型が _RecordsetPtr になり、次のように宣言します。

_RecordsetPtr  rs;

_Recordset オブジェクトの新しいインスタンスを指定する変数は、次のように宣言します。

_RecordsetPtr  rs("ADODB.Recordset");

- または -

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

- または -

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

CreateInstance メソッドの呼び出し後、変数は次のように使うことができます。

rs->Open(...);

変数がクラスのインスタンスであるものとして "." 演算子が使われ (rs.CreateInstance)、変数がインターフェイスへのポインタであるものとして "->" 演算子が使われる (rs->Open) ことに注意してください。

"->" 演算子がオーバーロードされているために、クラスのインスタンスをインターフェイスへのポインタのように利用できる場合は、1 つの変数を 2 通りに使うことができます。インスタンス変数のプライベート クラス メンバは、_Recordset インターフェイスへのポインタを格納します。"->" 演算子はポインタを返し、返されたポインタは _Recordset オブジェクトのメンバにアクセスします。

省略パラメータのコーディング - 文字列型 (String)

省略文字列型 (String) オペランドを Visual Basic でコーディングするときは、単純にそのオペランドを省略します。Visual C++ ではオペランドを指定する必要があります。空文字列を値として持つ _bstr_t をコーディングします。

_bstr_t strMissing(L"");

省略パラメータのコーディング - バリアント型 (Variant)

省略バリアント型 (Variant) オペランドを Visual Basic でコーディングするときは、単純にそのオペランドを省略します。Visual C++ では、すべてのオペランドを指定する必要があります。省略バリアント型 (Variant) パラメータをコーディングするには、特別な値 DISP_E_PARAMNOTFOUND と型 VT_ERROR で _variant_t を設定します。または、#import ディレクティブが提供する等価の定義済み定数である vtMissing を指定します。

_variant_t  vtMissingYours(DISP_E_PARAMNOTFOUND, VT_ERROR);

- または -

...vtMissing...;

バリアント型 (Variant) の宣言

Visual Basic では、バリアント型 (Variant) は、次のように Dim ステートメントで宣言します。

Dim VariableName As Variant

Visual C++ では、型 _variant_t として変数を宣言します。スキーマ的 _variant_t 宣言の例を次に示します。

注意 これらの宣言は、プログラムで何をコーディングをするか、その概要を示したものです。詳細については、この後の例や Visual C++ のマニュアルを参照してください。

_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) 配列の使用

Visual Basic では、バリアント型 (Variant) 配列は Dim ステートメントを使ってコーディングします。または、次のコード例にもあるように Array 関数を使うこともできます。

Public Sub ArrayOfVariants
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim fld As ADODB.Field

cn.Open "DSN=pubs", "sa", ""
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

次の Visual C++ の例では、_variant_t に使う SafeArray の使用方法を示します。

注意 次の注意事項は、コード例のコメント部分に対応しています。

  1. もう一度、TESTHR() インライン関数を定義して、既存のエラー処理機能を利用します。

  2. 必要なのは一次元配列のみであり、汎用の SAFEARRAYBOUND 宣言と SafeArrayCreate 関数の代わりに SafeArrayCreateVector が使えます。次の例は、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) に関連付けられています。したがって、4 つの要素を持つバリアント型 (Variant) の値の配列が作成されます。次に、3 番目の列 TABLE_NAME に対応する制約値を指定します。

    返される Recordset は、さまざまな列で構成されています。このサブセットが制約列です。各戻り行に対する制約列の値は、対応する制約値と同じにします。

  4. SafeArrays に慣れていると、終了前に SafeArrayDestroy() が呼び出されないことに驚かれるかもしれません。実際、このときに SafeArrayDestroy() を呼び出すと実行時例外処理になります。これは、_variant_t が範囲外になると SafeArray が解除されて、vtCriteria のデストラクタが VariantClear() を呼び出すためです。手動で _variant_t を消去せずに SafeArrayDestroy を呼び出すと、デストラクタは無効な SafeArray ポインタを消去しようとします。

    SafeArrayDestroy を呼び出すと、次のようなコードになります。

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

    ただし、_variant_t で SafeArray を管理する方がずっと簡単です。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>

// Note 1
inline void TESTHR( HRESULT _hr )
   { if FAILED(_hr) _com_issue_error(_hr); }

void main(void)
{
   CoInitialize(NULL);
   try
   {
   _RecordsetPtr   pRs("ADODB.Recordset");
   _ConnectionPtr  pCn("ADODB.Connection");
   _variant_t      vtTableName("authors"),
                   vtCriteria;
   long            ix[1];
   SAFEARRAY       *pSa = NULL;

   pCn->Open("DSN=pubs;User ID=sa;pwd=;Provider=MSDASQL;", "", "",
               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 Property の使用

Visual Basic では、取得、割り当て、または参照の割り当てによって、プロパティ名が識別されることはありません。

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;User Id=sa;Password=;"
rs.PageSize = 10
sz = rs.PageSize
rs.ActiveConnection = cn
rs.Open "authors",,adOpenStatic
' ...
rs.Close
cn.Close
End Sub

この Visual C++ の例は、Get/Put/PutRef Property を示しています。

注意 次の注意事項は、コード例のコメント部分に対応しています。

  1. この例では、2 つの形式の省略文字列引数を使っています。それらは、Open メソッドの範囲内で存在する一時 _bstr_t を作成するためにコンパイラが使う、明示定数 strMissing と文字列です。

  2. rs->PutRefActiveConnection(cn) オペランドの型が既に (IDispatch *) になっているので、このオペランドは (IDispatch *) にキャストする必要はありません。
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>

void main(void)
{
   CoInitialize(NULL);
   try
   {
      _ConnectionPtr  cn("ADODB.Connection");
      _RecordsetPtr   rs("ADODB.Recordset");
      _bstr_t         strMissing(L"");
      long            oldPgSz = 0,
                      newPgSz = 5;

// Note 1
      cn->Open("Provider=sqloledb;Data Source=yourserver;"
         "Initial Catalog=pubs;User Id=sa;Password=;",
         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) と Item[x] の使用

この Visual Basic の例では、Item() の標準構文と代替構文を示します。

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

この Visual C++ の例は、Item を示しています。

注意 次の注意事項は、コード例のコメント部分に対応しています。

  3. コレクションに Item を使ってアクセスした場合、適切なコンストラクタを呼び出すため、インデックス 2 は長整数型 (long) にキャストされます。
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>

void main(void)
{
   CoInitialize(NULL);
   try {
      _RecordsetPtr   rs("ADODB.Recordset");
      _variant_t      vtFirstName;

      rs->Open("authors",
               "Provider=sqloledb;Data Source=yourserver;"
               "Initial Catalog=pubs;User Id=sa;Password=;",
               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();
}

(IDispatch *) を使った ADO オブジェクト ポインタのキャスティング

次の Visual C++ の例では、(IDispatch *) を使った ADO オブジェクト ポインタのキャスティングを示します。

注意 次の注意事項は、コード例のコメント部分に対応しています。

  4. 明示的にコーディングされたバリアント型 (Variant) で、開いている Connection を指定します。正しいコンストラクタが呼び出されるように、(IDispatch *) を使ってキャストします。また、Recordset::Open の操作の終了時にオブジェクト参照カウントが正しくなるように、2 番目の _variant_t パラメータを既定値 True に明示的に設定します。

  5. 式 (_bstr_t) はキャストではなく、Value が返すバリアント型 (Variant) から _bstr_t 文字列を取り出す _variant_t 演算子です。

    式 (char*) はキャストではなく、_bstr_t オブジェク内のカプセル化された文字列へのポインタを取り出す _bstr_t 演算子です。

    このコード セクションでは、_variant_t 演算子と _bstr_t 演算子の便利な機能をいくつか示します。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>

void main(void)
{
   CoInitialize(NULL);
   try
   {
      _ConnectionPtr pConn("ADODB.Connection");
      _RecordsetPtr  pRst("ADODB.Recordset");

      pConn->Open("Provider=sqloledb;Data Source=yourserver;"
         "Initial Catalog=pubs;User Id=sa;Password=;",
         "", "", 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();
}


Visual C++ Extensions for ADO

Visual C++ を使うプログラマが ADO でデータを取得する際に直面する面倒な作業の 1 つに、バリアント データ型 (Variant) として返されたデータを C++ データ型に変換し、変換したデータをさらにクラスまたは構造体に格納するという作業があります。バリアント データ型 (Variant) を使って C++ データ型を取得すると、手間がかかるだけではなくパフォーマンスも低下します。

ADO には、バリアント型 (Variant) を使わずにネイティブな C/C++ データ型のデータを取得できるインターフェイスと、そのインターフェイスを簡単に操作するためのプリプロセッサ マクロが用意されています。その結果として、使いやすく優れたパフォーマンスを持った、柔軟性のあるツールとなりました。

C/C++ クライアントでは、通常は、ネイティブ C/C++ 型を格納する C/C++ 構造体またはクラスに Recordset のレコードをバインドします。バリアント型 (Variant) を使う場合、バリアント型からネイティブ C/C++ 型に変換するコードを作成する必要があります。Visual C++ Extensions for ADO は、Visual C++ プログラマが上記の作業を簡単に行えるようにすることを目的としています。

Visual C++ Extensions for ADO の詳細については、次のトピックを参照してください。

  • Visual C++ Extensions for ADO の使用

  • Visual C++ Extensions のヘッダーの詳細

  • Visual C++ Extensions での ADO の例


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_ENTRY、ADO_NUMERIC_ENTRY、または ADO_VARIABLE_LENGTH_ENTRY マクロ ファミリからメンバを選択して使います。

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

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

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

IADORecordBinding インターフェイスには、3 つのメソッド、BindToRecordset、AddNew、および 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 フィールドおよび変数の関連付けを定義します。先頭および末尾のマクロでバインディング エントリのセットが区切られます。

adDate や adBoolean などの固定長データ、adTinyInt、adInteger、または adDouble などの数値データ、adChar、adVarChar、または 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 に設定することを示すために、Status を adFldNull に設定します。

定数 | 値 | 説明
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 | 更新時に、既定値が使われました。


Visual C++ Extensions ヘッダーの詳細

Visual C++ Extensions のヘッダーの詳細

ヘッダー icrsint.h には、CADORecordBinding から派生したクラスで定義した変数に、Recordset からフィールドを呼び出すインターフェイスの詳細を記述します。呼び出すフィールドごとに、ADO バインディング マクロを指定します。

#ifndef _ICRSINT_H_
#define _ICRSINT_H_

#include <olectl.h>
#include <stddef.h>

// forwards
class CADORecordBinding;

#define classoffset(base, derived) ((DWORD)(static_cast<base*>((derived*)8))-8)

enum ADOFieldStatusEnum
{
    adFldOK = 0,
    adFldBadAccessor = 1,
    adFldCantConvertValue = 2,
    adFldNull = 3,
    adFldTruncated = 4,
    adFldSignMismatch = 5,
    adFldDataOverFlow = 6,
    adFldCantCreate = 7,
    adFldUnavailable = 8,
    adFldPermissionDenied = 9,
    adFldIntegrityViolation = 10,
    adFldSchemaViolation = 11,
    adFldBadStatus = 12,
    adFldDefault = 13
};

typedef struct stADO_BINDING_ENTRY
{
    ULONG      ulOrdinal;
    WORD       wDataType;
    BYTE       bPrecision;
    BYTE       bScale;
    ULONG      ulSize;
    ULONG      ulBufferOffset;
    ULONG      ulStatusOffset;
    ULONG      ulLengthOffset;
    ULONG      ulADORecordBindingOffSet;
    BOOL       fModify;
} ADO_BINDING_ENTRY;

#define BEGIN_ADO_BINDING(cls) public: \
    typedef cls ADORowClass; \
    const ADO_BINDING_ENTRY* STDMETHODCALLTYPE GetADOBindingEntries() { \
    static const ADO_BINDING_ENTRY rgADOBindingEntries[] = {

//
// Fixed length non-numeric data
//
#define ADO_FIXED_LENGTH_ENTRY(Ordinal, DataType, Buffer, Status, Modify)\
    {Ordinal, \
    DataType, \
    0, \
    0, \
    0, \
    offsetof(ADORowClass, Buffer), \
    offsetof(ADORowClass, Status), \
    0, \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

#define ADO_FIXED_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Modify)\
    {Ordinal, \
    DataType, \
    0, \
    0, \
    0, \
    offsetof(ADORowClass, Buffer), \
    0, \
    0, \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

//
// Numeric data
//
#define ADO_NUMERIC_ENTRY(Ordinal, DataType, Buffer, Precision, Scale, Status, Modify)\
    {Ordinal, \
    DataType, \
    Precision, \
    Scale, \
    0, \
    offsetof(ADORowClass, Buffer), \
    offsetof(ADORowClass, Status), \
    0, \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

#define ADO_NUMERIC_ENTRY2(Ordinal, DataType, Buffer, Precision, Scale, Modify)\
    {Ordinal, \
    DataType, \
    Precision, \
    Scale, \
    0, \
    offsetof(ADORowClass, Buffer), \
    0, \
    0, \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

//
// Variable length data
//
#define ADO_VARIABLE_LENGTH_ENTRY(Ordinal, DataType, Buffer, Size, Status, Length, Modify)\
    {Ordinal, \
    DataType, \
    0, \
    0, \
    Size, \
    offsetof(ADORowClass, Buffer), \
    offsetof(ADORowClass, Status), \
    offsetof(ADORowClass, Length), \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

#define ADO_VARIABLE_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Size, Status, Modify)\
    {Ordinal, \
    DataType, \
    0, \
    0, \
    Size, \
    offsetof(ADORowClass, Buffer), \
    offsetof(ADORowClass, Status), \
    0, \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

#define ADO_VARIABLE_LENGTH_ENTRY3(Ordinal, DataType, Buffer, Size, Length, Modify)\
    {Ordinal, \
    DataType, \
    0, \
    0, \
    Size, \
    offsetof(ADORowClass, Buffer), \
    0, \
    offsetof(ADORowClass, Length), \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

#define ADO_VARIABLE_LENGTH_ENTRY4(Ordinal, DataType, Buffer, Size, Modify)\
    {Ordinal, \
    DataType, \
    0, \
    0, \
    Size, \
    offsetof(ADORowClass, Buffer), \
    0, \
    0, \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

#define END_ADO_BINDING()   {0, adEmpty, 0, 0, 0, 0, 0, 0, 0, FALSE}};\
    return rgADOBindingEntries;}

//
// Interface that the client 'record' class needs to support. The ADO Binding entries
// provide the implementation for this interface.
//
class CADORecordBinding
{
public:
    STDMETHOD_(const ADO_BINDING_ENTRY*, GetADOBindingEntries) (VOID) PURE;
};

//
// Interface that allows a client to fetch a record of data into class data members.
//
struct __declspec(uuid("00000544-0000-0010-8000-00aa006d2ea4")) IADORecordBinding;
DECLARE_INTERFACE_(IADORecordBinding, IUnknown)
{
public:
    STDMETHOD(BindToRecordset) (CADORecordBinding *pAdoRecordBinding) PURE;
    STDMETHOD(AddNew) (CADORecordBinding *pAdoRecordBinding) PURE;
    STDMETHOD(Update) (CADORecordBinding *pAdoRecordBinding) PURE;
};

#endif // !_ICRSINT_H_


Visual C++ Extensions での ADO の例

このプログラムは、値がフィールドからどのように取得され、C++ 変数に変換されるかを示しています。

この例では、"スマート ポインタ" を利用しています。これにより、COM 固有の QueryInterface の呼び出しの詳細と、IADORecordBinding インターフェイスに必要な参照が自動的に処理されます。

スマート ポインタを使わない場合は、次のようにコーディングします。

IADORecordBinding   *picRs = NULL;
...
TESTHR(pRs->QueryInterface(
          __uuidof(IADORecordBinding), (LPVOID*)&picRs));
...
if (picRs) picRs->Release();

スマート ポインタを使う場合は、次のステートメントで IADORecordBinding インターフェイスから IADORecordBindingPtr 型を取得します。

_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));

そして、次のようにポインタをインスタンス化します。

IADORecordBindingPtr picRs(pRs);

Visual C++ Extensions は Recordset オブジェクトが実装するので、スマート ポインタのコンストラクタである picRs は _RecordsetPtr ポインタ pRs を使います。コンストラクタは、pRs を使って QueryInterface を呼び出し、IADORecordBinding インターフェイスを検索します。

// Visual C++ Extensions Example
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <icrsint.h>
_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));

inline void TESTHR(HRESULT _hr) { if FAILED(_hr) _com_issue_error(_hr); }

class CCustomRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CCustomRs)
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_ch_fname,
                        sizeof(m_ch_fname), m_ul_fnameStatus, false)
   ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_ch_lname,
                        sizeof(m_ch_lname), m_ul_lnameStatus, false)
END_ADO_BINDING()
public:
   CHAR    m_ch_fname[22];
   CHAR    m_ch_lname[32];
   ULONG   m_ul_fnameStatus;
   ULONG   m_ul_lnameStatus;
};

void main(void)
{
   ::CoInitialize(NULL);
   try
      {
      _RecordsetPtr pRs("ADODB.Recordset");
      CCustomRs rs;
      IADORecordBindingPtr picRs(pRs);

      pRs->Open("SELECT * FROM Employee ORDER BY lname",
         "dsn=pubs;uid=sa;pwd=;",
         adOpenStatic, adLockOptimistic, adCmdText);

      TESTHR(picRs->BindToRecordset(&rs));

      while (!pRs->EndOfFile)
         {
      // Process data in the CCustomRs C++ instance variables.
         printf("Name = %s %s\n",
            (rs.m_ul_fnameStatus == adFldOK ? rs.m_ch_fname: "<Error>"),
            (rs.m_ul_lnameStatus == adFldOK ? rs.m_ch_lname: "<Error>"));

      // Move to the next row of the Recordset.
      // Fields in the new row will automatically be
      // placed in the CCustomRs C++ instance variables.

         pRs->MoveNext();
         }
      }
   catch (_com_error &e )
      {
      printf("Error:\n");
      printf("Code = %08lx\n", e.Error());
      printf("Meaning = %s\n", e.ErrorMessage());
      printf("Source = %s\n", (LPCSTR) e.Source());
      printf("Description = %s\n", (LPCSTR) e.Description());
      }
   ::CoUninitialize();
}


ADO for Visual C++ の COM 構文インデックス

「ADO API リファレンス」では、Microsoft Visual Basic プログラミング言語を使って、ADO メソッドおよびプロパティ構文を記述しています。このインデックスを使って、Microsoft Visual C++ 準拠の「ADO API リファレンス」を比較参照できます。

アプリケーションで #import ディレクティブを使う場合、Microsoft Visual Basic に似た構文を使うためのヘッダー ファイルが生成されます。get_PropertyName および put_PropertyName のプロパティ名は、PropertyName の宣言として処理できます。この場合、プロパティは、関数としてではなくデータ メンバのように処理できます。

すべてのメソッド、プロパティ、およびイベントは HRESULT を返す関数です。これによって、関数の実行が成功したかどうかをテストできます。

Visual C++ のメソッドおよびプロパティの構文は、次の要素ごとに一覧になっています。

  • ADO コレクション

  • Command オブジェクト

  • Connection オブジェクト

  • Error オブジェクト

  • Field オブジェクト

  • Parameter オブジェクト

  • Record オブジェクト

  • Recordset オブジェクト

  • Stream オブジェクト


コレクション (ADO for Visual C++ 構文)

パラメータ

メソッド

AppendmdmthAppend(IDispatch *Object)

DeletemdmthColDelete(VARIANT Index)

RefreshmdmthADORefresh(void)

プロパティ

get_CountmdproCount(long *c)

get_ItemmdproItem(VARIANT Index, _ADOParameter **ppvObject)

フィールド

メソッド

AppendmdmthAppend(BSTR bstrName, DataTypeEnum Type, long DefinedSize,
            FieldAttributeEnum Attrib)

DeletemdmthColDeleteField(VARIANT Index)

RefreshmdmthADORefresh(void)

プロパティ

get_CountmdproCount(long *c)

get_ItemmdproItem(VARIANT Index, ADOField **ppvObject)

エラー

メソッド

ClearmdmthClear(void)

RefreshmdmthADORefresh(void)

プロパティ

get_CountmdproCount(long *c)

get_ItemmdproItem(VARIANT Index, ADOError **ppvObject)

プロパティ

メソッド

RefreshmdmthADORefresh(void)

プロパティ

get_CountmdproCount(long *c)

get_ItemmdproItem(VARIANT Index, ADOProperty **ppvObject)


Command (ADO for Visual C++ 構文)

メソッド

CancelmdmthADOCancel(void)

CreateParametermdmthCreateParam(BSTR Name, DataTypeEnum Type,
                        ParameterDirectionEnum Direction, long Size, VARIANT Value,
                        _ADOParameter **ppiprm)

ExecutemdmthCmdExecute(VARIANT *RecordsAffected, VARIANT *Parameters, long Options,
            _ADORecordset **ppirs)

プロパティ

get_ActiveConnectionmdproActiveCon(_ADOConnection **ppvObject)
put_ActiveConnection(VARIANT vConn)
putref_ActiveConnection(_ADOConnection *pCon)

get_CommandTextmdproCommandText(BSTR *pbstr)
put_CommandText(BSTR bstr)

get_CommandTimeoutmdproCommandTimeout(LONG *pl)
put_CommandTimeout(LONG Timeout)

get_CommandTypemdproCommandType(CommandTypeEnum *plCmdType)
put_CommandType(CommandTypeEnum lCmdType)

get_NamemdproName(BSTR *pbstrName)
put_Name(BSTR bstrName)

get_PreparedmdproPrepared(VARIANT_BOOL *pfPrepared)
put_Prepared(VARIANT_BOOL fPrepared)

get_StatemdproState(LONG *plObjState)

get_ParametersmdcolParameters(ADOParameters **ppvObject)


Connection (ADO for Visual C++ 構文)

メソッド

BeginTransmdmthBeginTrans(long *TransactionLevel)

CommitTransmdmthBeginTrans(void)

RollbackTransmdmthBeginTrans(void)

CancelmdmthADOCancel(void)

ClosemdmthClose(void)

ExecutemdmthCnnExecute(BSTR CommandText, VARIANT *RecordsAffected, long Options,
            _ADORecordset **ppiRset)

OpenmdmthCnnOpen(BSTR ConnectionString, BSTR UserID, BSTR Password, long Options)

OpenSchemamdmthOpenSchema(SchemaEnum Schema, VARIANT Restrictions, VARIANT SchemaID,
             _ADORecordset **pprset)

プロパティ

get_AttributesmdproAttributes(long *plAttr)
put_Attributes(long lAttr)

get_CommandTimeoutmdproCommandTimeout(LONG *plTimeout)
put_CommandTimeout(LONG lTimeout)

get_ConnectionStringmdproConnectionString(BSTR *pbstr)
put_ConnectionString(BSTR bstr)

get_ConnectionTimeoutmdproConnectionTimeout(LONG *plTimeout)
put_ConnectionTimeout(LONG lTimeout)

get_CursorLocationmdproCursorLocation(CursorLocationEnum *plCursorLoc)
put_CursorLocation(CursorLocationEnum lCursorLoc)

get_DefaultDatabasemdproDefaultDatabase(BSTR *pbstr)
put_DefaultDatabase(BSTR bstr)

get_IsolationLevelmdproIsolationLevel(IsolationLevelEnum *Level)
put_IsolationLevel(IsolationLevelEnum Level)

get_ModemdproMode(ConnectModeEnum *plMode)
put_Mode(ConnectModeEnum lMode)

get_ProvidermdproProvider(BSTR *pbstr)
put_Provider(BSTR Provider)

get_StatemdproState(LONG *plObjState)

get_VersionmdproVersion(BSTR *pbstr)

get_ErrorsmdcolErrors(ADOErrors **ppvObject)

イベント

BeginTransCompletemdevtBeginTransComplete(LONG TransactionLevel, ADOError *pError,
                        EventStatusEnum *adStatus, _ADOConnection *pConnection)

CommitTransCompletemdevtBeginTransComplete(ADOError *pError, EventStatusEnum *adStatus,
                        _ADOConnection *pConnection)

ConnectCompletemdevtConnectConnectionEvents(ADOError *pError, EventStatusEnum *adStatus,
                    _ADOConnection *pConnection)

DisconnectmdevtConnectConnectionEvents(EventStatusEnum *adStatus, _ADOConnection *pConnection)

ExecuteCompletemdevtExecuteComplete(LONG RecordsAffected, ADOError *pError,
                    EventStatusEnum *adStatus, _ADOCommand *pCommand,
                    _ADORecordset *pRecordset, _ADOConnection *pConnection)

InfoMessagemdevtInfoMessage(ADOError *pError, EventStatusEnum *adStatus,
                _ADOConnection *pConnection)

RollbackTransCompletemdevtBeginTransComplete(ADOError *pError, EventStatusEnum *adStatus,
                            _ADOConnection *pConnection)

WillConnectmdevtWillConnectEvent(BSTR *ConnectionString, BSTR *UserID, BSTR *Password,
                    long *Options, EventStatusEnum *adStatus,
                    _ADOConnection *pConnection)

WillExecutemdevtWillExecuteEvent(BSTR *Source, CursorTypeEnum *CursorType,
                    LockTypeEnum *LockType, long *Options,
                    EventStatusEnum *adStatus, _ADOCommand *pCommand,
                    _ADORecordset *pRecordset, _ADOConnection *pConnection)


Error (ADO for Visual C++ 構文)

プロパティ

get_DescriptionmdproDescription(BSTR *pbstr)

get_NativeErrormdproNativeError(long *pl)

get_NumbermdproNumber(long *pl)

get_SourcemdproErrSource(BSTR *pbstr)

get_SQLStatemdproSQLState(BSTR *pbstr)


Field (ADO for Visual C++ 構文)

メソッド

AppendChunkmdmthAppChunk(VARIANT Data)

GetChunkmdmthGetChunk(long Length, VARIANT *pvar)

プロパティ

get_ActualSizemdproActualSize(long *pl)

get_AttributesmdproAttributes(long *pl)
put_Attributes(long lAttributes)

get_DataFormat(IUnknown **ppiDF)
put_DataFormat(IUnknown *piDF)

get_DefinedSizemdproDefinedSize(long *pl)
put_DefinedSize(long lSize)

get_NamemdproName(BSTR *pbstr)

get_NumericScalemdproNumericScale(BYTE *pbNumericScale)
put_NumericScale(BYTE bScale)

get_OriginalValuemdproOriginalValue(VARIANT *pvar)

get_PrecisionmdproPrecision(BYTE *pbPrecision)
put_Precision(BYTE bPrecision)

get_TypemdproType(DataTypeEnum *pDataType)
put_Type(DataTypeEnum DataType)

get_UnderlyingValuemdproUnderlyingValue(VARIANT *pvar)

get_ValuemdproValue(VARIANT *pvar)
put_Value(VARIANT Val)


Parameter (ADO for Visual C++ 構文)

メソッド

AppendChunkmdmthAppChunk(VARIANT Val)

プロパティ

get_AttributesmdproAttributes(LONG *plParmAttribs)
put_Attributes(LONG lParmAttribs)

get_DirectionmdproDirection(ParameterDirectionEnum *plParmDirection)
put_Direction(ParameterDirectionEnum lParmDirection)

get_NamemdproName(BSTR *pbstr)
put_Name(BSTR bstr)

get_NumericScalemdproNumericScale(BYTE *pbScale)
put_NumericScale(BYTE bScale)

get_PrecisionmdproPrecision(BYTE *pbPrecision)
put_Precision(BYTE bPrecision)

get_SizemdproSize(long *pl)
put_Size(long l)

get_TypemdproType(DataTypeEnum *psDataType)
put_Type(DataTypeEnum sDataType)

get_ValuemdproValue(VARIANT *pvar)
put_Value(VARIANT val)


Record (ADO for Visual C++ 構文)

メソッド

CancelmdmthADOCancel(void)

ClosemdmthClose(void)

CopyRecordmdmthCopyRecord(BSTR Source, BSTR Destination, BSTR UserName, BSTR Password,
                CopyRecordOptionsEnum Options, VARIANT_BOOL Async, BSTR
                *pbstrNewURL)

DeleteRecordmdmthDeleteRecord(BSTR Source, VARIANT_BOOL Async)

GetChildrenmdmthGetChildrenMethodADO(_ADORecordset **ppRSet)

MoveRecordmdmthMoveRecord(BSTR Source, BSTR Destination, BSTR UserName, BSTR Password,
                MoveRecordOptionsEnum Options, VARIANT_BOOL Async, BSTR
                *pbstrNewURL)

OpenmdmthOpenRecord(VARIANT Source, VARIANT ActiveConnection, ConnectModeEnum Mode,
            RecordCreateOptionsEnum CreateOptions, RecordOpenOptionsEnum
            Options, BSTR UserName, BSTR Password)

プロパティ

get_ActiveConnectionmdproActiveCon(VARIANT *pvar)
put_ActiveConnection(BSTR bstrConn)
putref_ActiveConnection(_ADOConnection *Con)

get_FieldsmdcolFields(ADOFields **ppFlds)

get_ModemdproMode(ConnectModeEnum *pMode)
put_Mode(ConnectModeEnum Mode)

get_ParentURLmdproParentURL(BSTR *pbstrParentURL)

get_RecordTypemdproRecordTypeProperty(RecordTypeEnum *pType)

get_SourcemdproSourceRecord(VARIANT *pvar)
put_Source(BSTR Source)
putref_Source(IDispatch *Source)

get_StatemdproState(ObjectStateEnum *pState)


Recordset (ADO for Visual C++ 構文)

メソッド

AddNewmdmthAddNew(VARIANT FieldList, VARIANT Values)

CancelmdmthADOCancel(void)

CancelBatchmdmthCancelBatch(AffectEnum AffectRecords)

CancelUpdatemdmthCancelUpdate(void)

ClonemdmthClone(LockTypeEnum LockType, _ADORecordset **ppvObject)

ClosemdmthClose(void)

CompareBookmarksmdmthCompareBookmarks(VARIANT Bookmark1, VARIANT Bookmark2,
                            CompareEnum *pCompare)

DeletemdmthRstDelete(AffectEnum AffectRecords)

FindmdmthFindMethodADO(BSTR Criteria, LONG SkipRecords, SearchDirectionEnum SearchDirection,
        VARIANT Start)

GetRowsmdmthGetRows(long Rows, VARIANT Start, VARIANT Fields, VARIANT *pvar)

GetStringmdmthGetStringMethod(Recordset)ADO(StringFormatEnum StringFormat, long NumRows, BSTR ColumnDelimeter,
                BSTR RowDelimeter, BSTR NullExpr, BSTR *pRetString)

MovemdmthMove(long NumRecords, VARIANT Start)

MoveFirstmdmthMoveFirst(void)

MoveLastmdmthMoveFirst(void)

MoveNextmdmthMoveFirst(void)

MovePreviousmdmthMoveFirst(void)

NextRecordsetmdmthNextRec(VARIANT *RecordsAffected, _ADORecordset **ppiRs)

OpenmdmthRstOpen(VARIANT Source, VARIANT ActiveConnection, CursorTypeEnum CursorType,
            LockTypeEnum LockType, LONG Options)

RequerymdmthADORequery(LONG Options)

ResyncmdmthADOResync(AffectEnum AffectRecords, ResyncEnum ResyncValues)

SavemdmthRstSave(BSTR FileName, PersistFormatEnum PersistFormat)

SupportsmdmthSupports(CursorOptionEnum CursorOptions, VARIANT_BOOL *pb)

UpdatemdmthUpdate(VARIANT Fields, VARIANT Values)

UpdateBatchmdmthUpdateBatch(AffectEnum AffectRecords)

プロパティ

get_AbsolutePagemdproAbPage(PositionEnum *pl)
put_AbsolutePage(PositionEnum Page)

get_AbsolutePositionmdproAbPos(PositionEnum *pl)
put_AbsolutePosition(PositionEnum Position)

get_ActiveCommandmdproActiveCommand(IDispatch **ppCmd)

get_ActiveConnectionmdproActiveCon(VARIANT *pvar)
put_ActiveConnection(VARIANT vConn)
putref_ActiveConnection(IDispatch *pconn)

get_BOFmdproBOF(VARIANT_BOOL *pb)

get_BookmarkmdproBookmark(VARIANT *pvBookmark)
put_Bookmark(VARIANT vBookmark)

get_CacheSizemdproCacheSize(long *pl)
put_CacheSize(long CacheSize)

get_CursorLocationmdproCursorLocation(CursorLocationEnum *plCursorLoc)
put_CursorLocation(CursorLocationEnum lCursorLoc)

get_CursorTypemdproCursorType(CursorTypeEnum *plCursorType)
put_CursorType(CursorTypeEnum lCursorType)

get_DataMembermdproDataMember(BSTR *pbstrDataMember)
put_DataMember(BSTR bstrDataMember)

get_DataSourcemdproDataSource(IUnknown **ppunkDataSource)
putref_DataSource(IUnknown *punkDataSource)

get_EditModemdproEditMode(EditModeEnum *pl)

get_EOFmdproBOF(VARIANT_BOOL *pb)

get_FiltermdproFilter(VARIANT *Criteria)
put_Filter(VARIANT Criteria)

get_LockTypemdproLockType(LockTypeEnum *plLockType)
put_LockType(LockTypeEnum lLockType)

get_MarshalOptionsmdproMarshalOptions(MarshalOptionsEnum *peMarshal)
put_MarshalOptions(MarshalOptionsEnum eMarshal)

get_MaxRecordsmdproMaxRecords(long *plMaxRecords)
put_MaxRecords(long lMaxRecords)

get_PageCountmdproPageCount(long *pl)

get_PageSizemdproPageSize(long *pl)
put_PageSize(long PageSize)

get_RecordCountmdproRecordCount(long *pl)

get_SortmdproSortPropertyADO(BSTR *Criteria)
put_Sort(BSTR Criteria)

get_SourcemdproRstSource(VARIANT *pvSource)
put_Source(BSTR bstrConn)
putref_Source(IDispatch *pcmd)

get_StatemdproState(LONG *plObjState)

get_StatusmdproStatus(long *pl)

get_StayInSyncmdproStayInSync(VARIANT_BOOL *pbStayInSync)
put_StayInSync(VARIANT_BOOL bStayInSync)

get_FieldsmdcolFields(ADOFields **ppvObject)

イベント

EndOfRecordsetmdevtEndOfRecordset(VARIANT_BOOL *fMoreData, EventStatusEnum *adStatus,
                        _ADORecordset *pRecordset)

FetchCompletemdevtFetchComplete(ADOError *pError, EventStatusEnum *adStatus,
                        _ADORecordset *pRecordset)

FetchProgressmdevtFetchProgress(long Progress, long MaxProgress, EventStatusEnum *adStatus,
                        _ADORecordset *pRecordset)

FieldChangeCompletemdevtWillChangeField(LONG cFields, VARIANT Fields, ADOError *pError,
                        EventStatusEnum *adStatus, _ADORecordset *pRecordset)

MoveCompletemdevtWillMove(EventReasonEnum adReason, ADOError *pError,
                        EventStatusEnum *adStatus, _ADORecordset *pRecordset)

RecordChangeCompletemdevtWillChangeRecord(EventReasonEnum adReason, LONG cRecords,
                        ADOError *pError, EventStatusEnum *adStatus,
                        _ADORecordset *pRecordset)
RecordsetChangeCompletemdevtWillChangeRecordset(EventReasonEnum adReason, ADOError *pError,
                        EventStatusEnum *adStatus, _ADORecordset *pRecordset)

WillChangeFieldmdevtWillChangeField(LONG cFields, VARIANT Fields, EventStatusEnum *adStatus,
                        _ADORecordset *pRecordset)

WillChangeRecordmdevtWillChangeRecord(EventReasonEnum adReason, LONG cRecords,
                        EventStatusEnum *adStatus, _ADORecordset *pRecordset)

WillChangeRecordsetmdevtWillChangeRecordset(EventReasonEnum adReason, EventStatusEnum *adStatus,
                        _ADORecordset *pRecordset)

WillMovemdevtWillMove(EventReasonEnum adReason, EventStatusEnum *adStatus,
                        _ADORecordset *pRecordset)


Stream (ADO for Visual C++ 構文)

メソッド

CancelmdmthADOCancel(void)

ClosemdmthClose(void)

CopyTomdmthCopyTo(_ADOStream *DestStream, LONG CharNumber = -1)

FlushmdmthFlush(void)

LoadFromFilemdmthLoadFromFile(BSTR FileName)

OpenmdmthOpenStream(VARIANT Source, ConnectModeEnum Mode, StreamOpenOptionsEnum Options,
            BSTR UserName, BSTR Password)

ReadmdmthRead(long NumBytes, VARIANT *pVal)

ReadTextmdmthReadText(long NumChars, BSTR *pbstr)

SaveToFilemdmthSaveToFile(BSTR FileName, SaveOptionsEnum Options = adSaveCreateNotExist)

SetEOSmdmthSetEOS(void)

SkipLinemdmthSkipLine(void)

WritemdmthWrite(VARIANT Buffer)

WriteTextmdmthWriteText(BSTR Data, StreamWriteEnum Options = adWriteChar)

プロパティ

get_CharsetmdproCharSet(BSTR *pbstrCharset)
put_Charset(BSTR Charset)

get_EOSmdproEOS(VARIANT_BOOL *pEOS)

get_LineSeparatormdproLineSeparator(LineSeparatorEnum *pLS)
put_LineSeparator(LineSeparatorEnum LineSeparator)

get_ModemdproMode(ConnectModeEnum *pMode)
put_Mode(ConnectModeEnum Mode)

get_PositionmdproPosition(LONG *pPos)
put_Position(LONG Position)

get_SizemdproSizeStream(LONG *pSize)

get_StatemdproState(ObjectStateEnum *pState)

get_TypemdproTypeStream(StreamTypeEnum *pType)
put_Type(StreamTypeEnum Type)


ADO for Visual C++ 構文インデックス #import 付き

「ADO API リファレンス」では、Microsoft Visual Basic プログラミング言語を使って、ADO メソッドおよびプロパティの構文を記述しています。このインデックスを使って、Microsoft Visual C++ および #import ディレクティブ準拠の「ADO API リファレンス」を比較参照できます。

この特定のインデックスの抽出は、ADO .dll に #import ディレクティブを実行してプログラムをコンパイルしてから、生成される *.tlh ファイルを再フォーマットして行います。メソッド、プロパティ、およびイベントに関する情報のみが保持されます。プロパティごとに宣言される代替構文は、対応する "__declspec(property...)" ディレクティブによってリストされます。

詳細については、「Visual C++ ユーザーのための ADO マニュアルの読み方」を読むことをお勧めします。

#import ディレクティブを使った Visual C++ のメソッドとプロパティの構文は、次の要素ごとに一覧になっています。

  • ADO コレクション

  • Command オブジェクト

  • Connection オブジェクト

  • Error オブジェクト

  • Field オブジェクト

  • Parameter オブジェクト

  • Property オブジェクト

  • Record オブジェクト

  • Recordset オブジェクト

  • Stream オブジェクト

  • ConnectionEvents

  • RecordsetEvents


コレクション (Visual C++ 構文インデックス #import 付き)

コレクションが一定の共通メソッドおよびプロパティを継承することを知っていると便利です。

すべてのコレクションが、Count プロパティおよび Refresh メソッドを継承し、Item プロパティを追加します。Errors コレクションは Clear メソッドを追加します。Parameters コレクションは、Append メソッドおよび Delete メソッドを継承し、Fields コレクションは Append メソッド、Delete メソッド、および Update メソッドを追加します。

Properties コレクション

メソッド

HRESULT RefreshmdmthADORefresh( );

プロパティ

long GetCount( );
__declspec(property(get=GetCount)) long CountmdproCount;

PropertyPtr GetItem( const _variant_t & Index );
__declspec(property(get=GetItem)) PropertyPtr ItemmdproItem[];

Errors コレクション

メソッド

HRESULT ClearmdmthClear( );

HRESULT RefreshmdmthADORefresh( );

プロパティ

long GetCount( );
__declspec(property(get=GetCount)) long CountmdproCount;

PropertyPtr GetItem( const _variant_t & Index );
__declspec(property(get=GetItem)) PropertyPtr ItemmdproItem[];

Parameters コレクション

メソッド

HRESULT AppendmdmthAppend( IDispatch * Object );

HRESULT DeletemdmthColDelete( const _variant_t & Index );

HRESULT RefreshmdmthADORefresh( );

プロパティ

long GetCount( );
__declspec(property(get=GetCount)) long CountmdproCount;

PropertyPtr GetItem( const _variant_t & Index );
__declspec(property(get=GetItem)) PropertyPtr ItemmdproItem[];

Fields コレクション

メソッド

HRESULT AppendmdmthAppend( _bstr_t Name, enum DataTypeEnum Type, long DefinedSize,
    enum FieldAttributeEnum Attrib, const _variant_t & FieldValue =
    vtMissing );

HRESULT DeletemdmthColDeleteField( const _variant_t & Index );

HRESULT RefreshmdmthADORefresh( );

HRESULT UpdatemdmthUpdate( );

プロパティ

long GetCount( );
__declspec(property(get=GetCount)) long CountmdproCount;

PropertyPtr GetItem( const _variant_t & Index );
__declspec(property(get=GetItem)) PropertyPtr ItemmdproItem[];


Command (Visual C++ 構文インデックス #import 付き)

メソッド

HRESULT CancelmdmthADOCancel( );

_RecordsetPtr ExecutemdmthCmdExecute( VARIANT * RecordsAffected, VARIANT
    * Parameters, long Options );

_ParameterPtr CreateParametermdmthCreateParam( _bstr_t Name, enum
    DataTypeEnum Type, enum ParameterDirectionEnum Direction, long Size,
    const _variant_t & Value = vtMissing );

プロパティ

_ConnectionPtr GetActiveConnection( );
void PutRefActiveConnection( struct _Connection * ppvObject );
void PutActiveConnection( const _variant_t & ppvObject );
__declspec(property(get=GetActiveConnection,put=PutRefActiveConnection))
    _ConnectionPtr ActiveConnectionmdproActiveCon;

_bstr_t GetCommandText( );
void PutCommandText( _bstr_t pbstr );
__declspec(property(get=GetCommandText,put=PutCommandText)) _bstr_t
    CommandTextmdproCommandText;

long GetCommandTimeout( );
void PutCommandTimeout( long pl );
__declspec(property(get=GetCommandTimeout,put=PutCommandTimeout)) long
    CommandTimeoutmdproCommandTimeout;

void PutCommandType( enum CommandTypeEnum plCmdType );
enum CommandTypeEnum GetCommandType( );
__declspec(property(get=GetCommandType,put=PutCommandType)) enum
    CommandTypeEnum CommandTypemdproCommandType;

VARIANT_BOOL GetPrepared( );
void PutPrepared( VARIANT_BOOL pfPrepared );
__declspec(property(get=GetPrepared,put=PutPrepared)) VARIANT_BOOL
    PreparedmdproPrepared;

ParametersPtr GetParameters( );
__declspec(property(get=GetParameters)) ParametersPtr
    ParametersmdcolParameters;

_bstr_t GetName( );
void PutName( _bstr_t pbstrName );
__declspec(property(get=GetName,put=PutName)) _bstr_t NamemdproName;

long GetState( );
__declspec(property(get=GetState)) long StatemdproState;


Connection (Visual C++ 構文インデックス #import 付き)

メソッド

HRESULT CancelmdmthADOCancel( );

HRESULT ClosemdmthClose( );

_RecordsetPtr ExecutemdmthCnnExecute( _bstr_t CommandText, VARIANT *
    RecordsAffected,     long Options );

long BeginTransmdmthBeginTrans( );
HRESULT CommitTrans( );
HRESULT RollbackTrans( );

HRESULT OpenmdmthCnnOpen( _bstr_t ConnectionString, _bstr_t UserID,
    _bstr_t Password,     long Options );

_RecordsetPtr OpenSchemamdmthOpenSchema( enum SchemaEnum Schema, const
    _variant_t &     Restrictions = vtMissing, const _variant_t &
    SchemaID = vtMissing );

プロパティ

_bstr_t GetConnectionString( );
void PutConnectionString( _bstr_t pbstr );
__declspec(property(get=GetConnectionString,put=PutConnectionString))
    _bstr_t ConnectionStringmdproConnectionString;

long GetCommandTimeout( );
void PutCommandTimeout( long plTimeout );
__declspec(property(get=GetCommandTimeout,put=PutCommandTimeout)) long
    CommandTimeoutmdproCommandTimeout;

long GetConnectionTimeout( );
void PutConnectionTimeout( long plTimeout );
__declspec(property(get=GetConnectionTimeout,put=PutConnectionTimeout))
    long ConnectionTimeoutmdproConnectionTimeout;

_bstr_t GetVersion( );
__declspec(property(get=GetVersion)) _bstr_t VersionmdproVersion;

ErrorsPtr GetErrors( );
__declspec(property(get=GetErrors)) ErrorsPtr ErrorsmdcolErrors;

_bstr_t GetDefaultDatabase( );
void PutDefaultDatabase( _bstr_t pbstr );
__declspec(property(get=GetDefaultDatabase,put=PutDefaultDatabase))
    _bstr_t DefaultDatabasemdproDefaultDatabase;

enum IsolationLevelEnum GetIsolationLevel( );
void PutIsolationLevel( enum IsolationLevelEnum Level );
__declspec(property(get=GetIsolationLevel,put=PutIsolationLevel)) enum
    IsolationLevelEnum IsolationLevelmdproIsolationLevel;

long GetAttributes( );
void PutAttributes( long plAttr );
__declspec(property(get=GetAttributes,put=PutAttributes)) long
    AttributesmdproAttributes;

enum CursorLocationEnum GetCursorLocation( );
void PutCursorLocation( enum CursorLocationEnum plCursorLoc );
__declspec(property(get=GetCursorLocation,put=PutCursorLocation)) enum
    CursorLocationEnum CursorLocationmdproCursorLocation;

enum ConnectModeEnum GetMode( );
void PutMode( enum ConnectModeEnum plMode );
__declspec(property(get=GetMode,put=PutMode)) enum ConnectModeEnum
    ModemdproMode;

_bstr_t GetProvider( );
void PutProvider( _bstr_t pbstr );
__declspec(property(get=GetProvider,put=PutProvider)) _bstr_t
    ProvidermdproProvider;

long GetState( );
__declspec(property(get=GetState)) long StatemdproState;


Error (Visual C++ 構文インデックス #import 付き)

プロパティ

_bstr_t GetDescription( );
__declspec(property(get=GetDescription)) _bstr_t DescriptionmdproDescription;

long GetHelpContext( );
__declspec(property(get=GetHelpContext)) long HelpContextmdproHelpContext;

_bstr_t GetHelpFile( );
__declspec(property(get=GetHelpFile)) _bstr_t HelpFilemdproHelpContext;

long GetNativeError( );
__declspec(property(get=GetNativeError)) long NativeErrormdproNativeError;

long GetNumber( );
__declspec(property(get=GetNumber)) long NumbermdproNumber;

_bstr_t GetSource( );
__declspec(property(get=GetSource)) _bstr_t SourcemdproErrSource;

_bstr_t GetSQLState( );
__declspec(property(get=GetSQLState)) _bstr_t SQLStatemdproSQLState;


Field (Visual C++ 構文インデックス #import 付き)

メソッド

HRESULT AppendChunkmdmthAppChunk( const _variant_t & Data );

_variant_t GetChunkmdmthGetChunk( long Length );

プロパティ

long GetActualSize( );
__declspec(property(get=GetActualSize)) long ActualSizemdproActualSize;

long GetAttributes( );
void PutAttributes( long pl );
__declspec(property(get=GetAttributes,put=PutAttributes)) long     AttributesmdproAttributes;

IUnknownPtr GetDataFormat( );
void PutRefDataFormat( IUnknown * ppiDF );
__declspec(property(get=GetDataFormat,put=PutRefDataFormat)) IunknownPtr
    DataFormat;

long GetDefinedSize( );
void PutDefinedSize( long pl );
__declspec(property(get=GetDefinedSize,put=PutDefinedSize)) long
    DefinedSizemdproDefinedSize;

_bstr_t GetName( );
__declspec(property(get=GetName)) _bstr_t NamemdproName;

unsigned char GetNumericScale( );
void PutNumericScale( unsigned char pbNumericScale );
__declspec(property(get=GetNumericScale,put=PutNumericScale)) unsigned
    char NumericScalemdproNumericScale;

_variant_t GetOriginalValue( );
__declspec(property(get=GetOriginalValue)) _variant_t OriginalValuemdproOriginalValue;

unsigned char GetPrecision( );
void PutPrecision( unsigned char pbPrecision );
__declspec(property(get=GetPrecision,put=PutPrecision)) unsigned char
    PrecisionmdproPrecision;

enum DataTypeEnum GetType( );
void PutType( enum DataTypeEnum pDataType );
__declspec(property(get=GetType,put=PutType)) enum DataTypeEnum TypemdproType;

_variant_t GetUnderlyingValue( );
__declspec(property(get=GetUnderlyingValue)) _variant_t UnderlyingValuemdproUnderlyingValue;

_variant_t GetValue( );
void PutValue( const _variant_t & pvar );
__declspec(property(get=GetValue,put=PutValue)) _variant_t ValuemdproValue;


Parameter (Visual C++ 構文インデックス #import 付き)

メソッド

HRESULT AppendChunkmdmthAppChunk( const _variant_t & Val );

プロパティ

long GetAttributes( );
void PutAttributes( long plParmAttribs );
__declspec(property(get=GetAttributes,put=PutAttributes)) long
    AttributesmdproAttributes;

enum ParameterDirectionEnum GetDirection( );
void PutDirection( enum ParameterDirectionEnum plParmDirection );
__declspec(property(get=GetDirection,put=PutDirection)) enum
    ParameterDirectionEnum DirectionmdproDirection;

_bstr_t GetName( );
void PutName( _bstr_t pbstr );
__declspec(property(get=GetName,put=PutName)) _bstr_t NamemdproName;

unsigned char GetNumericScale( );
void PutNumericScale( unsigned char pbScale );
__declspec(property(get=GetNumericScale,put=PutNumericScale)) unsigned
    char NumericScalemdproNumericScale;

unsigned char GetPrecision( );
void PutPrecision( unsigned char pbPrecision );
__declspec(property(get=GetPrecision,put=PutPrecision)) unsigned char
    PrecisionmdproPrecision;

long GetSize( );
void PutSize( long pl );
__declspec(property(get=GetSize,put=PutSize)) long SizemdproSize;

enum DataTypeEnum GetType( );
void PutType( enum DataTypeEnum psDataType );
__declspec(property(get=GetType,put=PutType)) enum DataTypeEnum TypemdproType;

_variant_t GetValue( );
void PutValue( const _variant_t & pvar );
__declspec(property(get=GetValue,put=PutValue)) _variant_t ValuemdproValue;


Property (Visual C++ 構文インデックス #import 付き)

プロパティ

long GetAttributes( );
void PutAttributes( long plAttributes );
__declspec(property(get=GetAttributes,put=PutAttributes)) long
    AttributesadproAttributes;

_bstr_t GetName( );
__declspec(property(get=GetName)) _bstr_t NamemdproName;

enum DataTypeEnum GetType( );
__declspec(property(get=GetType)) enum DataTypeEnum TypemdproType;

_variant_t GetValue( );
void PutValue( const _variant_t & pval );
__declspec(property(get=GetValue,put=PutValue)) _variant_t ValuemdproValue;


Record (Visual C++ 構文インデックス #import 付き)

メソッド

HRESULT CancelmdmthADOCancel( );

HRESULT ClosemdmthClose( );

_bstr_t CopyRecordmdmthCopyRecord( _bstr_t Source, _bstr_t Destination,
    _bstr_t     UserName, _bstr_t Password, enum CopyRecordOptionsEnum
    Options,     VARIANT_BOOL Async );

HRESULT DeleteRecordmdmthDeleteRecord( _bstr_t Source, VARIANT_BOOL Async );

_RecordsetPtr GetChildrenmdmthGetChildrenMethodADO( );

_bstr_t MoveRecordmdmthMoveRecord( _bstr_t Source, _bstr_t Destination,
    _bstr_t     UserName, _bstr_t Password, enum MoveRecordOptionsEnum
    Options,     VARIANT_BOOL Async );

HRESULT OpenmdmthOpenRecord( const _variant_t & Source, const _variant_t
&     ActiveConnection, enum ConnectModeEnum Mode, enum
    RecordCreateOptionsEnum CreateOptions, enum RecordOpenOptionsEnum
    Options, _bstr_t UserName, _bstr_t Password );

プロパティ

_variant_t GetActiveConnectionmdproActiveCon( );
void PutActiveConnection( _bstr_t pvar );
void PutRefActiveConnection( struct _Connection * pvar );

FieldsPtr GetFields( );
__declspec(property(get=GetFields)) FieldsPtr FieldsmdcolFields;

enum ConnectModeEnum GetMode( );
void PutMode( enum ConnectModeEnum pMode );
__declspec(property(get=GetMode,put=PutMode)) enum ConnectModeEnum ModemdproMode;

_bstr_t GetParentURL( );
__declspec(property(get=GetParentURL)) _bstr_t ParentURLmdproParentURL;

enum RecordTypeEnum GetRecordType( );
__declspec(property(get=GetRecordType)) enum RecordTypeEnum
    RecordTypemdproRecordTypeProperty;

_variant_t GetSourcemdproSourceRecord( );
void PutSource( _bstr_t pvar );
void PutRefSource( IDispatch * pvar );

enum ObjectStateEnum GetState( );
__declspec(property(get=GetState)) enum ObjectStateEnum StatemdproState;


Recordset (Visual C++ 構文インデックス #import 付き)

メソッド

HRESULT AddNewmdmthAddNew( const _variant_t & FieldList = vtMissing,
    const     _variant_t & Values = vtMissing );

HRESULT CancelmdmthADOCancel( );

HRESULT CancelBatchmdmthCancelBatch( enum AffectEnum AffectRecords );

HRESULT CancelUpdatemdmthCancelUpdate( );

_RecordsetPtr ClonemdmthClone( enum LockTypeEnum LockType );

HRESULT ClosemdmthClose( );

enum CompareEnum CompareBookmarksmdmthCompareBookmarks( const _variant_t
    & Bookmark1, const     _variant_t & Bookmark2 );

HRESULT DeletemdmthRstDelete( enum AffectEnum AffectRecords );

HRESULT FindmdmthFindMethodADO( _bstr_t Criteria, long SkipRecords, enum
    SearchDirectionEnum SearchDirection, const _variant_t & Start =
    vtMissing );

_variant_t GetRowsmdmthGetRows( long Rows, const _variant_t & Start =
    vtMissing, const _variant_t & Fields = vtMissing );

_bstr_t GetStringmdmthGetStringMethod(Recordset)ADO( enum
    StringFormatEnum StringFormat, long NumRows,     _bstr_t
    ColumnDelimeter, _bstr_t RowDelimeter, _bstr_t NullExpr );

HRESULT MovemdmthMove( long NumRecords, const _variant_t & Start =
    vtMissing );

HRESULT MoveFirstmdmthMoveFirst( );
HRESULT MoveLast( );
HRESULT MoveNext( );
HRESULT MovePrevious( );

_RecordsetPtr NextRecordsetmdmthNextRec( VARIANT * RecordsAffected );

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

HRESULT RequerymdmthADORequery( long Options );

HRESULT UpdatemdmthUpdate( const _variant_t & Fields = vtMissing, const
    _variant_t &     Values = vtMissing );

HRESULT UpdateBatchmdmthUpdateBatch( enum AffectEnum AffectRecords );

HRESULT ResyncmdmthADOResync( enum AffectEnum AffectRecords, enum
    ResyncEnum     ResyncValues );

HRESULT SavemdmthRstSave( const _variant_t & Destination, enum
    PersistFormatEnum     PersistFormat );

HRESULT SeekmdmthSeek( const _variant_t & KeyValues, enum SeekEnum
    SeekOption );

VARIANT_BOOL SupportsmdmthSupports( enum CursorOptionEnum CursorOptions );

プロパティ

enum PositionEnum GetAbsolutePage( );
void PutAbsolutePage( enum PositionEnum pl );
__declspec(property(get=GetAbsolutePage,put=PutAbsolutePage)) enum
    PositionEnum AbsolutePagemdproAbPage;

enum PositionEnum GetAbsolutePosition( );
void PutAbsolutePosition( enum PositionEnum pl );
__declspec(property(get=GetAbsolutePosition,put=PutAbsolutePosition))
    enum PositionEnum AbsolutePositionmdproAbPos;

IDispatchPtr GetActiveCommand( );
__declspec(property(get=GetActiveCommand)) IDispatchPtr ActiveCommandmdproActiveCommand;

void PutRefActiveConnectionmdproActiveCon( IDispatch * pvar );
void PutActiveConnection( const _variant_t & pvar );
_variant_t GetActiveConnection( );

enum CursorLocationEnum GetCursorLocation( );
void PutCursorLocation( enum CursorLocationEnum plCursorLoc );
__declspec(property(get=GetCursorLocation,put=PutCursorLocation)) enum
    CursorLocationEnum CursorLocationmdproCursorLocation;

VARIANT_BOOL GetBOF( );
__declspec(property(get=GetBOF)) VARIANT_BOOL BOFmdproBOF;

VARIANT_BOOL GetEndOfFile( ); // Actually, GetEOF. Renamed in #import.
__declspec(property(get=GetEndOfFile)) VARIANT_BOOL EndOfFilemdproBOF;

_variant_t GetBookmark( );
void PutBookmark( const _variant_t & pvBookmark );
__declspec(property(get=GetBookmark,put=PutBookmark)) _variant_t
    BookmarkmdproBookmark;

long GetCacheSize( );
void PutCacheSize( long pl );
__declspec(property(get=GetCacheSize,put=PutCacheSize)) long
    CacheSizemdproCacheSize;

enum CursorTypeEnum GetCursorType( );
void PutCursorType( enum CursorTypeEnum plCursorType );
__declspec(property(get=GetCursorType,put=PutCursorType)) enum
    CursorTypeEnum CursorTypemdproCursorType;

_bstr_t GetDataMember( );
void PutDataMember( _bstr_t pbstrDataMember );
__declspec(property(get=GetDataMember,put=PutDataMember)) _bstr_t
    DataMembermdproDataMember;

IUnknownPtr GetDataSource( );
void PutRefDataSource( IUnknown * ppunkDataSource );
__declspec(property(get=GetDataSource,put=PutRefDataSource)) IUnknownPtr
    DataSourcemdproDataSource;

enum EditModeEnum GetEditMode( );
__declspec(property(get=GetEditMode)) enum EditModeEnum EditModemdproEditMode;

FieldsPtr GetFields( );
__declspec(property(get=GetFields)) FieldsPtr FieldsmdcolFields;

_variant_t GetFilter( );
void PutFilter( const _variant_t & Criteria );
__declspec(property(get=GetFilter,put=PutFilter)) _variant_t FiltermdproFilter;

_bstr_t GetIndex( );
void PutIndex( _bstr_t pbstrIndex );
__declspec(property(get=GetIndex,put=PutIndex)) _bstr_t IndexmdproIndex;

enum LockTypeEnum GetLockType( );
void PutLockType( enum LockTypeEnum plLockType );
__declspec(property(get=GetLockType,put=PutLockType)) enum LockTypeEnum
    LockTypemdproLockType;

enum MarshalOptionsEnum GetMarshalOptions( );
void PutMarshalOptions( enum MarshalOptionsEnum peMarshal );
__declspec(property(get=GetMarshalOptions,put=PutMarshalOptions)) enum
    MarshalOptionsEnum MarshalOptionsmdproMarshalOptions;

long GetMaxRecords( );
void PutMaxRecords( long plMaxRecords );
__declspec(property(get=GetMaxRecords,put=PutMaxRecords)) long
    MaxRecordsmdproMaxRecords;

long GetPageCount( );
__declspec(property(get=GetPageCount)) long PageCountmdproPageCount;

long GetPageSize( );
void PutPageSize( long pl );
__declspec(property(get=GetPageSize,put=PutPageSize)) long PageSizemdproPageSize;

long GetRecordCount( );
__declspec(property(get=GetRecordCount)) long RecordCountmdproRecordCount;

_bstr_t GetSort( );
void PutSort( _bstr_t Criteria );
__declspec(property(get=GetSort,put=PutSort)) _bstr_t SortmdproSortPropertyADO;

void PutRefSourcemdproRstSource( IDispatch * pvSource );
void PutSource( _bstr_t pvSource );
_variant_t GetSource( );

long GetState( );
__declspec(property(get=GetState)) long StatemdproState;

long GetStatus( );
__declspec(property(get=GetStatus)) long StatusmdproStatus;

VARIANT_BOOL GetStayInSync( );
void PutStayInSync( VARIANT_BOOL pbStayInSync );
__declspec(property(get=GetStayInSync,put=PutStayInSync)) VARIANT_BOOL
    StayInSyncmdproStayInSync;


Stream (Visual C++ 構文インデックス #import 付き)

メソッド

HRESULT CancelmdmthADOCancel( );

HRESULT ClosemdmthClose( );

HRESULT CopyTomdmthCopyTo( struct _Stream * DestStream, int CharNumber );

HRESULT FlushmdmthFlush( );

HRESULT LoadFromFilemdmthLoadFromFile( _bstr_t FileName );

HRESULT OpenmdmthOpenStream( const _variant_t & Source, enum
    ConnectModeEnum Mode, enum     StreamOpenOptionsEnum Options, _bstr_t
    UserName, _bstr_t Password );

_variant_t ReadmdmthRead( long NumBytes );

_bstr_t ReadTextmdmthReadText( long NumChars );

HRESULT SaveToFilemdmthSaveToFile( _bstr_t FileName, enum SaveOptionsEnum
    Options );

HRESULT SetEOSmdmthSetEOS( );

HRESULT SkipLinemdmthSkipLine( );

HRESULT WritemdmthWrite( const _variant_t & Buffer );

HRESULT WriteTextmdmthWriteText( _bstr_t Data, enum StreamWriteEnum
    Options );

プロパティ

_bstr_t GetCharset( );
void PutCharset( _bstr_t pbstrCharset );
__declspec(property(get=GetCharset,put=PutCharset)) _bstr_t CharsetmdproCharSet;

VARIANT_BOOL GetEOS( );
__declspec(property(get=GetEOS)) VARIANT_BOOL EOSmdproEOS;

enum LineSeparatorEnum GetLineSeparator( );
void PutLineSeparator( enum LineSeparatorEnum pLS );
__declspec(property(get=GetLineSeparator,put=PutLineSeparator)) enum
    LineSeparatorEnum LineSeparatormdproLineSeparator;

enum ConnectModeEnum GetMode( );
void PutMode( enum ConnectModeEnum pMode );
__declspec(property(get=GetMode,put=PutMode)) enum ConnectModeEnum ModemdproMode;

long GetPosition( );
void PutPosition( long pPos );
__declspec(property(get=GetPosition,put=PutPosition)) long PositionmdproPosition;

long GetSize( );
__declspec(property(get=GetSize)) long SizemdproSizeStream;

enum ObjectStateEnum GetState( );
__declspec(property(get=GetState)) enum ObjectStateEnum StatemdproState;

enum StreamTypeEnum GetType( );
void PutType( enum StreamTypeEnum ptype );
__declspec(property(get=GetType,put=PutType)) enum StreamTypeEnum TypemdproTypeStream;


ConnectionEvents (Visual C++ 構文インデックス #import 付き)

イベント

HRESULT InfoMessagemdevtInfoMessage( struct Error * pError, enum
    EventStatusEnum *     adStatus, struct _Connection * pConnection );

HRESULT BeginTransCompletemdevtBeginTransComplete( long TransactionLevel,
    struct Error * pError, enum EventStatusEnum * adStatus, struct
    _Connection * pConnection );

HRESULT CommitTransCompletemdevtBeginTransComplete( struct Error *
    pError, enum EventStatusEnum     * adStatus, struct _Connection *
    pConnection );

HRESULT RollbackTransCompletemdevtBeginTransComplete( struct Error *
    pError, enum     EventStatusEnum * adStatus, struct _Connection *
    pConnection );

HRESULT WillExecutemdevtWillExecuteEvent( BSTR * Source, enum
    CursorTypeEnum * CursorType,
    enum LockTypeEnum * LockType, long * Options, enum EventStatusEnum *
    adStatus, struct _Command * pCommand, struct _Recordset * pRecordset,
    struct _Connection * pConnection );

HRESULT ExecuteCompletemdevtExecuteComplete( long RecordsAffected, struct
    Error * pError,     enum EventStatusEnum * adStatus, struct _Command
    * pCommand, struct     _Recordset * pRecordset, struct _Connection *
    pConnection );

HRESULT WillConnectmdevtWillConnectEvent( BSTR * ConnectionString, BSTR *
    UserID, BSTR *     Password, long * Options, enum EventStatusEnum *
    adStatus, struct     _Connection * pConnection );

HRESULT ConnectCompletemdevtConnectConnectionEvents( struct Error *
    pError, enum EventStatusEnum *     adStatus, struct _Connection *
    pConnection );

HRESULT DisconnectmdevtConnectConnectionEvents( enum EventStatusEnum *
    adStatus, struct _Connection *     pConnection );


RecordsetEvents (Visual C++ 構文インデックス #import 付き)

イベント

HRESULT WillChangeFieldmdevtWillChangeField( long cFields, const
    _variant_t & Fields, enum     EventStatusEnum * adStatus, struct
    _Recordset * pRecordset );

HRESULT FieldChangeCompletemdevtWillChangeField( long cFields, const
    _variant_t & Fields,     struct Error * pError, enum EventStatusEnum
    * adStatus, struct     _Recordset * pRecordset );

HRESULT WillChangeRecordmdevtWillChangeRecord( enum EventReasonEnum
    adReason, long cRecords,     enum EventStatusEnum * adStatus, struct
    _Recordset * pRecordset );

HRESULT RecordChangeCompletemdevtWillChangeRecord( enum EventReasonEnum
    adReason, long     cRecords, struct Error * pError, enum
    EventStatusEnum * adStatus,     struct _Recordset * pRecordset );

HRESULT WillChangeRecordsetmdevtWillChangeRecordset( enum EventReasonEnum
    adReason, enum     EventStatusEnum * adStatus, struct _Recordset *
    pRecordset );

HRESULT RecordsetChangeCompletemdevtWillChangeRecordset( enum
    EventReasonEnum adReason, struct     Error * pError, enum
    EventStatusEnum * adStatus, struct _Recordset *     pRecordset );

HRESULT WillMovemdevtWillMove( enum EventReasonEnum adReason, enum
    EventStatusEnum *     adStatus, struct _Recordset * pRecordset );

HRESULT MoveCompletemdevtWillMove( enum EventReasonEnum adReason, struct
    Error *     pError, enum EventStatusEnum * adStatus, struct
    _Recordset * pRecordset );

HRESULT EndOfRecordsetmdevtEndOfRecordset( VARIANT_BOOL * fMoreData, enum
    EventStatusEnum *     adStatus, struct _Recordset * pRecordset );

HRESULT FetchProgressmdevtFetchProgress( long Progress, long MaxProgress,
    enum     EventStatusEnum * adStatus, struct _Recordset * pRecordset );

HRESULT FetchCompletemdevtFetchComplete( struct Error * pError, enum
    EventStatusEnum *     adStatus, struct _Recordset * pRecordset );


Microsoft Visual J++ での ADO の使用

Microsoft Visual J++ を使って次の方法で ADO を実装できます。

  • Visual J++ 6.0 (またはそれ以降のバージョン) では、ADO for Windows Foundation Classes を使います。

  • Visual J++ 1.x では、Java タイプ ライブラリ ウィザードを使います。

  • Microsoft SDK for Java ユーティリティを使います。

Visual J++ で ADO を使う場合は、次のトピックを参照してください。

  • ADO Java クラス ラッパー

  • ADO/WFC 構文インデックス


ADO/WFO (ADO for Windows Foundation Classes)

ADO/WFC (ADO for Windows Foundation Classes)

Microsoft Visual J++ 6.0 の場合、ADO は、WFC (Windows Foundation Classes) と共に機能するように、次のように拡張されました。まず、Java クラス セットが実装されて ADO インターフェイスが拡張され、Java プログラマに役立つメッセージが追加されました。また、Java クラスでは、Java 型をユーザーに返す関数も公開します。パフォーマンスを向上させるため、Java クラスは、OLE DB 行セット オブジェクトのネイティブ データ型に直接アクセスし、初めにバリアントへ、またはバリアントからの変換を行わずに Java 型として Java プログラマに返します。ADO は、WFC フレームワークのイベント通知でも機能するように拡張されました。

ADO/WFC (ADO for Windows Foundation Classes) は、標準の ADO のメソッド、プロパティ、オブジェクト、およびイベントをすべてサポートしています。ただし、パラメータとしてバリアント型 (Variant) を必要とし、Microsoft Visual Basic などの言語で高いパフォーマンスを示すような操作を、Visual J++ などの言語で実行するとパフォーマンスが低下します。そのため、ADO/WFC では、Field オブジェクトで、バリアント型 (Variant) のデータではなくネイティブな Java データ型を使うアクセス機能を用意しています。

ADO/WFC パッケージの詳細については、ADO のマニュアルの「ADO/WFC 構文インデックス」を参照してください。

Visual J++ マニュアルの場合の詳細については、「Converting Visual Basic ADO Examples to Visual J++」を参照してください。


Java タイプ ライブラリ ウィザードでの ADO の使用

Java タイプ ライブラリ ウィザードは、Visual J++ 1.x の機能であり、開発環境の [ツール] メニューに統合されています。Java タイプ ライブラリ ウィザードを使って、タイプ ライブラリを検索し、COM オブジェクトにアクセスするための Java インターフェイスを作成することができます。Visual J++ 6.0 の場合、Java タイプ ライブラリ ウィザードは ADO for Windows Foundation Classes に置き換えられます。

Java タイプ ライブラリ ウィザードでは、Microsoft SDK for Java に組み込まれているコマンド行ツールと同様の結果を得ることができます。ただし、Microsoft SDK for Java で生成されるクラス ラッパーとは異なり、ウィザードが生成するクラス ラッパーを修正することはできません。

Java タイプ ライブラリ ウィザードは \<windows directory>\Java\trustlib\msado15 にクラスを生成します。クラスが生成されるディレクトリにある Summary.txt ファイルで、生成されたクラス定義を確認できます。

Java タイプ ライブラリ ウィザードは、所定のタイプ ライブラリにある列挙型を INT (整数) 型に変換します。また、タイプ ライブラリの各列挙型に対応するインターフェイスも定義します。ADO 列挙型の値は、次の構文で参照できます。

msado15.<Enum Name>.<constant Name>

次のコードの一部は、Command オブジェクトの CommandType プロパティを設定する例です。

Cmd1.putCommandType( msado15.CommandTypeEnum.adCmdStoredProc );

また、Java タイプ ライブラリ ウィザードが生成する列挙型ラッパーから継承することもできます。その場合、構文から "msado15." を削除します。ただし、すべての ADO オブジェクトと列挙値の前で msado15.* を参照しない場合、クラスは、その参照先の各 Java オブジェクトと列挙型インターフェイスから継承する必要があります。

その他のコード例については、「ADO Java クラス ラッパー」を参照してください。

Visual J++ version 1.x から Java タイプ ライブラリ ウィザードを実行するには

  1. [ツール] メニューで、[Java タイプ ライブラリ ウィザード] をクリックします。

  2. 一覧から [Microsoft ActiveX Data Objects ライブラリ] を選択し、[OK] をクリックします。新しく ADO の \trustlib ディレクトリ (既定で c:\winnt\java\trustlib\msado15) にファイルが生成されます。Microsoft SDK for Java を使って ADO のクラスを生成してある場合は、Java タイプ ライブラリ ウィザードが生成したクラスに置き換わります。

  3. これらのファイルを使うには、Visual J++ でプロジェクトを開きます。[プロジェクト] メニューの [プロジェクトに追加] をクリックします。[ファイル] を選択し、\trustlib ディレクトリ (既定で c:\winnt\java\trustlib\msado15) に生成されたすべての .JAVA ファイルをプロジェクトに追加します。


Microsoft SDK for Java での ADO の使用

Microsoft SDK for Java は、Microsoft Internet Explorer 環境用の開発キットです。用意されたツール、情報、およびサンプルは、JDK 1.1 と Microsoft Win32® 仮想マシン (Microsoft VM) 準拠の Java プログラムやアプレットの作成に役立ちます。Microsoft SDK for Java は、Microsoft Visual J++ に含まれておらず、http://www.microsoft.com/Java からダウンロードできます。

Jactivex.exe ユーティリティではタイプ ライブラリからクラスが生成されますが、コマンド ラインからのみ実行できます。この機能は、Visual J++ 開発環境に統合されていません。Java タイプ ライブラリ ウィザードで生成されるクラスと異なり、SDK で作成されたクラス ラッパーは修正することができます。そのため、コード内で ADO ラッパー クラスがどのように使われているかをデバッグするときに便利です。

この機能では、ADO タイプ ライブラリが読み取られ、アプリケーション内でインスタンス化できるクラスが生成されます。これらのクラスは、\<windows directory>\Java\trustlib\msado15 に生成されます。

Microsoft SDK for Java を使って ADO アプリケーションを Java で作成する方法は、ソース コードから見ると、Java タイプ ライブラリ ウィザードを使用する方法と基本的に同じです。コード例については、「ADO Java クラス ラッパー」を参照してください。次に示すように、唯一の大きな違いは、最初にラッパー クラスが生成される方法です。

Microsoft SDK for Java を使って ADO プロジェクトを作成するには

  1. コマンド プロンプトから次のように実行します。Microsoft SDK for Java Bin ディレクトリを含むパスを設定するか、またはその場所からコマンドを実行します。一般に、Microsoft SDK for Java は Visual Studio と同じ場所にインストールされます。これは 1 つのコマンド ステートメントです。
    \<path to DevStudio>\<path to Java SDK>\bin\JactiveX.exe /javatlb "C:\program files\common files\system\ado\msado15.dll"
  2. 次のコマンドを実行して生成されたクラスをコンパイルします。Java シンボルを追跡できるように、/g:t スイッチでデバッグ シンボルの生成がオンになります。リリース ビルドでは、これを削除します。
    jvc /g:t c:\<windows>\Java\trustlib\msado15\*.Java
  3. これらのファイルを使うには、Visual J++ でプロジェクトを開きます。[プロジェクト] メニューの [プロジェクトに追加] をクリックします。[ファイル] を選択し、trustlib\msado15 ディレクトリに生成されたすべての .JAVA ファイルをプロジェクトに追加します。


ADO Java クラス ラッパー

このコードは、ADO Recordset クラス ラッパーのインスタンスを宣言し、すべて同じコード行で初期化します。また、LockType と CursorType など Open メソッドの各引数の変数を宣言します (Java が列挙型をサポートしないため)。Recordset オブジェクトを開いて閉じます。Rs1 を Null に設定する操作は、単に Java のシステムが定期的に未使用のオブジェクトを解放するときに、この変数が解放されるようにスケジュールすることを意味します。

public static void main( String args[])
{
    msado15._Recordset   Rs1 = new msado15.Recordset();
    Variant Source     = new Variant( "SELECT * FROM Authors" );
    Variant Connect    = new Variant( "DSN=AdoDemo;UID=admin;PWD=;" );
    int     LockType   = msado15.CursorTypeEnum.adOpenForwardOnly;
    int     CursorType = msado15.LockTypeEnum.adLockReadOnly;
    int     Options    = -1;

    Rs1.Open( Source, Connect, LockType,  CursorType, Options );
    Rs1.Close();
    Rs1 = null;

    System.out.println( "Success!\n" );
}


ADO/WFC 構文インデックス

「ADO API リファレンス」では、Microsoft Visual Basic プログラミング言語を使って、ADO メソッドとプロパティ構文を記述しています。このインデックスを使って、Microsoft Visual J++ と ADO for Windows Foundation Classes (ADO/WFC) に準拠した、「ADO API リファレンス」のトピックを相互参照できます。構文に違いがあった場合は、言語リファレンスの構文一覧ではなく、このインデックスの中の関数シグネチャを使ってください。

次の要素のメソッドとプロパティの構文を一覧として示します。

ActiveX データ オブジェクト

  • ADO コレクション

  • Command オブジェクト

  • Connection オブジェクト

  • Error オブジェクト

  • Field オブジェクト

  • Parameter オブジェクト

  • Recordset オブジェクト

RDS

  • DataSpace

  • ObjectProxy


コレクション (ADO/WFC 構文)

package com.ms.wfc.data

パラメータ

メソッド

public void appendmdmthAppend(com.ms.wfc.data.Parameter param)
public void deletemdmthColDelete(int n)
public void delete(String s)
public void refreshmdmthADORefresh()
public Parameter getItemmdproItem(int n)
public Parameter getItem(String s)

プロパティ

public int getCountmdproCount()

フィールド

メソッド

public void appendmdmthAppend(String name, int type)
public void append(String name, int type, int definedSize)
public void append(String name, int type, int definedSize, int attrib)
public void deletemdmthColDeleteField(int n)
public void delete(String s)
public void refreshmdmthADORefresh()
public com.ms.wfc.data.Field getItemmdproItem(int n)
public com.ms.wfc.data.Field getItem(String s)

プロパティ

public int getCountmdproCount()

エラー

メソッド

public void clearmdmthClear()
public void refreshmdmthADORefresh()
public com.ms.wfc.data.Error getItemmdproItem(int n)
public com.ms.wfc.data.Error getItem(String s)

プロパティ

public int getCountmdproCount()


Command (ADO/WFC 構文)

package com.ms.wfc.data

コンストラクタ

public CommandmdobjCommand()
public Command(String commandtext)

メソッド

public void cancelmdmthADOCancel()
public com.ms.wfc.data.Parameter createParametermdmthCreateParam(String
    Name, int Type, int Direction, int Size, Object Value)
public Recordset executemdmthCmdExecute()
public Recordset execute(Object[] parameters)
public Recordset execute(Object[] parameters, int options)
public int executeUpdatemdmthCmdExecute(Object[] parameters)
public int executeUpdate(Object[] parameters, int options)
public int executeUpdate()

executeUpdate メソッドは、特定のパラメータを使用して、基になる ADO execute メソッドを呼び出す特殊なメソッドです。executeUpdate メソッドは Recordset オブジェクトの返りをサポートしていないので、execute メソッドの options パラメータは、AdoEnums.ExecuteOptions.NORECORDS で変更されます。execute メソッドが終了すると、その更新された RecordsAffected パラメータが executeUpdate メソッドに戻り、最後は int として返ります。

プロパティ

public com.ms.wfc.data.Connection getActiveConnectionmdproActiveCon()
public void setActiveConnection(com.ms.wfc.data.Connection con)
public void setActiveConnection(String conString)
public String getCommandTextmdproCommandText()
public void setCommandText(String command)
public int getCommandTimeoutmdproCommandTimeout()
public void setCommandTimeout(int timeout)
public int getCommandTypemdproCommandType()
public void setCommandType(int type)
public String getNamemdproName()
public void setName(String name)
public boolean getPreparedmdproPrepared()
public void setPrepared(boolean prepared)
public int getStatemdproState()
public com.ms.wfc.data.Parameter getParametermdobjParameter(int n)
public com.ms.wfc.data.Parameter getParameter(String n)
public com.ms.wfc.data.Parameters getParametersmdcolParameters()
public AdoProperties getPropertiesmdcolProperties()


Connection (ADO/WFC 構文)

package com.ms.wfc.data

コンストラクタ

public ConnectionmdobjConnection()
public Connection(String connectionstring)

メソッド

public int beginTransmdmthBeginTrans()
public void commitTransmdmthBeginTrans()
public void rollbackTransmdmthBeginTrans()
public void cancelmdmthADOCancel()
public void closemdmthClose()
public com.ms.wfc.data.Recordset executemdmthCnnExecute(String commandText)
public com.ms.wfc.data.Recordset execute(String commandText, int options)
public int executeUpdatemdmthcnnExecute(String commandText)
public int executeUpdate(String commandText, int options)

executeUpdate メソッドは、特定のパラメータを使用して、基になる ADO execute メソッドを呼び出す特殊なメソッドです。executeUpdate メソッドは Recordset オブジェクトの返りをサポートしていないので、execute メソッドの options パラメータは、AdoEnums.ExecuteOptions.NORECORDS で変更されます。execute メソッドが終了すると、その更新された RecordsAffected パラメータが executeUpdate メソッドに戻り、最後は int として返ります。

public void openmdmthCnnOpen()
public void open(String connectionString)
public void open(String connectionString, String userID)
public void open(String connectionString, String userID, String password)
public void open(String connectionString, String userID, String password, int options)
public Recordset openSchemamdmthOpenSchema(int schema, Object[]
    restrictions, String schemaID)
public Recordset openSchema(int schema)
public Recordset openSchema(int schema, Object[] restrictions)

プロパティ

public int getAttributesmdproAttributes()
public void setAttributes(int attr)
public int getCommandTimeoutmdproCommandTimeout()
public void setCommandTimeout(int timeout)
public String getConnectionStringmdproConnectionString()
public void setConnectionString(String con)
public int getConnectionTimeoutmdproConnectionTimeout()
public void setConnectionTimeout(int timeout)
public int getCursorLocationmdproCursorLocation()
public void setCursorLocation(int cursorLoc)
public String getDefaultDatabasemdproDefaultDatabase()
public void setDefaultDatabase(String db)
public int getIsolationLevelmdproIsolationLevel()
public void setIsolationLevel(int level)
public int getModemdproMode()
public void setMode(int mode)
public String getProvidermdproProvider()
public void setProvider(String provider)
public int getStatemdproState()
public String getVersionmdproVersion()
public AdoProperties getPropertiesmdcolProperties()
public com.ms.wfc.data.Errors getErrorsmdcolErrors()

イベント

ADO/WFC イベントの詳細については、「ADO/WFC 内の ADO のイベント」を参照してください。

public void addOnBeginTransCompletemdevtBeginTransComplete(ConnectionEventHandler handler)
public void removeOnBeginTransComplete(ConnectionEventHandler handler)
public void addOnCommitTransCompletemdevtBeginTransComplete(ConnectionEventHandler handler)
public void removeOnCommitTransComplete(ConnectionEventHandler handler)
public void addOnConnectCompletemdevtConnectConnectionEvents(ConnectionEventHandler handler)
public void removeOnConnectComplete(ConnectionEventHandler handler)
public void addOnDisconnectmdevtConnectConnectionEvents(ConnectionEventHandler handler)
public void removeOnDisconnect(ConnectionEventHandler handler)
public void addOnExecuteCompletemdevtExecuteComplete(ConnectionEventHandler handler)
public void removeOnExecuteComplete(ConnectionEventHandler handler)
public void addOnInfoMessagemdevtInfoMessage(ConnectionEventHandler handler)
public void removeOnInfoMessage(ConnectionEventHandler handler)
public void addOnRollbackTransCompletemdevtBeginTransComplete(ConnectionEventHandler handler)
public void removeOnRollbackTransComplete(ConnectionEventHandler handler)
public void addOnWillConnectmdevtWillConnectEvent(ConnectionEventHandler handler)
public void removeOnWillConnect(ConnectionEventHandler handler)
public void addOnWillExecutemdevtWillExecuteEvent(ConnectionEventHandler handler)
public void removeOnWillExecute(ConnectionEventHandler handler)


DataSpace (ADO/WFC 構文)

DataSpace クラスの createObject メソッドは、クライアント アプリケーション要求 (progid) を処理するビジネス オブジェクトと通信プロトコルを指定し、サーバー (connection). createObject は、サーバーを表す ObjectProxy オブジェクトを返します。

package com.ms.wfc.data

コンストラクタ

public DataSpace()

メソッド

public static ObjectProxy DataSpace.createObjectmdmthCreateObj(String
    progid, String connection)

プロパティ

public static int getInternetTimeoutmdproInternetTimeout()
public static void setInternetTimeout(int plInetTimeout)


Error (ADO/WFC 構文)

package com.ms.wfc.data

プロパティ

public String getDescriptionmdproDescription()
public int getNativeErrormdproNativeError()
public int getNumbermdproNumber()
public String getSourcemdproErrSource()
public String getSQLStatemdproSQLState()


Field (ADO/WFC 構文)

package com.ms.wfc.data

メソッド

public void appendChunkmdmthAppChunk(byte[] bytes)
public void appendChunk(char[] chars)
public void appendChunk(String chars)
public byte[] getByteChunk(int len)
public char[] getCharChunk(int len)
public String getStringChunk(int len)

プロパティ

public int getActualSizemdproActualSize()
public int getAttributesmdproAttributes()
public void setAttributes(int pl)
public com.ms.com.IUnknown getDataFormat()
public void setDataFormat(com.ms.com.IUnknown format)

(詳細については、「Visual J++ ドキュメント」の「WFC と JAVA のリファレンス」の com.ms.wfc.data.IDataFormat インターフェイスに関する記述を参照してください。)

public int getDefinedSizemdproDefinedSize()
public void setDefinedSize(int pl)
public String getNamemdproName()
public int getNumericScalemdproNumericScale()
public void setNumericScale(byte pbNumericScale)
public Variant getOriginalValuemdproOriginalValue()
public int getPrecisionmdproPrecision()
public void setPrecision(byte pbPrecision)
public int getTypemdproType()
public void setType(int pDataType)
public Variant getUnderlyingValuemdproUnderlyingValue()
public Variant getValuemdproValue()
public void setValue(Variant value)
public AdoProperties getPropertiesmdcolProperties()

フィールド アクセス メソッド

Field オブジェクトの Value プロパティでは、オブジェクトの内容を取り出したり、設定します。内容は、値やデータ型を割り当てることのできるオブジェクトの一種のバリアント型 (Variant) で表します。

ADO/WFC は、バリアント型 (Variant) のオブジェクトを返す getValue メソッドと、引数としてバリアント型を使う setValue メソッドを基に Value プロパティを実装します。Microsoft Visual Basic など言語によっては、バリアント型 (Variant) を使うと便利なものもあります。ただし、Microsoft Visual J++ ではネイティブ Java データ型を使えば、さらにすぐれたパフォーマンスが得られます。

Value プロパティのほかに、ADO/WFC には Java データ型を使って Field オブジェクトの内容を取り出したり設定する accessor メソッドもあります。これらのメソッドの多くは、get DataType または set DataType のなどの名前が付いています。

ただし、2 つの例外に注意してください。まず、getObject メソッドの 1 つが、指定したクラスでオブジェクトを強制的に返すことです。また、getNull プロパティがない代わりに、フィールドが Null かどうかを表すブール型 (Boolean) の値を返す isNull プロパティがあることです。

public native boolean getBoolean();
public void setBoolean(boolean v)
public native byte getByte();
public void setByte(byte v)
public native byte[] getBytes();
public void setBytes(byte[] v)
public native double getDouble();
public void setDouble(double v)
public native float getFloat();
public void setFloat(float v)
public native int getInt();
public void setInt(int v)
public native long getLong();
public void setLong(long v)
public native short getShort();
public void setShort(short v)
public native String getString();
public void setString(String v)
public native boolean isNull();
public void setNull()
public Object getObject()
public Object getObject(Class c)
public void setObject(Object value)


ObjectProxy (ADO/WFC 構文)

ObjectProxy オブジェクトは、サーバーを表し、DataSpace オブジェクトの createObject メソッドによって返されます。ObjectProxy クラスには、サーバーにあるメソッドの呼び出し、および呼び出しの結果としてオブジェクトを返す call メソッドがあります。

package com.ms.wfc.data

メソッド

Call メソッド (ADO/WFC 構文)

ObjectProxy によって表されるサーバーにあるメソッドを呼び出します。必要に応じて、メソッドの引数をオブジェクトの配列として渡すこともできます。

構文

public Object ObjectProxy.call( String method )
public Object ObjectProxy.call( String method, Object[] args)

戻り値

メソッドの呼び出し結果のオブジェクトです。

パラメータ

ObjectProxy サーバーを表す ObjectProxy オブジェクトを指定します。

method サーバーで呼び出すメソッドの名前を格納する文字列型 (String) の値を指定します。

args サーバーにあるメソッドに対する引数であるオブジェクトの配列を指定します (省略可)。Java データ型は、サーバーで使用するのに適切なデータ型に自動的に変換されます。


Parameter (ADO/WFC 構文)

package com.ms.wfc.data

コンストラクタ

public ParametermdobjParameter()
public Parameter(String name)
public Parameter(String name, int type)
public Parameter(String name, int type, int dir)
public Parameter(String name, int type, int dir, int size)
public Parameter(String name, int type, int dir, int size, Object value)

メソッド

public void appendChunkmdmthAppChunk(byte[] bytes)
public void appendChunk(char[] chars)
public void appendChunk(String chars)

プロパティ

public int getAttributesmdproAttributes()
public void setAttributes(int attr)
public int getDirectionmdproDirection()
public void setDirection(int dir)
public String getNamemdproName()
public void setName(String name)
public int getNumericScalemdproNumericScale()
public void setNumericScale(int scale)
public int getPrecisionmdproPrecision()
public void setPrecision(int prec)
public int getSizemdproSize()
public void setSize(int size)
public int getTypemdproType()
public void setType(int type)
public com.ms.com.Variant getValuemdproValue()
public void setValue(Object v)
public AdoProperties getPropertiesmdcolProperties()

パラメータ アクセス メソッド

Parameter オブジェクトの Value プロパティは、オブジェクトの内容を取り出したり、設定するときに使います。内容は、値やデータ型のいずれかを割り当てられるオブジェクトの一種の、バリアント型 (Variant) で表します。

ADO/WFC は、バリアント型 (Variant) のオブジェクトを返す getValue メソッドと、引数としてバリアント型を使う setValue メソッドを基に Value プロパティを実装します。Microsoft Visual Basic など言語によっては、バリアント型を使うと便利なものもあります。ただし、Microsoft Visual J++ ではネイティブ Java データ型を使えば、さらにすぐれたパフォーマンスが得られます。

Value プロパティのほか、ADO/WFC には Java データ型を使って Parameter オブジェクトの内容の取り出しや設定を行う、accessor メソッドもあります。これらのメソッドの多くは、get DataType や set DataType のなどの名前が付いています。

ただし、重要な例外が 1 つあります。getNull プロパティがない代わりに、フィールドが Null かどうかを表すブール型 (Boolean) の値を返す isNull プロパティがあることです。

public boolean getBoolean()
public void setBoolean(boolean v)
public byte getByte()
public void setByte(byte v)
public double getDouble()
public void setDouble(double v)
public float getFloat()
public void setFloat(float v)
public int getInt()
public void setInt(int v)
public long getLong()
public void setLong(long v)
public short getShort()
public void setShort(short v)
public String getString()
public void setString(String v)
public boolean isNull()
public void setNull()


Recordset (ADO/WFC 構文)

package com.ms.wfc.data

コンストラクタ

public RecordsetmdobjODBRec()
public Recordset(Object r)

メソッド

public void addNewmdmthAddNew(Object[] fieldList, Object[] valueList)
public void addNew(Object[] valueList)
public void addNew()
public void cancelmdmthADOCancel()
public void cancelBatchmdmthCancelBatch(int affectRecords)
public void cancelBatch()
public void cancelUpdatemdmthCancelUpdate()
public Object clonemdmthClone()
public Object clone(int lockType)
public void closemdmthClose()
public int compareBookmarksmdmthCompareBookmarks(Object bookmark1, Object bookmark2)
public void deletemdmthRstDelete(int affectRecords)
public void delete()
public void findmdmthFindMethodADO(String criteria)
public void find(String criteria, int SkipRecords)
public void find(String criteria, int SkipRecords, int searchDirection)
public void find(String criteria, int SkipRecords, int searchDirection, Object bmkStart)
public Object[][] getRowsmdmthGetRows(int Rows, Object bmkStart, Object[] fieldList)
public void movemdmthMove(int numRecords)
public void move(int numRecords, Object bmkStart)
public void moveFirstmdmthMoveFirst()
public void moveLastmdmthMoveFirst()
public void moveNextmdmthMoveFirst()
public void movePreviousmdmthMoveFirst()
public Recordset nextRecordsetmdmthNextRec()
public Recordset nextRecordset(int[] recordsAffected)
public void openmdmthRstOpen()
public void open(Object source)
public void open(Object source, Object activeConnection)
public void open(Object source, Object activeConnection, int cursorType)
public void open(Object source, Object activeConnection, int cursorType,
                        int lockType)
public void open(Object source, Object activeConnection, int cursorType,
                        int lockType, int options)
public void requerymdmthADORequery()
public void requery(int options)
public void resyncmdmthADOResync()
public void resync(int affectRecords, int resyncValues)
public void savemdmthRstSave(String fileName)
public void save(String fileName, int persistFormat)
public boolean supportsmdmthSupports(int cursorOptions)
public void updatemdmthUpdate()
public void update(Object[] valueList)
public void update(Object[] fieldList, Object[] valueList)
public void updateBatchmdmthUpdateBatch()
public void updateBatch(int affectRecords)

プロパティ

public int getAbsolutePagemdproAbPage()
public void setAbsolutePage(int page)
public int getAbsolutePositionmdproAbPos()
public void setAbsolutePosition(int pos)
public Command getActiveCommandmdproActiveCommand()
public Connection getActiveConnectionmdproActiveCon()
public void setActiveConnection(String conn)
public void setActiveConnection(com.ms.wfc.data.Connection c)
public boolean getBOFmdproBOF()
public boolean getEOFmdproBOF()
public Object getBookmarkmdproBookmark()
public void setBookmark(Object bmk)
public int getCacheSizemdproCacheSize()
public void setCacheSize(int size)
public int getCursorLocationmdproCursorLocation()
public void setCursorLocation(int cursorLoc)
public int getCursorTypemdproCursorType()
public void setCursorType(int cursorType)
public String getDataMembermdproDataMember()
public void setDataMember(String pbstrDataMember)
public Iunknown getDataSourcemdproDataSource()
public void setDataSource(IUnknown dataSource)
public int getEditModemdproEditMode()
public Object getFiltermdproFilter()
public void setFilter(Object filter)
public int getLockTypemdproLockType()
public void setLockType(int lockType)
public int getMarshalOptionsmdproMarshalOptions()
public void setMarshalOptions(int options)
public int getMaxRecordsmdproMaxRecords()
public void setMaxRecords(int maxRecords)
public int getPageCountmdproPageCount()
public int getPageSizemdproPageSize()
public void setPageSize(int pageSize)
public int getRecordCountmdproRecordCount()
public String getSortmdproSortPropertyADO()
public void setSort(String criteria)
public String getSourcemdproRstSource()
public void setSource(String query)
public void setSource(com.ms.wfc.data.Command command)
public int getStatemdproState()
public int getStatusmdproStatus()
public boolean getStayInSyncmdproStayInSync()
public void setStayInSync(boolean pbStayInSync)
public com.ms.wfc.data.Field getFieldmdobjField(int n)
public com.ms.wfc.data.Field getField(String n)
public com.ms.wfc.data.Fields getFieldsmdcolFields()
public AdoProperties getPropertiesmdcolProperties()

イベント

ADO/WFC イベントの詳細については、「ADO/WFC 内の ADO のイベント」を参照してください。

public void addOnEndOfRecordsetmdevtEndOfRecordset(RecordsetEventHandler handler)
public void removeOnEndOfRecordset(RecordsetEventHandler handler)
public void addOnFetchCompletemdevtFetchComplete(RecordsetEventHandler handler)
public void removeOnFetchComplete(RecordsetEventHandler handler)
public void addOnFetchProgressmdevtFetchProgress(RecordsetEventHandler handler)
public void removeOnFetchProgress(RecordsetEventHandler handler)
public void addOnFieldChangeCompletemdevtWillChangeField(RecordsetEventHandler handler)
public void removeOnFieldChangeComplete(RecordsetEventHandler handler)
public void addOnMoveCompletemdevtWillMove(RecordsetEventHandler handler)
public void removeOnMoveComplete(RecordsetEventHandler handler)
public void addOnRecordChangeCompletemdevtWillChangeRecord(RecordsetEventHandler handler)
public void removeOnRecordChangeComplete(RecordsetEventHandler handler)
public void addOnRecordsetChangeCompletemdevtWillChangeRecordset(RecordsetEventHandler handler)
public void removeOnRecordsetChangeComplete(RecordsetEventHandler handler)
public void addOnWillChangeFieldmdevtWillChangeField(RecordsetEventHandler handler)
public void removeOnWillChangeField(RecordsetEventHandler handler)
public void addOnWillChangeRecordmdevtWillChangeRecord(RecordsetEventHandler handler)
public void removeOnWillChangeRecord(RecordsetEventHandler handler)
public void addOnWillChangeRecordsetmdevtWillChangeRecordset(RecordsetEventHandler handler)
public void removeOnWillChangeRecordset(RecordsetEventHandler handler)
public void addOnWillMovemdevtWillMove(RecordsetEventHandler handler)
public void removeOnWillMove(RecordsetEventHandler handler)


ADO サンプル

MDAC SDK には、ADO および RDS のコードの使い方を示す各種のサンプル アプリケーションが用意されています。これらのサンプルの詳細については、「サンプル アプリケーション」を参照してください。

また、ADO のマニュアルには、複数の言語によるサンプル コードも含まれており、このオンライン ヘルプのトピックとして示されています。これらのサンプル コードの詳細については、「ADO コードの例」を参照してください。

そのほかにもさまざまなリソースのサンプル コードを利用できます。Visual Studio のマニュアルおよび MSDN Online Library には、ADO および RDS の理解に役立つ各種のサンプル アプリケーションおよびドキュメントが含まれています。

Visual Studio のサンプル

  • Visual Studio Solutions Center の Web サイト

  • Island Hopper News Sample

  • Visual Basic Samples

  • Visual C++ Samples

  • Visual Interdev Samples

  • Visual J++ Samples

Visual Studio のドキュメント

  • Visual Studio: Data Access and Security Strategies

  • Visual Basic: Data Access Guide

  • Visual Interdev: Integrating Databases

  • Visual J++: Accessing Data


サンプル アプリケーション

ここでは、MDAC に付属する ADO および RDS のサンプル アプリケーションについて説明します。これらのサンプルは、ADO および RDS の使い方を理解することを目的としており、実際の運用サーバーでの利用を目的とするものではありません。

注意 特に記載していない場合、このサンプルで使用している会社、組織、製品、人物、キャラクタ、データなどの名称は架空のものです。

ADO には、次に示すサンプル アプリケーションが用意されています。これらのサンプル アプリケーションは、Microsoft Platform SDK から、c:\Platform SDK\Samples\DataAccess\ado にインストールされます。

サンプル アプリケーション | 説明
ADOASP | Microsoft Active Server Pages (ASP) で ADO を使用する方法を示します。
ADOISAPI | Microsoft Internet Information Services (IIS) で、C/C++ ISAPI 拡張機能から ADO を使用する方法を示します。
ADOJAVA | Java、および COM と統合された Java から ADO を使用する方法を示します。
ADOVBS | Visual Basic, Scripting Edition (VBScript) および HTML から ADO を使用する方法を示します。さらに、クライアントの ADO、VBScript、および HTML を使って 2 層構造または 3 層構造のインターネット用 Web アプリケーションを作成する方法も示します。
MSDAIPP | Microsoft OLE DB Provider for Internet Publishing を使って、ADO の Record オブジェクトおよび Stream オブジェクトで半構造化データを使用する方法を示します。
XML | XML 形式の Recordset を IIS Response オブジェクトに保存して XML ストリームのデータをインターネット クライアントに転送する方法を示します。

RDS には、次に示すサンプル アプリケーションが用意されています。これらのサンプルは、RDS を使ってイントラネット アプリケーションおよびインターネット アプリケーションを構築する方法を示します。RDS サンプル アプリケーションは、c:\Platform SDK\Samples\DataAccess\rds にインストールされます。RDS サンプル アプリケーションを実行する前に、RDS サンプルのインストール ディレクトリを参照する Internet Information Services (IIS) の仮想ルートをセットアップし、RDS という名前で、スクリプトおよび実行の権限を設定する必要があります。

サンプル アプリケーション | 説明
RDSTest | RDS の簡単な使用方法を示します。
Address Book | 簡単な企業名簿アプリケーションで RDS を実用的に使用する方法を示します。
Handler | Visual Basic および Visual C++ によるカスタム DataFactory ハンドラの機能を示します。

注意 RDS サンプル アプリケーションのインストール時に、ユーザー名が adcdemo で、パスワードが adcdemo の SQL Server アカウントが作成されます。サンプル アプリケーションの実行時に、"ログインに失敗しました" というメッセージが表示されることがあります。その場合は、ユーザー名とパスワードを、このテスト アカウントの情報に再設定してください。


ADO ASP サンプル

ADOASP では、Microsoft Active Server Pages で ADO を使用する方法を示します。このサンプルは、c:\Platform SDK\Samples\DataAccess\ado\ASP にインストールされます。

このサンプルでは、書籍に関するタイトルや価格などの情報を Pubs サンプル データベースから取得します。ADOASP を実行すると、Web クライアントでタイトルを閲覧し、選択した書籍の合計価格を計算することができます。

このサンプルを実行するには、Pubs サンプル データベースも Microsoft SQL Server にインストールされている必要があります。

ADOASP を実行するには

  1. Web サーバー コンピュータ上の読み取りおよび実行のアクセス権を持つ任意のディレクトリに、このサンプルの .asp、.jpg、および .gif の各ファイルをコピーします。

  2. Web ブラウザで、アドレスを「http://computer name/virtual directory/cmpsales.asp」のように指定して、Cmpsales.asp を開きます。computer name は実際のコンピュータ名に、virtual directory は手順 1. でサンプル ファイルをコピーした場所を参照する仮想ディレクトリ名に置き換えてください。


ADO ISAPI サンプル

ADOISAPI では、Microsoft Internet Information Services (IIS) で、C/C++ ISAPI 拡張機能から ADO を使用する方法を示します。このサンプルは、c:\Platform SDK\Samples\DataAccess\ado\isapi にインストールされます。

このサンプルでは、データベースへの接続を確立してデータを取得し、取得したデータを HTML テーブルの形式にしてクライアントのブラウザに返します。このサンプルでは、パフォーマンスを向上させるために、データベースへの接続をキャッシュに保存します。

ADOISAPI を実行するには

  1. Web サーバー コンピュータ上の実行アクセス権を持つ任意のディレクトリに Isapi.dll をコピーします。

  2. Web サーバー コンピュータ上の読み取りアクセス権を持つ同じディレクトリに Adoisapi.htm をコピーします。

  3. Web サーバー コンピュータで、OLE_DB_NWind_Jet という ODBC システム DSN をセットアップします。[スタート] ボタンをクリックして [プログラム] をポイントし、[管理ツール] をポイントします。次に、[データ ソース (ODBC)] をクリックします。

  4. [システム DSN] タブで、[追加] をクリックし、利用できるドライバの一覧から [Microsoft Access Driver (.mdb)] を選択します。[完了] をクリックします。

  5. [ODBC Microsoft Access セットアップ] ダイアログ ボックスで、[データ ソース名] ボックスに、「OLE_DB_NWind_Jet」と入力します。[説明] ボックスに、「MDAC SDK Sample Data」と入力します。

  6. [データベース] の [選択] をクリックし、<drive>:\Platform SDK\Samples\DataAccess\ado\xml を開きます。[Nwind.mdb] を選択し、[OK] をクリックします。

  7. [ODBC Microsoft Access セットアップ] ダイアログ ボックスの [OK] をクリックします。[ODBC データ ソース アドミニストレータ] ダイアログ ボックスで、もう一度 [OK] をクリックします。

  8. Msado15.dll の 14 行目のインポート パスは、C: ドライブへのインストールを想定しています。必要に応じて、ADO がインストールされているデバイス (たとえば、"D:\...") に修正してください。

    注意 このサンプルを Visual C++ 6.0 とリンクさせると、リンカに関する警告 LNK4089 が発生する場合があります。これは、ADOISAPI が、Visual C++ 6.0 での最適化の設定が既定で "Maximize Speed" に設定されているためです。この警告は無視してかまいません。


ADO Java サンプル

ADOJAVA では、Java、および COM と統合された Java から ADO を使用する方法を示します。このサンプルは、c:\Platform SDK\Samples\DataAccess\ado\Java にインストールされます。

このサンプルは、ブラウザのアプレットとして、またはスタンドアロン アプリケーションとして実行されます。このサンプルでは、ADO Recordset を開いてカレント レコードを表示し、ユーザーが、ボタンをクリックしてデータ間を移動できるようにします。また、コマンド ライン パラメータの使い方も示しています。

ADOJAVA を実行するには

  1. このサンプルでは、OLE_DB_Nwind_Jet という ODBC DSN を、ユーザー ID は Admin、パスワードは未設定で使用します。Web サーバー コンピュータで、OLE_DB_NWind_Jet という ODBC システム DSN をセットアップします。[スタート] ボタンをクリックして [プログラム] をポイントし、[管理ツール] をポイントします。次に、[データ ソース (ODBC)] をクリックします。

  2. [システム DSN] タブで、[追加] をクリックし、利用できるドライバの一覧から [Microsoft Access Driver (.mdb)] を選択します。[完了] をクリックします。

  3. [ODBC Microsoft Access セットアップ] ダイアログ ボックスで、[データ ソース名] ボックスに、「OLE_DB_NWind_Jet」と入力します。[説明] ボックスに、「MDAC SDK Sample Data」と入力します。

  4. [データベース] の [選択] をクリックし、<drive>:\Platform SDK\Samples\DataAccess\ado\xml を開きます。[Nwind.mdb] を選択し、[OK] をクリックします。

  5. [ODBC Microsoft Access セットアップ] ダイアログ ボックスの [OK] をクリックします。[ODBC データ ソース アドミニストレータ] ダイアログ ボックスで、もう一度 [OK] をクリックします。

  6. Microsoft Visual J++ 6.0 またはそれ以降で、プロジェクト ファイルの Simpleado.vjp を開きます。

  7. [デバッグ] メニューの [開始] をクリックします。

  8. 別のモードで実行する場合は、[プロジェクト] メニューの [simpleado プロパティ] をクリックします。

  9. [起動] タブで、[プロジェクトを実行するとき、ロードする] ボックスをクリックし、3 つのモードの 1 つを選択します。

  10. [OK] をクリックし、手順 3. と同じ手順で実行します。


ADO VBScript サンプル

ADOVBS では、Visual Basic, Scripting Edition (VBScript) および HTML から ADO を使用する方法を示します。さらに、クライアントの ADO、VBScript、および HTML を使って 2 層構造または 3 層構造のインターネット用 Web アプリケーションを作成する方法も示します。最後に、ADO および Microsoft OLE DB Remoting Provider を使って 3 層構造の接続を作成する方法を示します。このサンプルは、c:\Platform SDK\Samples\DataAccess\ado\VBS にインストールされます。

このサンプルでは、Recordset のスキーマ情報に基づいてフィールドを作成するために、VBScript および HTML のコードが実行時に生成されます。

このサンプルは、.htm と .asp の 2 種類が用意されています。Adovbs.htm は、クライアント側のスクリプトのみを使用するので、クライアントには、MDAC SDK Sample の .mdb (Access データベース) を参照する "OLE_DB_NWind_Jet" というシステム DSN に加えて、ADO もインストールされている必要があります。このデータベースは、c:\Platform SDK\Samples\DataAccess\ado\XML\Nwind.mdb にあります。このサンプルでは、Web クライアントからデータ ソースに直接接続する方法を示しています。

注意 このサンプルは、Microsoft Internet Explorer 4.01 Service Pack 1 またはそれ以降を必要とします。また、接続する Web サーバーのセキュリティ設定を低く設定する必要があります。

もう 1 つのサンプル Adovbs.asp は、IIS スクリプトとクライアント側のスクリプトの両方を使用します。クライアントから Internet Explorer 4.0 またはそれ以降でこのサンプルを実行することを前提としています。

ADOVBS を実行するには

  1. c:\Platform SDK\Samples\DataAccess\ado\vbs 内のファイルを、Web サーバー コンピュータ上のスクリプトおよび実行のアクセス権を持つ仮想ディレクトリにコピーします。

  2. Internet Explorer で、アドレスを「http://computer name/virtual directory/ADOVBS.ASP」のように指定して、Adovbs.asp を開きます。computer name は実際のコンピュータ名に、virtual directory は手順 1. でサンプル ファイルをコピーした場所を参照する仮想ディレクトリ名に置き換えてください。


ADO Internet Publishing サンプル

MSDAIPP では、Microsoft OLE DB Provider for Internet Publishing を使って、ADO の Record オブジェクトおよび Stream オブジェクトで半構造化データを使用する方法を示します。このサンプルは、c:\Platform SDK\Samples\DataAccess\ado\MSDAIPP にインストールされます。

MSDAIPP を実行するには

  1. Microsoft Visual Basic で、プロジェクト ファイルの Msdaipp.vbp を開きます。

  2. サーバーを参照する form1.frm の Form_Load サブプロシージャの行を修正します。"http://MyServer/DAVfs/" の文字列値を、実際の Web サーバー名およびファイル ストアのパスに置き換えます。使用する Web サーバーは、FrontPage Web Extender Client (WEC) または Web Distributed Authoring and Versioning (WebDAV) のどちらかのプロトコル拡張機能をサポートしている必要があります。

  3. [実行] メニューの [完全コンパイル後に開始] をクリックします。


ADO XML サンプル

XML サンプルでは、XML 形式の Recordset を IIS Response オブジェクトに保存して XML ストリームのデータをインターネット クライアントに転送する方法を示します。このサンプルは、c:\Platform SDK\Samples\DataAccess\ado\XML にインストールされます。XML ストリームを直接 ASP Response オブジェクトに書き込むためには、Microsoft Internet Information Services (IIS) 5.0 またはそれ以降がインストールされている必要があります。

XML サンプルを実行するには

  1. インターネット サービス マネージャで、サンプル ファイルが格納されている XML ディレクトリを参照する IIS 仮想ディレクトリを作成します。その仮想ディレクトリにスクリプト権限を与えます。

  2. Internet Explorer で、アドレスを「http://servername/XML/default.htm」のように指定して、default.htm を開きます。servername は、実際に使用する Web サーバー コンピュータ名に置き換えてください。


RDS Test サンプル

RDSTEST は、RDS の機能を示す簡単な .asp ファイルです。このサンプルは、c:\Platform SDK\Samples\DataAccess\rds\RDSTest にインストールされます。

注意 このサンプルは、Microsoft Internet Explorer 4.01 Service Pack 1 またはそれ以降を必要とします。また、接続する Web サーバーのセキュリティ設定を低く設定する必要があります。

RDSTEST は .asp 形式で提供されています (ホスト サーバー名は自動的に設定されます) が、簡単な修正で .htm ページとしても実行可能になります。

このサンプルを修正して .htm 形式で実行するには

  1. メモ帳などのテキスト エディタで .asp ファイルを開きます。

  2. <%=Request.ServerVariables("SERVER_NAME")%> の文字列を、実際に使用する Web サーバー コンピュータ名に置き換えます。


RDS Address Book サンプル

Address Book サンプルは、簡単な企業名簿のアプリケーションです。このサンプルは、c:\Platform SDK\Samples\DataAccess\rds\AddrBook にインストールされます。

このアプリケーションの詳細については、「RDS のシナリオ」を参照してください。

注意 このサンプルは、Microsoft Internet Explorer 4.01 Service Pack 1 またはそれ以降を必要とします。また、接続する Web サーバーのセキュリティ設定を低く設定する必要があります。

このサンプルは .asp 形式で提供されています (ホスト サーバー名は自動的に設定されます) が、簡単な修正で .htm ページとしても実行可能になります。

このサンプルを修正して .htm 形式で実行するには

  1. メモ帳などのテキスト エディタで .asp ファイルを開きます。

  2. <%=Request.ServerVariables("SERVER_NAME")%> の文字列を、実際に使用する Web サーバー コンピュータ名に置き換えます。


RDS Handler サンプル

Handler には、Visual Basic および Visual C++ のカスタム DataFactory ハンドラが含まれており、各アプリケーションに合わせて修正できます。このサンプルは、c:\Platform SDK\Samples\DataAccess\rds\Handler にインストールされます。

Handler サンプルに記述されているコードを十分に理解するには、「DataFactory のカスタマイズ」をお読みください。


ADO コードの例

ADO オブジェクト、メソッド、プロパティ、イベントの使用方法については、次のトピックを参照してください。

注意 コード例全体をコピーして、コード エディタに貼り付けてください。このコード例は、一部分だけを使ったり、改行の情報が失われると、正常に動作しない場合があります。

  • Microsoft Visual Basic での ADO コードの例

  • Microsoft Visual Basic, Scripting Edition での ADO コードの例

  • Microsoft Visual C++ での ADO コードの例

  • Microsoft Visual J++ での ADO コードの例


Microsoft Visual Basic での ADO コードの例

Visual Basic で記述するときの ADO のメソッド、プロパティ、イベントの使用方法については、次のコード例を参照してください。

注意 Sub から End Sub までのコード例全体をコピーして、コード エディタに貼り付けてください。このコード例は、一部分だけを使ったり、改行の情報が失われると、正常に動作しない場合があります。

メソッド

  • AddNew メソッドの例

  • Append、CreateParameter メソッドの例

  • AppendChunk、GetChunk メソッドの例

  • BeginTrans、CommitTrans、RollbackTrans メソッドの例

  • Cancel メソッドの例

  • Clone メソッドの例

  • CompareBookmarks メソッドの例

  • ConvertToString メソッドの例

  • CopyRecord、CopyTo、SaveToFile メソッドの例

  • CreateRecordset メソッドの例

  • Delete メソッドの例

  • DeleteRecord、MoveRecord メソッドの例

  • Execute、Requery、Clear メソッドの例

  • Find メソッドの例

  • GetRows メソッドの例

  • GetString メソッドの例

  • EOS、LineSeparator プロパティと SkipLine メソッドの例

  • Move メソッドの例

  • MoveFirst、MoveLast、MoveNext、MovePrevious メソッドの例

  • NextRecordset メソッドの例

  • Open、Close メソッドの例

  • OpenSchema メソッドの例

  • Read、ReadText、Write、WriteText メソッドの例

  • Refresh メソッドの例

  • Resync メソッドの例

  • Save、Open メソッドの例

  • Seek メソッド、Index プロパティの例

  • Supports メソッドの例

  • Update、CancelUpdate メソッドの例

  • UpdateBatch、CancelBatch メソッドの例

プロパティ

  • AbsolutePage、PageCount、PageSize プロパティの例

  • AbsolutePosition、CursorLocation プロパティの例

  • ActiveCommand プロパティの例

  • ActiveConnection、CommandText、CommandTimeout、CommandType、Size、Direction プロパティの例

  • ActualSize、DefinedSize プロパティの例

  • Attributes、Name プロパティの例

  • BOF、EOF、Bookmark プロパティの例

  • CacheSize プロパティの例

  • ConnectionString、ConnectionTimeout、State プロパティの例

  • Count プロパティの例

  • CursorType、LockType、EditMode プロパティの例

  • Description、NativeError、Number、Source、SQLState プロパティの例

  • EOS、LineSeparator プロパティと SkipLine メソッドの例

  • Filter、RecordCount プロパティの例

  • Handler プロパティの例

  • InternetTimeout プロパティの例

  • IsolationLevel、Mode プロパティの例

  • Item プロパティの例

  • MarshalOptions プロパティの例

  • MaxRecords プロパティの例

  • NumericScale、Precision プロパティの例

  • Optimize プロパティの例

  • OriginalValue、UnderlyingValue プロパティの例

  • Prepared プロパティの例

  • Provider、DefaultDatabase プロパティの例

  • Sort プロパティの例

  • Source プロパティの例

  • State プロパティの例

  • Status プロパティの例

  • StayInSync プロパティの例

  • Type プロパティの例 (Field)

  • Type プロパティの例 (Property)

  • Value プロパティの例

  • Version プロパティの例


AbsolutePage、PageCount、PageSize プロパティの例 (VB)

Public Sub AbsolutePageX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String
    Dim intPage As Integer
    Dim intPageCount As Integer
    Dim intRecord As Integer

    ' Open a recordset using a client cursor
    ' for the employee table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    ' Use client cursor to enable AbsolutePosition property.
    rstEmployees.CursorLocation = adUseClient
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    ' Display names and hire dates, five records
    ' at a time.
    rstEmployees.PageSize = 5
    intPageCount = rstEmployees.PageCount
    For intPage = 1 To intPageCount
        rstEmployees.AbsolutePage = intPage
        strMessage = ""
        For intRecord = 1 To rstEmployees.PageSize
            strMessage = strMessage & _
                rstEmployees!fname & " " & _
                rstEmployees!lname & " " & _
                rstEmployees!hire_date & vbCr
            rstEmployees.MoveNext
            If rstEmployees.EOF Then Exit For
        Next intRecord
        MsgBox strMessage
    Next intPage
    rstEmployees.Close

End Sub


AbsolutePosition、CursorLocation プロパティの例 (VB)

この例では、AbsolutePosition プロパティを使って、Recordset のすべてのレコードを列挙するループ処理の進行状況をトレースします。ここでは、CursorLocation プロパティを使ってカーソルをクライアント カーソルに設定することにより、AbsolutePosition プロパティを使用可能にしています。

Public Sub AbsolutePositionX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String

    ' Open a recordset for the Employee table
    ' using a client cursor.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    ' Use client cursor to enable AbsolutePosition property.
    rstEmployees.CursorLocation = adUseClient
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    ' Enumerate Recordset.
    Do While Not rstEmployees.EOF
        ' Display current record information.
        strMessage = "Employee: " & rstEmployees!lName & vbCr & _
            "(record " & rstEmployees.AbsolutePosition & _
            " of " & rstEmployees.RecordCount & ")"
        If MsgBox(strMessage, vbOKCancel) = vbCancel _
            Then Exit Do
        rstEmployees.MoveNext
    Loop

    rstEmployees.Close

End Sub


ActiveCommand プロパティの例 (VB)

この例では、ActiveCommand プロパティの機能を示します。

サブルーチンに Recordset オブジェクトを渡し、その Recordset オブジェクトの ActiveCommand プロパティを使って、その Recordset を作成したコマンド テキストとパラメータを表示します。

Public Sub Main()
    ActiveCommandX
End Sub

Public Sub ActiveCommandX()
Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
Dim strPrompt As String, strName As String

strPrompt = "Enter an author's name (e.g., Ringer): "
strName = Trim(InputBox(strPrompt, "ActiveCommandX Example"))
cmd.CommandText = "SELECT * FROM Authors WHERE au_lname = ?"
cmd.Parameters.Append _
    cmd.CreateParameter("LastName", adChar, adParamInput, 20, strName)

cnn.Open "DSN=Pubs;Provider=MSDASQL; uid=sa; pwd=;"
cmd.ActiveConnection = cnn
Set rst = cmd.Execute(, , adCmdText)
ActiveCommandXprint rst

rst.Close
cnn.Close
End Sub

ActiveCommandXprint ルーチンには、Recordset オブジェクトだけがありますが、このルーチンでは Recordset で作成したコマンド テキストとパラメータが出力されます。これは、Recordset オブジェクトの ActiveCommand プロパティによって、関連する Command オブジェクトが取得できるためです。

Command オブジェクトの CommandText プロパティは Recordset を作成したパラメータ化コマンドを取得します。Command オブジェクトの Parameters コレクションは、コマンドのパラメータ プレースホルダ ("?") に代入される値を取得します。

最後に、エラー メッセージまたは著作者の名前と ID が表示されます。

Public Sub ActiveCommandXprint(rstp As ADODB.Recordset)
Dim strName As String

strName = rstp.ActiveCommand.Parameters.Item("LastName").Value

Debug.Print "Command text = '"; rstp.ActiveCommand.CommandText; "'"
Debug.Print "Parameter = '"; strName; "'"

If rstp.BOF = True Then
    Debug.Print "Name = '"; strName; "', not found."
Else
    Debug.Print "Name = '"; rstp!au_fname; " "; rstp!au_lname; _
            "', author ID = '"; rstp!au_id; "'"
End If

End Sub


ActiveConnection、CommandText、CommandTimeout、CommandType、Size、Direction プロパティの例 (VB)

この例では、ActiveConnection、CommandText、CommandTimeout、CommandType、Size、および Direction の各プロパティを使って、ストアド プロシージャを実行します。

Public Sub ActiveConnectionX()

    Dim cnn1 As ADODB.Connection
    Dim cmdByRoyalty As ADODB.Command
    Dim prmByRoyalty As ADODB.Parameter
    Dim rstByRoyalty As ADODB.Recordset
    Dim rstAuthors As ADODB.Recordset
    Dim intRoyalty As Integer
    Dim strAuthorID As String
    Dim strCnn As String

    ' Define a command object for a stored procedure.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn
    Set cmdByRoyalty = New ADODB.Command
    Set cmdByRoyalty.ActiveConnection = cnn1
    cmdByRoyalty.CommandText = "byroyalty"
    cmdByRoyalty.CommandType = adCmdStoredProc
    cmdByRoyalty.CommandTimeout = 15

    ' Define the stored procedure's input parameter.
    intRoyalty = Trim(InputBox( _
        "Enter royalty:"))
    Set prmByRoyalty = New ADODB.Parameter
    prmByRoyalty.Type = adInteger
    prmByRoyalty.Size = 3
    prmByRoyalty.Direction = adParamInput
    prmByRoyalty.Value = intRoyalty
    cmdByRoyalty.Parameters.Append prmByRoyalty

    ' Create a recordset by executing the command.
    Set rstByRoyalty = cmdByRoyalty.Execute()

    ' Open the Authors table to get author names for display.
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.Open "Authors", strCnn, , , adCmdTable

    ' Print current data in the recordset, adding
    ' author names from Authors table.
    Debug.Print "Authors with " & intRoyalty & _
        " percent royalty"
    Do While Not rstByRoyalty.EOF
        strAuthorID = rstByRoyalty!au_id
        Debug.Print , rstByRoyalty!au_id & ", ";
        rstAuthors.Filter = "au_id = '" & strAuthorID & "'"
        Debug.Print rstAuthors!au_fname & " " & _
            rstAuthors!au_lname
        rstByRoyalty.MoveNext
    Loop

    rstByRoyalty.Close
    rstAuthors.Close
    cnn1.Close

End Sub


ActualSize、DefinedSize プロパティの例 (VB)

この例では、ActualSize プロパティおよび DefinedSize プロパティを使って、定義されているフィールド サイズと実際のフィールド サイズを表示します。

Public Sub ActualSizeX()

    Dim rstStores As ADODB.Recordset
    Dim strCnn As String

    ' Open a recordset for the Stores table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstStores = New ADODB.Recordset
    rstStores.Open "stores", strCnn, , , adCmdTable

    ' Loop through the recordset displaying the contents
    ' of the stor_name field, the field's defined size,
    ' and its actual size.
    rstStores.MoveFirst

    Do Until rstStores.EOF
        MsgBox "Store name: " & rstStores!stor_name & _
        vbCr & "Defined size: " & _
        rstStores!stor_name.DefinedSize & _
        vbCr & "Actual size: " & _
        rstStores!stor_name.ActualSize & vbCr
        rstStores.MoveNext
    Loop

    rstStores.Close

End Sub


AddNew メソッドの例 (VB)

この例では、AddNew メソッドを使って、ユーザーによって指定された名前で新規のレコードを作成します。

Public Sub AddNewX()

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strID As String
    Dim strFirstName As String
    Dim strLastName As String
    Dim booRecordAdded As Boolean

    ' Open a connection.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=;"
    cnn1.Open strCnn

    ' Open Employee table.
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.Open "employee", cnn1, , , adCmdTable

    ' Get data from the user. The employee ID must be formatted as
    ' first, middle, and last initial, five numbers, then M or F to
    ' signify the gender. For example, the employee id for Bill Sornsin
    ' would be "B-S55555M".
    strID = Trim(InputBox("Enter employee ID:"))
    strFirstName = Trim(InputBox("Enter first name:"))
    strLastName = Trim(InputBox("Enter last name:"))

    ' Proceed only if the user actually entered something
    ' for both the first and last names.
    If (strID <> "") And (strFirstName <> "") _
        And (strLastName <> "") Then

        rstEmployees.AddNew
        rstEmployees!emp_id = strID
        rstEmployees!fname = strFirstName
        rstEmployees!lname = strLastName
        rstEmployees.Update
        booRecordAdded = True

        ' Show the newly added data.
        MsgBox "New record: " & rstEmployees!emp_id & " " & _
            rstEmployees!fname & " " & rstEmployees!lname

    Else
        MsgBox "Please enter an employee ID, " & _
            "first name, and last name."
    End If

    ' Delete the new record because this is a demonstration.
    cnn1.Execute "DELETE FROM employee WHERE emp_id = '" & strID & "'"

    rstEmployees.Close
    cnn1.Close

End Sub


Append、CreateParameter メソッドの例 (VB)

この例では、Append メソッドおよび CreateParameter メソッドを使って、入力パラメータでストアド プロシージャを実行します。

Public Sub AppendX()

    Dim cnn1 As ADODB.Connection
    Dim cmdByRoyalty As ADODB.Command
    Dim prmByRoyalty As ADODB.Parameter
    Dim rstByRoyalty As ADODB.Recordset
    Dim rstAuthors As ADODB.Recordset
    Dim intRoyalty As Integer
    Dim strAuthorID As String
    Dim strCnn As String

    ' Open connection.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn
    cnn1.CursorLocation = adUseClient

    ' Open command object with one parameter.
    Set cmdByRoyalty = New ADODB.Command
    cmdByRoyalty.CommandText = "byroyalty"
    cmdByRoyalty.CommandType = adCmdStoredProc

    ' Get parameter value and append parameter.
    intRoyalty = Trim(InputBox("Enter royalty:"))
    Set prmByRoyalty = cmdByRoyalty.CreateParameter("percentage", _
        adInteger, adParamInput)
    cmdByRoyalty.Parameters.Append prmByRoyalty
    prmByRoyalty.Value = intRoyalty

    ' Create recordset by executing the command.
    Set cmdByRoyalty.ActiveConnection = cnn1
    Set rstByRoyalty = cmdByRoyalty.Execute

    ' Open the Authors table to get author names for display.
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.Open "Authors", cnn1, , , adCmdTable

    ' Print current data in the recordset, adding
    ' author names from Authors table.
    Debug.Print "Authors with " & intRoyalty & " percent royalty"
    Do While Not rstByRoyalty.EOF
        strAuthorID = rstByRoyalty!au_id
        Debug.Print "    " & rstByRoyalty!au_id & ", ";
        rstAuthors.Filter = "au_id = '" & strAuthorID & "'"
        Debug.Print rstAuthors!au_fname & " " & rstAuthors!au_lname
        rstByRoyalty.MoveNext
    Loop

    rstByRoyalty.Close
    rstAuthors.Close
    cnn1.Close

End Sub


AppendChunk、GetChunk メソッドの例 (VB)

この例では、AppendChunk メソッドおよび GetChunk メソッドを使って、別のレコードのデータを画像フィールドに格納します。

Public Sub AppendChunkX()

    Dim cnn1 As ADODB.Connection
    Dim rstPubInfo As ADODB.Recordset
    Dim strCnn As String
    Dim strPubID As String
    Dim strPRInfo As String
    Dim lngOffset As Long
    Dim lngLogoSize As Long
    Dim varLogo As Variant
    Dim varChunk As Variant

    Const conChunkSize = 100

    ' Open a connection.
    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Open the pub_info table.
    Set rstPubInfo = New ADODB.Recordset
    rstPubInfo.CursorType = adOpenKeyset
    rstPubInfo.LockType = adLockOptimistic
    rstPubInfo.Open "pub_info", cnn1, , , adCmdTable

    ' Prompt for a logo to copy.
    strMsg = "Available logos are : " & vbCr & vbCr
    Do While Not rstPubInfo.EOF
        strMsg = strMsg & rstPubInfo!pub_id & vbCr & _
            Left(rstPubInfo!pr_info, InStr(rstPubInfo!pr_info, ",") - 1) & _
            vbCr & vbCr
        rstPubInfo.MoveNext
    Loop
    strMsg = strMsg & "Enter the ID of a logo to copy:"
    strPubID = InputBox(strMsg)

    ' Copy the logo to a variable in chunks.
    rstPubInfo.Filter = "pub_id = '" & strPubID & "'"
    lngLogoSize = rstPubInfo!logo.ActualSize
    Do While lngOffset < lngLogoSize
        varChunk = rstPubInfo!logo.GetChunk(conChunkSize)
        varLogo = varLogo & varChunk
        lngOffset = lngOffset + conChunkSize
    Loop

    ' Get data from the user.
    strPubID = Trim(InputBox("Enter a new pub ID" & _
                            " [must be > 9899 & < 9999]:"))
    strPRInfo = Trim(InputBox("Enter descriptive text:"))

   ' Add the new publisher to the publishers table to avoid
   ' getting an error due to foreign key constraint.
   cnn1.Execute "INSERT publishers(pub_id, pub_name) VALUES('" & _
                  strPubID & "','Your Test Publisher')"

    ' Add a new record, copying the logo in chunks.
    rstPubInfo.AddNew
    rstPubInfo!pub_id = strPubID
    rstPubInfo!pr_info = strPRInfo

    lngOffset = 0 ' Reset offset.
    Do While lngOffset < lngLogoSize
        varChunk = LeftB(RightB(varLogo, lngLogoSize - lngOffset), _
            conChunkSize)
        rstPubInfo!logo.AppendChunk varChunk
        lngOffset = lngOffset + conChunkSize
    Loop
    rstPubInfo.Update

     ' Show the newly added data.
    MsgBox "New record: " & rstPubInfo!pub_id & vbCr & _
        "Description: " & rstPubInfo!pr_info & vbCr & _
        "Logo size: " & rstPubInfo!logo.ActualSize

    ' Delete new records because this is a demonstration.
    rstPubInfo.Requery
    cnn1.Execute "DELETE FROM pub_info " & _
        "WHERE pub_id = '" & strPubID & "'"

   cnn1.Execute "DELETE FROM publishers " & _
      "WHERE pub_id = '" & strPubID & "'"

    rstPubInfo.Close
    cnn1.Close

End Sub


Attributes、Name プロパティの例 (VB)

この例では、Connection、Field、および Property オブジェクトの Attributes プロパティの値を表示します。Name プロパティを使って、Field オブジェクトと Property オブジェクトの名前を表示します。

Public Sub AttributesX

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim fldLoop As ADODB.Field
    Dim proLoop As ADODB.Property
    Dim strCnn As String

    ' Open connection and recordset.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "employee", cnn1, , , adCmdTable

    ' Display the attributes of the connection.
    Debug.Print "Connection attributes = " & _
        cnn1.Attributes

    ' Display the attributes of the Employee table's
    ' fields.
    Debug.Print "Field attributes:"
    For Each fldLoop In rstEmployees.Fields
        Debug.Print "    " & fldLoop.Name & " = " & _
            fldLoop.Attributes
    Next fldLoop

    ' Display Fields of the Employee table which are NULLABLE.
    Debug.Print "NULLABLE Fields:"
    For Each fldLoop In rstEmployees.Fields
        If CBool(fldLoop.Attributes And adFldIsNullable) Then
            Debug.Print "   " & fldLoop.Name
        End If
    Next fldLoop

    ' Display the attributes of the Employee table's
    ' properties.
    Debug.Print "Property attributes:"
    For Each proLoop In rstEmployees.Properties
        Debug.Print "    " & proLoop.Name & " = " & _
            proLoop.Attributes
    Next proLoop

    rstEmployees.Close
    cnn1.Close

End Sub


BeginTrans、CommitTrans、RollbackTrans メソッドの例 (VB)

この例では、データベースの Titles テーブル内のすべての心理学書の書籍種別を変更します。BeginTrans メソッドで、Titles テーブルへのすべての変更を独立させるトランザクションを開始した後、CommitTrans メソッドで、変更を保存します。RollbackTrans メソッドを使うと、Update メソッドで保存した変更を変更前の状態に戻せます。

Public Sub BeginTransX()

    Dim cnn1 As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String
    Dim strTitle As String
    Dim strMessage As String

    ' Open connection.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn

    ' Open Titles table.
    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenDynamic
    rstTitles.LockType = adLockPessimistic
    rstTitles.Open "titles", cnn1, , , adCmdTable

    rstTitles.MoveFirst
    cnn1.BeginTrans

    ' Loop through recordset and ask user if she wants
    ' to change the type for a specified title.
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            strTitle = rstTitles!Title
            strMessage = "Title: " & strTitle & vbCr & _
            "Change type to self help?"

            ' Change the title for the specified
            ' employee.
            If MsgBox(strMessage, vbYesNo) = vbYes Then
                rstTitles!Type = "self_help"
                rstTitles.Update
            End If
        End If

            rstTitles.MoveNext
    Loop

    ' Ask if the user wants to commit to all the
    ' changes made above.
    If MsgBox("Save all changes?", vbYesNo) = vbYes Then
        cnn1.CommitTrans
    Else
        cnn1.RollbackTrans
    End If

    ' Print current data in recordset.
    rstTitles.Requery
    rstTitles.MoveFirst
    Do While Not rstTitles.EOF
        Debug.Print rstTitles!Title & " - " & rstTitles!Type
        rstTitles.MoveNext
    Loop

    ' Restore original data because this
    ' is a demonstration.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "self_help" Then
            rstTitles!Type = "psychology"
            rstTitles.Update
        End If
        rstTitles.MoveNext
    Loop

    rstTitles.Close
    cnn1.Close

End Sub


BOF、EOF、Bookmark プロパティの例 (VB)

この例では、BOF および EOF プロパティを使って、ユーザーが Recordset の先頭または最後のレコードを越えて移動しようとしたときに、メッセージが表示されるようにします。また、ユーザーが Recordset 内のレコードにフラグを付けるときのために、Bookmark プロパティを使って、後でそのレコードに戻れるようにします。

Public Sub BOFX()

    Dim rstPublishers As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String
    Dim intCommand As Integer
    Dim varBookmark As Variant

    ' Open recordset with data from Publishers table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstPublishers = New ADODB.Recordset
    rstPublishers.CursorType = adOpenStatic
    ' Use client cursor to enable AbsolutePosition property.
    rstPublishers.CursorLocation = adUseClient
    rstPublishers.Open "SELECT pub_id, pub_name FROM publishers " & _
        "ORDER BY pub_name", strCnn, , , adCmdText

    rstPublishers.MoveFirst

    Do While True
        ' Display information about current record
        ' and get user input.
        strMessage = "Publisher: " & rstPublishers!pub_name & _
            vbCr & "(record " & rstPublishers.AbsolutePosition & _
            " of " & rstPublishers.RecordCount & ")" & vbCr & vbCr & _
            "Enter command:" & vbCr & _
            "[1 - next / 2 - previous /" & vbCr & _
            "3 - set bookmark / 4 - go to bookmark]"
        intCommand = Val(InputBox(strMessage))

        Select Case intCommand
            ' Move forward or backward, trapping for BOF
            ' or EOF.
            Case 1
                rstPublishers.MoveNext
                If rstPublishers.EOF Then
                    MsgBox "Moving past the last record." & _
                        vbCr & "Try again."
                    rstPublishers.MoveLast
                End If
            Case 2
                rstPublishers.MovePrevious
                If rstPublishers.BOF Then
                    MsgBox "Moving past the first record." & _
                        vbCr & "Try again."
                    rstPublishers.MoveFirst
                End If

            ' Store the bookmark of the current record.
            Case 3
                varBookmark = rstPublishers.Bookmark

            ' Go to the record indicated by the stored
            ' bookmark.
            Case 4
                If IsEmpty(varBookmark) Then
                    MsgBox "No Bookmark set!"
                Else
                    rstPublishers.Bookmark = varBookmark
                End If

            Case Else
                Exit Do
        End Select

    Loop

    rstPublishers.Close

End Sub

この例では、Bookmark および Filter プロパティを使って、Recordset の参照を制限します。ブックマークの配列に参照されているレコードだけに、アクセスできるようにします。

Public Sub BOFX2()

Dim rs As New ADODB.Recordset
Dim bmk(10)

rs.CursorLocation = adUseClient
rs.ActiveConnection = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=;"

rs.Open "select * from Authors", , adOpenStatic, adLockBatchOptimistic
Debug.Print "Number of records before filtering: ", rs.RecordCount

ii = 0
While rs.EOF <> True And ii < 11
    bmk(ii) = rs.Bookmark
    ii = ii + 1
    rs.Move 2
Wend
rs.Filter = bmk
Debug.Print "Number of records after filtering: ", rs.RecordCount

rs.MoveFirst
While rs.EOF <> True
    Debug.Print rs.AbsolutePosition, rs("au_lname")
    rs.MoveNext
Wend

End Sub


CacheSize プロパティの例 (VB)

この例では、CacheSize プロパティを使って、30 レコードのキャッシュを使用した場合と使用しない場合のパフォーマンスの違いを示します。

Public Sub CacheSizeX()

    Dim rstRoySched As ADODB.Recordset
    Dim strCnn As String
    Dim sngStart As Single
    Dim sngEnd As Single
    Dim sngNoCache As Single
    Dim sngCache As Single
    Dim intLoop As Integer
    Dim strTemp As String

    ' Open the RoySched table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstRoySched = New ADODB.Recordset
    rstRoySched.Open "roysched", strCnn, , , adCmdTable

    ' Enumerate the Recordset object twice and record
    ' the elapsed time.
    sngStart = Timer

    For intLoop = 1 To 2
        rstRoySched.MoveFirst

        Do While Not rstRoySched.EOF
            ' Execute a simple operation for the
            ' performance test.
            strTemp = rstRoySched!title_id
            rstRoySched.MoveNext
        Loop
    Next intLoop

    sngEnd = Timer
    sngNoCache = sngEnd - sngStart

    ' Cache records in groups of 30 records.
    rstRoySched.MoveFirst
    rstRoySched.CacheSize = 30
    sngStart = Timer

    ' Enumerate the Recordset object twice and record
    ' the elapsed time.
    For intLoop = 1 To 2

        rstRoySched.MoveFirst
        Do While Not rstRoySched.EOF
            ' Execute a simple operation for the
            ' performance test.
            strTemp = rstRoySched!title_id
            rstRoySched.MoveNext
        Loop
    Next intLoop

    sngEnd = Timer
    sngCache = sngEnd - sngStart

    ' Display performance results.
    MsgBox "Caching Performance Results:" & vbCr & _
        "    No cache: " & Format(sngNoCache, _
        "##0.000") & " seconds" & vbCr & _
        "    30-record cache: " & Format(sngCache, _
        "##0.000") & " seconds"
    rstRoySched.Close

End Sub


Cancel メソッドの例 (VB)

この例では、Cancel メソッドを使って、接続がビジー状態の場合に、Connection オブジェクトで実行されるコマンドを中止します。

Public Sub CancelX()

    Dim cnn1 As ADODB.Connection
    Dim strCnn As String
    Dim strCmdChange As String
    Dim strCmdRestore As String
    Dim booChanged As Boolean

    ' Open a connection.
    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Define command strings.
    strCmdChange = "UPDATE titles SET type = 'self_help' " & _
        "WHERE type = 'psychology'"
    strCmdRestore = "UPDATE titles SET type = 'psychology' " & _
        "WHERE type = 'self_help'"

    ' Begin a transaction, then execute a command asynchronously.
    cnn1.BeginTrans
    cnn1.Execute strCmdChange, , adAsyncExecute

    ' do something else for a little while – this could be changed
        For i = 1 To 10
            i = i + i
            Debug.Print i
        Next i

    ' If the command has NOT completed, cancel the execute
    ' and roll back the transaction. Otherwise, commit the
    ' transaction.
    If CBool(cnn1.State And adStateExecuting) Then
        cnn1.Cancel
        cnn1.RollbackTrans
        booChanged = False
        MsgBox "Update canceled."
    Else
        cnn1.CommitTrans
        booChanged = True
        MsgBox "Update complete."
    End If

    ' If the change was made, restore the data
    ' because this is a demonstration.
    If booChanged Then
        cnn1.Execute strCmdRestore
        MsgBox "Data restored."
    End If

    cnn1.Close

End Sub


Clone メソッドの例 (VB)

この例では、Clone メソッドを使って Recordset のコピーを作成し、ユーザーがそれぞれのコピーのレコード ポインタを個別に配置できるようにします。

Public Sub CloneX()

    Dim arstStores(1 To 3) As ADODB.Recordset
    Dim intLoop As Integer
    Dim strSQL As String
    Dim strCnn As String
    Dim strMessage As String
    Dim strFind As String

    ' Assign SQL statement and connection string to variables.
    strSQL = "SELECT stor_name FROM Stores " & _
        "ORDER BY stor_name"
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "

    ' Open recordset as a static cursor type recordset.
    Set arstStores(1) = New ADODB.Recordset
    arstStores(1).CursorType = adOpenStatic
    arstStores(1).LockType = adLockBatchOptimistic
    arstStores(1).Open strSQL, strCnn, , , adCmdText

    ' Create two clones of the original Recordset.
    Set arstStores(2) = arstStores(1).Clone
    Set arstStores(3) = arstStores(1).Clone

    Do While True

        ' Loop through the array so that on each pass,
        ' the user is searching a different copy of the
        ' same Recordset.
        For intLoop = 1 To 3

            ' Ask for search string while showing where
            ' the current record pointer is for each Recordset.
            strMessage = _
                "Recordsets from stores table:" & vbCr & _
                "  1 - Original - Record pointer at " & _
                arstStores(1)!stor_name & vbCr & _
                "  2 - Clone - Record pointer at " & _
                arstStores(2)!stor_name & vbCr & _
                "  3 - Clone - Record pointer at " & _
                arstStores(3)!stor_name & vbCr & _
                "Enter search string for #" & intLoop & ":"
            strFind = Trim(InputBox(strMessage))
            If strFind = "" Then Exit Do

            ' Find the search string; if there's no
            ' match, jump to the last record.
            arstStores(intLoop).Filter = "stor_name >= '" & strFind & "'"
            If arstStores(intLoop).EOF Then
                arstStores(intLoop).Filter = adFilterNone
                arstStores(intLoop).MoveLast
            End If

        Next intLoop

    Loop

    arstStores(1).Close
    arstStores(2).Close
    arstStores(3).Close

End Sub


CompareBookmarks メソッドの例 (VB)

この例では、CompareBookmarks メソッドの機能を示します。通常、ブックマークの相対的な値は、特別なブックマークでない限り、必要ではありません。

Authors テーブルから取得した Recordset の任意の行を、検索の対象として指定します。次に、その検索対象に対する各行の相対的な位置を表示します。

Public Sub Main()
    CompareBookmarksX
End Sub

Public Sub CompareBookmarksX()
Dim rst As ADODB.Recordset
Dim count As Integer
Dim target As Variant
Dim result As Long
Dim strAns As String
Dim strTitle As String
strTitle = "CompareBookmarks Example"

Set rst = New ADODB.Recordset
rst.Open "SELECT * FROM Authors", _
            "DSN=Pubs;Provider=MSDASQL; uid=sa;pwd=;", _
            adOpenStatic, adLockReadOnly, adCmdText

count = rst.RecordCount
Debug.Print "Rows in the Recordset = "; count
If count = 0 Then Exit Sub   'Exit if an empty recordset

Randomize
count = (Int(count * Rnd))   'Get position between 0 and count-1
Debug.Print "Randomly chosen row position = "; count
rst.Move count, adBookmarkFirst 'Move row to random position
target = rst.Bookmark        'Remember the mystery row.

count = 0
rst.MoveFirst
Do While Not rst.EOF         'Loop through recordset
    result = rst.CompareBookmarks(rst.Bookmark, target)
    If result = adCompareNotEqual Then
        Debug.Print "Row "; count; ": Bookmarks are not equal."
    ElseIf result = adCompareNotComparable Then
        Debug.Print "Row "; count; ": Bookmarks are not comparable."
    Else
        Select Case result
            Case adCompareLessThan
            strAns = "less than"
            Case adCompareEqual
                strAns = "equal to"
            Case adCompareGreaterThan
                strAns = "greater than"
            Case Else
                strAns = "in error comparing to"
        End Select
        Debug.Print "Row position " & count & " is " & strAns & _
                        " the target."
    End If
    count = count + 1
    rst.MoveNext
Loop

rst.Close
End Sub


ConnectionString、ConnectionTimeout、State プロパティの例 (VB)

この例では、Connection オブジェクトを開くための、ConnectionString プロパティのさまざまな使い方を示します。また、ConnectionTimeout プロパティを使って接続のタイムアウト時間を設定し、State プロパティを使って接続の状態を確認します。このプロシージャを実行するには、Getstate 関数が必要です。

Public Sub ConnectionStringX()

    Dim cnn1 As ADODB.Connection
    Dim cnn2 As ADODB.Connection
    Dim cnn3 As ADODB.Connection
    Dim cnn4 As ADODB.Connection

    ' Open a connection without using a Data Source Name (DSN).
    Set cnn1 = New ADODB.Connection
    cnn1.ConnectionString = "driver={SQL Server};" & _
        "server=srv;uid=sa;pwd=;database=Pubs"
    cnn1.ConnectionTimeout = 30
    cnn1.Open

    ' Open a connection using a DSN and ODBC tags.
    Set cnn2 = New ADODB.Connection
    cnn2.ConnectionString = "DSN=Pubs;UID=sa;PWD=;"
    cnn2.Open

    ' Open a connection using a DSN and OLE DB tags.
    Set cnn3 = New ADODB.Connection
    cnn3.ConnectionString = "Data Source=Pubs;User ID=sa;Password=;"
    cnn3.Open

    ' Open a connection using a DSN and individual
    ' arguments instead of a connection string.
    Set cnn4 = New ADODB.Connection
    cnn4.Open "Pubs", "sa", ""

    ' Display the state of the connections.
    MsgBox "cnn1 state: " & GetState(cnn1.State) & vbCr & _
        "cnn2 state: " & GetState(cnn2.State) & vbCr & _
        "cnn3 state: " & GetState(cnn3.State) & vbCr & _
        "cnn4 state: " & GetState(cnn4.State)

    cnn4.Close
    cnn3.Close
    cnn2.Close
    cnn1.Close

End Sub

Public Function GetState(intState As Integer) As String

    Select Case intState
        Case adStateClosed
            GetState = "adStateClosed"
        Case adStateOpen
            GetState = "adStateOpen"
    End Select

End Function


ConvertToString メソッドの例 (VB)

Public Sub ConvertToStringX()
    Dim oRDF As RDSServer.DataFactory
    Dim oRDC As RDS.DataControl
    Dim oRs As ADODB.Recordset
    Dim vString As Variant
    Dim sConnString As String
    Dim sSQL As String

    ' Create a DataFactory object
    Set oRDF = New RDSServer.DataFactory

    ' Get all of the Author records
    sConnString = "Provider=sqloledb;" & _
                        "Data Source=(local);" & _
                        "Initial Catalog=pubs;" & _
                        "Network Library=DBMSSOCN;" & _
                        "Trusted_Connection=Yes;"
    sSQL = "Select * From authors"
    Set oRs = oRDF.Query(sConnString, sSQL)
    Debug.Print oRs.RecordCount

    ' Convert the recordset into a MIME formatted string
    vString = oRDF.ConvertToString(oRs)

    ' Convert string value back into an ADO Recordset
    Set oRDC = New RDS.DataControl
    oRDC.SQL = vString
    oRDC.ExecuteOptions = adcExecSync
    oRDC.FetchOptions = adcFetchUpFront
    oRDC.Refresh
    Debug.Print oRDC.Recordset.RecordCount
End Sub


CopyRecord、CopyTo、SaveToFile メソッドの例 (VB)

この例では、Stream オブジェクトまたは Record オブジェクトを使ってファイルのコピーを作成する方法を示します。インターネットで公開するためのコピーを Web フォルダに 1 つ作成します。Stream Type、Open、LoadFromFile、Record Open など、ほかのプロパティおよびメソッドも示されています。

Public Sub CopyRecordX()
' Declare variables
    Dim strPicturePath, strStreamPath, strStream2Path, _
        strRecordPath, strStreamURL, strRecordURL As String
    Dim objStream, objStream2 As Stream
    Dim objRecord As Record
    Dim objField As Field

    ' Instantiate objects
    Set objStream = New Stream
    Set objStream2 = New Stream
    Set objRecord = New Record

    ' Initialize path and URL strings
    strPicturePath = _
    "C:\Program Files\Microsoft Office\Clipart\Popular\Checkmrk.wmf"
    strStreamPath = "\\adot20\davfs\mywmf.wmf"
    strStreamURL = "URL=http://adot20/davfs/mywmf.wmf"
    strStream2Path = "D:\samples\check2.wmf"
    strRecordPath = "\\adot20\davfs\mywmf2.wmf"
    strRecordURL = "http://adot20/davfs/mywmf2.wmf"

    ' Load the file into the stream
    objStream.Open
    objStream.Type = adTypeBinary
    objStream.LoadFromFile (strPicturePath)

    ' Save the stream to a new path and filename
    objStream.SaveToFile strStreamPath, adSaveCreateOverWrite

    ' Copy the contents of the first stream to a second stream
    objStream2.Open
    objStream2.Type = adTypeBinary
    objStream.CopyTo objStream2

    ' Save the second stream to a different path
    objStream2.SaveToFile strStream2Path, adSaveCreateOverWrite

    ' Because strStreamPath is a Web Folder, open a Record on the URL
    objRecord.Open "", strStreamURL

    ' Display the Fields of the record
    For Each objField In objRecord.Fields
        Debug.Print objField.Name & ": " & objField.Value
    Next

    ' Copy the record to a new URL
    objRecord.CopyRecord "", strRecordURL, , , adCopyOverWrite

    ' Load each copy of the graphic into Image controls for viewing
    Image1.Picture = LoadPicture(strPicturePath)
    Image2.Picture = LoadPicture(strStreamPath)
    Image3.Picture = LoadPicture(strStream2Path)
    Image4.Picture = LoadPicture(strRecordPath)

    ' Clean up
    objStream.Close
    objStream2.Close
    objRecord.Close
End Sub


Count プロパティの例 (VB)

この例では、Employee データベース内の 2 つのコレクションで Count プロパティを使用します。このプロパティで、各コレクション内のオブジェクト数を取得し、これらのコレクションを列挙するループに上限を設定します。Count プロパティを使わずにこれらのコレクションを列挙するには、For Each...Next ステートメントを使用します。

Public Sub CountX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim intloop As Integer

    ' Open recordset with data from Employee table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    ' Print information about Fields collection.
    Debug.Print rstEmployees.Fields.Count & _
        " Fields in Employee"
    For intloop = 0 To rstEmployees.Fields.Count - 1
        Debug.Print "    " & rstEmployees.Fields(intloop).Name
    Next intloop

    ' Print information about Properties collection.
    Debug.Print rstEmployees.Properties.Count & _
        " Properties in Employee"
    For intloop = 0 To rstEmployees.Properties.Count - 1
        Debug.Print "    " & rstEmployees.Properties(intloop).Name
    Next intloop

    rstEmployees.Close

End Sub


CreateRecordset メソッドの例 (VB)

CreateRecordｓet メソッドを使用すると、Recordset オブジェクトを作成し、列情報を指定できます。次に、Recordset オブジェクトにデータを挿入すると、挿入された情報は基になる行セットにバッファされます。

次のコード例では、RDSServer.DataFactory オブジェクトを使った Recordset の定義方法を示します。RDS.DataControl オブジェクトでも、同じように使用できます。

Sub RsDefineShape()

    Dim vntRecordShape(3)
    Dim vntField1Shape(3)
    Dim vntField2Shape(3)
    Dim vntField3Shape(3)
    Dim vntField4Shape(3)

    ' For each field, specify the name,
    ' type, size, and nullability.

    vntField1Shape(0) = "Name"    ' Column name.
    vntField1Shape(1) = CInt(129)    ' Column type.
    vntField1Shape(2) = CInt(40)    ' Column size.
    vntField1Shape(3) = False        ' Nullable?

    vntField2Shape(0) = "Age"
    vntField2Shape (1) = CInt(3)
    vntField2Shape (2) = CInt(-1)
    vntField2Shape (3) = True

    vntField3Shape (0) = "DateOfBirth"
    vntField3Shape (1) = CInt(7)
    vntField3Shape (2) = CInt(-1)
    vntField3Shape (3) = True

    vntField4Shape (0) = "Balance"
    vntField4Shape (1) = CInt(6)
    vntField4Shape (2) = CInt(-1)
    vntField4Shape (3) = True

    ' Put all fields into an array of arrays.
    vntRecordShape(0) = vntField1Shape
    vntRecordShape(1) = vntField2Shape
    vntRecordShape(2) = vntField3Shape
    vntRecordShape(3) = vntField4Shape

    ' Use the RDSServer.DataFactory to create an empty
    ' recordset. It takes an array of variants where
    ' every element is itself another array of
    ' variants, one for every column required in the
    ' recordset.
    ' The elements of the inner array are the column's
    ' name, type, size, and nullability.

    Dim NewRs
    Dim ADF As New RDSServer.DataFactory

    ' You could just use the RDS.DataControl object
    ' instead of the RDSServer.DataFactory object. In
    ' that case, the following code would be Set NewRS
    ' = ADC1.CreateRecordset(vntRecordShape)
    Set NewRS = ADF.CreateRecordset(vntRecordShape)

    Dim fields(3)
    fields(0) = vntField1Shape(0)
    fields(1) = vntField2Shape (0)
    fields(2) = vntField3Shape (0)
    fields(3) = vntField4Shape (0)

    ' Populate the new recordset with data values.
    Dim fieldVals(3)
    Dim ADC1 As New RDS.DataControl

    ' Use AddNew to add the records.
    fieldVals(0) = "Joe"
    fieldVals(1) = 5
    fieldVals(2) = CDate(#1/5/96#)
    fieldVals(3) = 123.456
    NewRS.AddNew fields, fieldVals

    fieldVals(0) = "Mary"
    fieldVals(1) = 6
    fieldVals(2) = CDate(#6/5/96#)
    fieldVals(3) = 31
    NewRS.AddNew fields, fieldVals

    fieldVals(0) = "Alex"
    fieldVals(1) = 13
    fieldVals(2) = CDate(#1/6/96#)
    fieldVals(3) = 34.0001
    NewRS.AddNew fields, fieldVals

    fieldVals(0) = "Susan"
    fieldVals(1) = 13
    fieldVals(2) = CDate(#8/6/96#)
    fieldVals(3) = 0.0
    NewRS.AddNew fields, fieldVals

    NewRS.MoveFirst

    ' Set the newly created and populated Recordset to
    ' the SourceRecordset property of the
    ' RDS.DataControl to bind to visual controls
    Set ADC1.SourceRecordset = NewRS

End Sub


CursorType、LockType、EditMode プロパティの例 (VB)

この例では、Recordset を開く前に CursorType および LockType プロパティを設定します。また、さまざまな条件下での EditMode プロパティの値も示します。このプロシージャを実行するには、EditModeOutput 関数が必要です。

Public Sub EditModeX()

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String

    ' Open recordset with data from Employee table.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    Set rstEmployees = New ADODB.Recordset
    Set rstEmployees.ActiveConnection = cnn1
    rstEmployees.CursorLocation = adUseClient
    rstEmployees.CursorType = adOpenStatic
    rstEmployees.LockType = adLockBatchOptimistic
    rstEmployees.Open "employee", , , , adCmdTable

    ' Show the EditMode property under different editing
    ' states.
    rstEmployees.AddNew
    rstEmployees!emp_id = "T-T55555M"
    rstEmployees!fname = "temp_fname"
    rstEmployees!lname = "temp_lname"
    EditModeOutput "After AddNew:", rstEmployees.EditMode
    rstEmployees.UpdateBatch
    EditModeOutput "After UpdateBatch:", rstEmployees.EditMode
    rstEmployees!fname = "test"
    EditModeOutput "After Edit:", rstEmployees.EditMode
    rstEmployees.Close

    ' Delete new record because this is a demonstration.
    cnn1.Execute "DELETE FROM employee WHERE emp_id = 'T-T55555M'"

End Sub

Public Function EditModeOutput(strTemp As String, _
    intEditMode As Integer)

    ' Print report based on the value of the EditMode
    ' property.
    Debug.Print strTemp
    Debug.Print "  EditMode = ";

    Select Case intEditMode
        Case adEditNone
            Debug.Print "adEditNone"
        Case adEditInProgress
            Debug.Print "adEditInProgress"
        Case adEditAdd
            Debug.Print "adEditAdd"
    End Select

End Function


Delete メソッドの例 (VB)

この例では、Delete メソッドを使って、指定されたレコードを Recordset から削除します。

Public Sub DeleteX()

    Dim rstRoySched As ADODB.Recordset
    Dim strCnn As String
    Dim strMsg As String
    Dim strTitleID As String
    Dim intLoRange As Integer
    Dim intHiRange As Integer
    Dim intRoyalty As Integer

    ' Open RoySched table.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstRoySched = New ADODB.Recordset
    rstRoySched.CursorLocation = adUseClient
    rstRoySched.CursorType = adOpenStatic
    rstRoySched.LockType = adLockBatchOptimistic
    rstRoySched.Open "SELECT * FROM roysched " & _
        "WHERE royalty = 20", strCnn, , , adCmdText

    ' Prompt for a record to delete.
    strMsg = "Before delete there are " & _
        rstRoySched.RecordCount & _
        " titles with 20 percent royalty:" & vbCr & vbCr
    Do While Not rstRoySched.EOF
        strMsg = strMsg & rstRoySched!title_id & vbCr
        rstRoySched.MoveNext
    Loop
    strMsg = strMsg & vbCr & vbCr & _
        "Enter the ID of a record to delete:"
    strTitleID = UCase(InputBox(strMsg))

    ' Move to the record and save data so it can be restored.
    rstRoySched.Filter = "title_id = '" & strTitleID & "'"
    intLoRange = rstRoySched!lorange
    intHiRange = rstRoySched!hirange
    intRoyalty = rstRoySched!royalty

    ' Delete the record.
    rstRoySched.Delete
    rstRoySched.UpdateBatch

    ' Show the results.
    rstRoySched.Filter = adFilterNone
    rstRoySched.Requery
    strMsg = ""
    strMsg = "After delete there are " & _
        rstRoySched.RecordCount & _
        " titles with 20 percent royalty:" & vbCr & vbCr
    Do While Not rstRoySched.EOF
        strMsg = strMsg & rstRoySched!title_id & vbCr
        rstRoySched.MoveNext
    Loop
    MsgBox strMsg

    ' Restore the data because this is a demonstration.
    rstRoySched.AddNew
    rstRoySched!title_id = strTitleID
    rstRoySched!lorange = intLoRange
    rstRoySched!hirange = intHiRange
    rstRoySched!royalty = intRoyalty
    rstRoySched.UpdateBatch

    rstRoySched.Close

End Sub


DeleteRecord、MoveRecord メソッドの例 (VB)

この例では、Web フォルダに公開するテキスト ファイルの内容をコピー、移動、編集、削除する方法を示します。GetChildren、ParentURL、Source、Flush など、ほかのプロパティおよびメソッドも示されています。

Public Sub DeleteRecordX()
    'Declare variables
    Dim i As Integer
    Dim objStream As Stream
    Dim strLine, strChar As String

    'Instantiate and open stream
    Set objStream = New Stream
    objStream.Open

    'Set line separator to line feed
    objStream.LineSeparator = adLF

    'Load text content of list box into stream
    'One line at a time
    For i = 0 To (List1.ListCount - 1)
        objStream.WriteText List1.List(i), adWriteLine
    Next

    'Display the entire stream
    Debug.Print "Whole Stream:"
    objStream.Position = 0
    Debug.Print objStream.ReadText

    'Display the first line
    Debug.Print "First Line:"
    objStream.Position = 0
    strLine = objStream.ReadText(adReadLine)
    Debug.Print strLine
    Debug.Print "Line length: " + str(Len(strLine))

    'Skip a line, then display another line
    Debug.Print "Third Line:"
    objStream.SkipLine
    strLine = objStream.ReadText(adReadLine)
    Debug.Print strLine
    Debug.Print "Line length: " + str(Len(strLine))

    'Switch line separator to carriage return
    'All items from list will be considered one line
    'Assuming no CRs have been loaded into stream
    Debug.Print "Whole Stream/First Line:"
    objStream.Position = 0
    objStream.LineSeparator = adCR
    strLine = objStream.ReadText(adReadLine)
    Debug.Print strLine
    Debug.Print "Line length: " + str(Len(strLine))
    Debug.Print "Stream size: " + str(objStream.Size)

    'Use EOS to Determine End of Stream
    Debug.Print "Character by character:"
    objStream.Position = 0
    Do Until objStream.EOS
        strChar = objStream.ReadText(1)
        Debug.Print strChar
    Loop
End Sub


Description、NativeError、Number、Source、SQLState プロパティの例 (VB)

この例では、エラーを発生させてトラップし、生成された Error オブジェクトの Description、HelpContext、HelpFile、NativeError、Number、Source、および SQLState プロパティを表示します。

Public Sub DescriptionX()

    Dim cnn1 As ADODB.Connection
    Dim errLoop As ADODB.Error
    Dim strError As String

    On Error GoTo ErrorHandler

    ' Intentionally trigger an error.
    Set cnn1 = New ADODB.Connection
    cnn1.Open "nothing"

    Exit Sub

ErrorHandler:

    ' Enumerate Errors collection and display
    ' properties of each Error object.
    For Each errLoop In cnn1.Errors
        strError = "Error #" & errLoop.Number & vbCr & _
            "    " & errLoop.Description & vbCr & _
            "    (Source: " & errLoop.Source & ")" & vbCr & _
            "    (SQL State: " & errLoop.SQLState & ")" & vbCr & _
            "    (NativeError: " & errLoop.NativeError & ")" & vbCr
        If errLoop.HelpFile = "" Then
            strError = strError & _
                "    No Help file available" & _
                vbCr & vbCr
        Else
            strError = strError & _
                "    (HelpFile: " & errLoop.HelpFile & ")" & vbCr & _
                "    (HelpContext: " & errLoop.HelpContext & ")" & _
                vbCr & vbCr
        End If

    Debug.Print strError
    Next

    Resume Next

End Sub


EOS、LineSeparator プロパティと SkipLine メソッドの例 (VB)

この例では、テキスト ストリームを 1 行ずつ処理する方法を示します。行区切り文字を、既定の改行復帰/行送り (adCRLF) から、単純な行送り (adLF) または改行復帰 (adCR) に変更した結果も示します。

Public Sub SkipLineX()
    'Declare variables
    Dim i As Integer
    Dim objStream As Stream
    Dim strLine, strChar As String

    'Instantiate and open stream
    Set objStream = New Stream
    objStream.Open

    'Set line separator to line feed
    objStream.LineSeparator = adLF

    'Load text content of list box into stream
    'One line at a time
    For i = 0 To (List1.ListCount - 1)
        objStream.WriteText List1.List(i), adWriteLine
    Next

    'Display the entire stream
    Debug.Print "Whole Stream:"
    objStream.Position = 0
    Debug.Print objStream.ReadText

    'Display the first line
    Debug.Print "First Line:"
    objStream.Position = 0
    strLine = objStream.ReadText(adReadLine)
    Debug.Print strLine
    Debug.Print "Line length: " + str(Len(strLine))

    'Skip a line, then display another line
    Debug.Print "Third Line:"
    objStream.SkipLine
    strLine = objStream.ReadText(adReadLine)
    Debug.Print strLine
    Debug.Print "Line length: " + str(Len(strLine))

    'Switch line separator to carriage return
    'All items from list will be considered one line
    'Assuming no CRs have been loaded into stream
    Debug.Print "Whole Stream/First Line:"
    objStream.Position = 0
    objStream.LineSeparator = adCR
    strLine = objStream.ReadText(adReadLine)
    Debug.Print strLine
    Debug.Print "Line length: " + str(Len(strLine))
    Debug.Print "Stream size: " + str(objStream.Size)

    'Use EOS to Determine End of Stream
    Debug.Print "Character by character:"
    objStream.Position = 0
    Do Until objStream.EOS
        strChar = objStream.ReadText(1)
        Debug.Print strChar
    Loop
End Sub


Execute、Requery、Clear メソッドの例 (VB)

この例では、Command オブジェクトの Execute メソッドを実行する場合と Connection オブジェクトの Execute メソッドを実行する場合を示します。また、Requery メソッドを使って Recordset オブジェクト内の最新のデータを取得し、Clear メソッドを使って Errors コレクションの内容をクリアします。(Errors コレクションは、Recordset の ActiveConnection プロパティの Connection オブジェクトからアクセスします。)このプロシージャを実行するには、ExecuteCommand と PrintOutput プロシージャが必要です。

Public Sub ExecuteX()

    Dim strSQLChange As String
    Dim strSQLRestore As String
    Dim strCnn As String
    Dim cnn1 As ADODB.Connection
    Dim cmdChange As ADODB.Command
    Dim rstTitles As ADODB.Recordset
    Dim errLoop As ADODB.Error

    ' Define two SQL statements to execute as command text.
    strSQLChange = "UPDATE Titles SET Type = " & _
        "'self_help' WHERE Type = 'psychology'"
    strSQLRestore = "UPDATE Titles SET Type = " & _
        "'psychology' WHERE Type = 'self_help'"

    ' Open connection.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn

    ' Create command object.
    Set cmdChange = New ADODB.Command
    Set cmdChange.ActiveConnection = cnn1
    cmdChange.CommandText = strSQLChange

    ' Open titles table.
    Set rstTitles = New ADODB.Recordset
    rstTitles.Open "titles", cnn1, , , adCmdTable

    ' Print report of original data.
    Debug.Print _
        "Data in Titles table before executing the query"
    PrintOutput rstTitles

    ' Clear extraneous errors from the Errors collection.
    cnn1.Errors.Clear

    ' Call the ExecuteCommand subroutine to execute cmdChange command.
    ExecuteCommand cmdChange, rstTitles

    ' Print report of new data.
    Debug.Print _
        "Data in Titles table after executing the query"
    PrintOutput rstTitles

    ' Use the Connection object's execute method to
    ' execute SQL statement to restore data. Trap for
    ' errors, checking the Errors collection if necessary.
    On Error GoTo Err_Execute
    cnn1.Execute strSQLRestore, , adExecuteNoRecords
    On Error GoTo 0

    ' Retrieve the current data by requerying the recordset.
    rstTitles.Requery

    ' Print report of restored data.
    Debug.Print "Data after executing the query " & _
        "to restore the original information"
    PrintOutput rstTitles

    rstTitles.Close
    cnn1.Close

    Exit Sub

Err_Execute:

    ' Notify user of any errors that result from
    ' executing the query.
    If rstTitles.ActiveConnection.Errors.Count >= 0 Then
        For Each errLoop In rstTitles.ActiveConnection.Errors
            MsgBox "Error number: " & errLoop.Number & vbCr & _
                errLoop.Description
        Next errLoop
    End If
    Resume Next

End Sub

Public Sub ExecuteCommand(cmdTemp As ADODB.Command, _
    rstTemp As ADODB.Recordset)

    Dim errLoop As Error

    ' Run the specified Command object. Trap for
    ' errors, checking the Errors collection if necessary.
    On Error GoTo Err_Execute
    cmdTemp.Execute
    On Error GoTo 0

    ' Retrieve the current data by requerying the recordset.
    rstTemp.Requery

    Exit Sub

Err_Execute:

    ' Notify user of any errors that result from
    ' executing the query.
    If rstTemp.ActiveConnection.Errors.Count > 0 Then
        For Each errLoop In Errors
            MsgBox "Error number: " & errLoop.Number & vbCr & _
                errLoop.Description
        Next errLoop
    End If

    Resume Next

End Sub

Public Sub PrintOutput(rstTemp As ADODB.Recordset)

    ' Enumerate Recordset.
    Do While Not rstTemp.EOF
        Debug.Print "  " & rstTemp!Title & _
            ", " & rstTemp!Type
        rstTemp.MoveNext
    Loop

End Sub


Filter、RecordCount プロパティの例 (VB)

この例では、Filter プロパティを使って、既存の Recordset に適用されている特定の条件に基づいて新規 Recordset を開きます。RecordCount プロパティを使って、2 つのレコードセット内のレコードの数を示します。このプロシージャを実行するには、FilterField 関数が必要です。

Public Sub FilterX()

    Dim rstPublishers As ADODB.Recordset
    Dim rstPublishersCountry As ADODB.Recordset
    Dim strCnn As String
    Dim intPublisherCount As Integer
    Dim strCountry As String
    Dim strMessage As String

    ' Open recordset with data from Publishers table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstPublishers = New ADODB.Recordset
    rstPublishers.CursorType = adOpenStatic
    rstPublishers.Open "publishers", strCnn, , , adCmdTable

    ' Populate the Recordset.
    intPublisherCount = rstPublishers.RecordCount

    ' Get user input.
    strCountry = Trim(InputBox( _
        "Enter a country to filter on:"))

    If strCountry <> "" Then
        ' Open a filtered Recordset object.
        Set rstPublishersCountry = _
            FilterField(rstPublishers, "Country", strCountry)

        If rstPublishersCountry.RecordCount = 0 Then
            MsgBox "No publishers from that country."
        Else
            ' Print number of records for the original
            ' Recordset object and the filtered Recordset
            ' object.
            strMessage = "Orders in original recordset: " & _
                vbCr & intPublisherCount & vbCr & _
                "Orders in filtered recordset (Country = '" & _
                strCountry & "'): " & vbCr & _
                rstPublishersCountry.RecordCount
            MsgBox strMessage
        End If
        rstPublishersCountry.Close

    End If

End Sub

Public Function FilterField(rstTemp As ADODB.Recordset, _
    strField As String, strFilter As String) As ADODB.Recordset

    ' Set a filter on the specified Recordset object and then
    ' open a new Recordset object.
    rstTemp.Filter = strField & " = '" & strFilter & "'"
    Set FilterField = rstTemp

End Function

注意 選択するデータがわかっている場合、SQL ステートメントを使用して Recordset を開くのが効率的です。この例は、単一の Recordset から、特定の国についてのレコードを取得する方法を示します。

Public Sub FilterX2()

    Dim rstPublishers As ADODB.Recordset
    Dim strCnn As String

    ' Open recordset with data from Publishers table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstPublishers = New ADODB.Recordset
    rstPublishers.CursorType = adOpenStatic
    rstPublishers.Open "SELECT * FROM publishers " & _
        "WHERE Country = 'USA'", strCnn, , , adCmdText

    ' Print current data in recordset.
    rstPublishers.MoveFirst
    Do While Not rstPublishers.EOF
        Debug.Print rstPublishers!pub_name & ", " & _
            rstPublishers!country
        rstPublishers.MoveNext
    Loop

    rstPublishers.Close

End Sub


Find メソッドの例 (VB)

この例では、Recordset オブジェクトの Find メソッドを使って、Pubs データベースのビジネス タイトルを検索して位置を定め、その数をカウントします。この例は、基になるプロバイダが類似の機能をサポートしていない場合を想定しています。

Public Sub Main()
    FindX
End Sub

Public Sub FindX()
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim mark As Variant
Dim count As Integer

count = 0
cnn.Open "DSN=Pubs; Provider=MSDASQL; uid=sa; pwd=;"
rst.Open "SELECT title_id FROM titles", cnn, _
            adOpenStatic, adLockReadOnly, adCmdText

' The default parameters are sufficient to search forward
' through a Recordset.

rst.Find "title_id LIKE 'BU%'"

' Skip the current record to avoid finding the same row repeatedly.
' The bookmark is redundant because Find searches from the current
' position.

Do While rst.EOF <> True    'Continue if last find succeeded.
    Debug.Print "Title ID: "; rst!title_id
    count = count + 1        'Count the last title found.
    mark = rst.Bookmark      'Note current position.
    rst.Find "title_id LIKE 'BU%'", 1, adSearchForward, mark
Loop

rst.Close
cnn.Close
Debug.Print "The number of business titles is " & count

End Sub


GetRows メソッドの例 (VB)

この例では、GetRows メソッドを使って、指定された数の行を Recordset から取得し、結果のデータを配列に格納します。GetRows メソッドは、2 つのケースにおいて、要求される行数よりも少ない数を返します。1 つは EOF に達した場合で、もう 1 つは GetRows が別のユーザーによって削除されたレコードを取得しようとした場合です。関数は、2 番目のケースが発生した場合にのみ、False を返します。このプロシージャを実行するには、GetRowsOK 関数が必要です。

Public Sub GetRowsX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String
    Dim intRows As Integer
    Dim avarRecords As Variant
    Dim intRecord As Integer

    ' Open recordset with names and hire dates from employee table.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "SELECT fName, lName, hire_date " & _
        "FROM Employee ORDER BY lName", strCnn, , , adCmdText

    Do While True
        ' Get user input for number of rows.
        strMessage = "Enter number of rows to retrieve."
        intRows = Val(InputBox(strMessage))

        If intRows <= 0 Then Exit Do

        ' If GetRowsOK is successful, print the results,
        ' noting if the end of the file was reached.
        If GetRowsOK(rstEmployees, intRows, _
                avarRecords) Then
            If intRows > UBound(avarRecords, 2) + 1 Then
                Debug.Print "(Not enough records in " & _
                    "Recordset to retrieve " & intRows & _
                    " rows.)"
            End If
            Debug.Print UBound(avarRecords, 2) + 1 & _
                " records found."

            ' Print the retrieved data.
            For intRecord = 0 To UBound(avarRecords, 2)
                Debug.Print "  " & _
                    avarRecords(0, intRecord) & " " & _
                    avarRecords(1, intRecord) & ", " & _
                    avarRecords(2, intRecord)
            Next intRecord
        Else
            ' Assuming the GetRows error was due to data
            ' changes by another user, use Requery to
            ' refresh the Recordset and start over.
            If MsgBox("GetRows failed--retry?", _
                    vbYesNo) = vbYes Then
                rstEmployees.Requery
            Else
                Debug.Print "GetRows failed!"
                Exit Do
            End If
        End If

        ' Because using GetRows leaves the current
        ' record pointer at the last record accessed,
        ' move the pointer back to the beginning of the
        ' Recordset before looping back for another search.
        rstEmployees.MoveFirst
    Loop

    rstEmployees.Close

End Sub

Public Function GetRowsOK(rstTemp As ADODB.Recordset, _
    intNumber As Integer, avarData As Variant) As Boolean

    ' Store results of GetRows method in array.
    avarData = rstTemp.GetRows(intNumber)
    ' Return False only if fewer than the desired
    ' number of rows were returned, but not because the
    ' end of the Recordset was reached.
    If intNumber > UBound(avarData, 2) + 1 And _
            Not rstTemp.EOF Then
        GetRowsOK = False
    Else
        GetRowsOK = True
    End If

End Function


GetString メソッドの例 (VB)

この例では、GetString メソッドの機能を示します。

ユーザーは、データ アクセスの問題をデバッグ中で、小規模な Recordset の現在の内容をすばやく簡単に出力する方法を必要としているとします。

Public Sub Main()
    GetStringX
End Sub

Public Sub GetStringX()

Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim varOutput As Variant
Dim strQuery As String
Dim strPrompt As String

Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
strPrompt = "Enter a state (CA, IN, KS, MD, MI, OR, TN, UT): "
strState = Trim(InputBox(strPrompt, "GetString Example"))
strQuery = "SELECT au_fname, au_lname, address, city FROM Authors " & _
                "WHERE state = '" & strState & "'"

cnn.Open "DSN=Pubs;Provider=MSDASQL; uid=sa;pwd=;"
rst.Open strQuery, cnn, adOpenStatic, adLockReadOnly, adCmdText

If rst.RecordCount > 0 Then
'Use all defaults: get all rows, TAB column delimiter, CARRIAGE RETURN
'row delimiter, empty-string null delimiter
    varOutput = rst.GetString(adClipString)
    Debug.Print "State = '" & strState & "'"
    Debug.Print "Name             Address             City" & vbCr
    Debug.Print varOutput
Else
    Debug.Print "No rows found for state = '" & strState & "'" & vbCr
End If

rst.Close
cnn.Close
End Sub


Handler プロパティの例 (VB)

この例では、RDS.DataControl オブジェクトの Handler プロパティの機能を示します。詳細については、「DataFactory のカスタマイズ」を参照してください。

サーバー上のパラメータ ファイル MSDFMAP.INI に、次のセクションがあるとします。

[connect AuthorDataBase]
Access=ReadWrite
Connect="DSN=Pubs;UID=sa;PWD=;"
[sql AuthorById]
SQL="SELECT * FROM Authors WHERE au_id = ?"

コードは次のようになります。SQL プロパティに割り当てられたコマンドは識別子 AuthorById に一致するので、Michael O'Leary という author の行を取得します。コード中の Connect プロパティは Northwind データ ソースを指定していますが、このデータ ソースは、MSDFMAP.INI の connect セクションにより上書きされます。DataControl オブジェクトの Recordset プロパティは、コーディングの便宜上、接続されていない Recordset オブジェクトに割り当てられます。

Public Sub Main()
    HandlerX
End Sub

Public Sub HandlerX()
Dim dc As New DataControl
Dim rst As ADODB.Recordset

dc.Handler = "MSDFMAP.Handler"
dc.Server = "http://YourServer"
dc.Connect = "Data Source=AuthorDataBase"
dc.SQL = "AuthorById('267-41-2394')"
dc.Refresh                  'Retrieve the record
Set rst = dc.Recordset      'Use another Recordset as a convenience
Debug.Print "Author is '" & rst!au_fname & " " & rst!au_lname & "'"

End Sub


InternetTimeout プロパティの例 (VB)

この例では、DataControl と DataSpace オブジェクトにある InternetTimeout プロパティの機能を示します。ここでは、DataControl オブジェクトを使ってタイムアウトを 20 秒に設定します。

Sub Main()
    InternetTimeoutX
End Sub

Public Sub InternetTimeoutX()
Dim dc As New DataControl
Dim rst As ADODB.Recordset

dc.Server = "http://yourServer"
dc.Connect = "DSN=Pubs;UID=sa;PWD=;"
dc.SQL = "SELECT * FROM Authors"
dc.InternetTimeout = 20000  'Wait at least 20 seconds.
dc.Refresh
Set rst = dc.Recordset      'Use another Recordset as a convenience
While Not rst.EOF
    Debug.Print rst!au_fname & " " & rst!au_lname
    rst.MoveNext
Wend

rst.Close
End Sub


IsolationLevel、Mode プロパティの例 (VB)

この例では、Mode プロパティを使って排他的接続を開き、IsolationLevel プロパティを使ってほかのトランザクションから独立したトランザクションを開きます。

Public Sub IsolationLevelX()

    Dim cnn1 As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String

    ' Assign connection string to variable.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "

    ' Open connection and Titles table.
    Set cnn1 = New ADODB.Connection
    cnn1.Mode = adModeShareExclusive
    cnn1.IsolationLevel = adXactIsolated
    cnn1.Open strCnn

    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenDynamic
    rstTitles.LockType = adLockPessimistic
    rstTitles.Open "Titles", cnn1, , , adCmdTable

    cnn1.BeginTrans

    ' Display connection mode.
    If cnn1.Mode = adModeShareExclusive Then
        MsgBox "Connection mode is exclusive."
    Else
        MsgBox "Connection mode is not exclusive."
    End If

    ' Display isolation level.
    If cnn1.IsolationLevel = adXactIsolated Then
        MsgBox "Transaction is isolated."
    Else
        MsgBox "Transaction is not isolated."
    End If

    ' Change the type of psychology titles.
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            rstTitles!Type = "self_help"
            rstTitles.Update
        End If
        rstTitles.MoveNext
    Loop

    ' Print current data in recordset.
    rstTitles.Requery
    Do While Not rstTitles.EOF
        Debug.Print rstTitles!Title & " - " & rstTitles!Type
        rstTitles.MoveNext
    Loop

    ' Restore original data.
    cnn1.RollbackTrans
    rstTitles.Close

    cnn1.Close

End Sub


Item プロパティの例 (VB)

この例では、Item プロパティを使ってコレクションのメンバにアクセスする方法を示します。ここでは、パラメータ化コマンドを使って Pubs データベースの Authors テーブルを開きます。

データベースに対して発行されるコマンドのパラメータには、Command オブジェクトの Parameters コレクションからインデックスおよび名前によってアクセスします。返される Recordset のフィールドには、そのオブジェクトの Fields コレクションからインデックスおよび名前によってアクセスします。

Public Sub Main()
    ItemX
End Sub

Public Sub ItemX()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim cmd As ADODB.Command
Dim prm As ADODB.Parameter
Dim fld As ADODB.Field
Dim ix As Integer
Dim limit As Long
Dim Column(0 To 8) As Variant

Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
Set cmd = New ADODB.Command

'Set the array with the Authors table field (column) names
Column(0) = "au_id"
Column(1) = "au_lname"
Column(2) = "au_fname"
Column(3) = "phone"
Column(4) = "address"
Column(5) = "city"
Column(6) = "state"
Column(7) = "zip"
Column(8) = "contract"

cmd.CommandText = "SELECT * FROM Authors WHERE state = ?"
Set prm = cmd.CreateParameter("ItemXparm", adChar, adParamInput, 2, "CA")
cmd.Parameters.Append prm

cnn.Open "DSN=Pubs;Provider=MSDASQL; uid=sa;pwd=;"
cmd.ActiveConnection = cnn
'Connection and CommandType are omitted because a Command object is
'provided.
rst.Open cmd, , adOpenStatic, adLockReadOnly

Debug.Print "The Parameters collection accessed by index..."
Set prm = cmd.Parameters.Item(0)
Debug.Print "Parameter name = '"; prm.name; "', value = '"; prm.Value; _
                "'"
Debug.Print

Debug.Print "The Parameters collection accessed by name..."
Set prm = cmd.Parameters.Item("ItemXparm")
Debug.Print "Parameter name = '"; prm.name; "', value = '"; prm.Value; _
                "'"
Debug.Print

Debug.Print "The Fields collection accessed by index..."
rst.MoveFirst
limit = rst.Fields.Count - 1
For ix = 0 To limit
    Set fld = rst.Fields.Item(ix)
    Debug.Print "Field "; ix; ": Name = '"; fld.name; _
                    "', Value = '"; fld.Value; "'"
Next ix
Debug.Print

Debug.Print "The Fields collection accessed by name..."
rst.MoveFirst
For ix = 0 To 8
    Set fld = rst.Fields.Item(Column(ix))
    Debug.Print "Field name = '"; fld.name; "', Value = '"; fld.Value; "'"
Next ix

rst.Close
cnn.Close
End Sub


MarshalOptions プロパティの例 (VB)

この例では、MarshalOptions プロパティを使って、サーバーに送り返される行 (すべての行または修正された行のみ) を特定します。

Public Sub MarshalOptionsX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strOldFirst As String
    Dim strOldLast As String
    Dim strMessage As String
    Dim strMarshalAll As String
    Dim strMarshalModified As String

    ' Open recordset with names from Employees table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.CursorLocation = adUseClient
    rstEmployees.Open "SELECT fname, lname " & _
        "FROM Employee ORDER BY lname", strCnn, , , adCmdText

    ' Store original data.
    strOldFirst = rstEmployees!fname
    strOldLast = rstEmployees!lname

    ' Change data in edit buffer.
    rstEmployees!fname = "Linda"
    rstEmployees!lname = "Kobara"

    ' Show contents of buffer and get user input.
    strMessage = "Edit in progress:" & vbCr & _
        " Original data = " & strOldFirst & " " & _
        strOldLast & vbCr & " Data in buffer = " & _
        rstEmployees!fname & " " & rstEmployees!lname & vbCr & vbCr & _
        "Use Update to replace the original data with " & _
        "the buffered data in the Recordset?"
    strMarshalAll = "Would you like to send all the rows " & _
                    "in the recordset back to the server?"
    strMarshalModified = "Would you like to send only " & _
                    "modified rows back to the server?"

    If MsgBox(strMessage, vbYesNo) = vbYes Then
        If MsgBox(strMarshalAll, vbYesNo) = vbYes Then
            rstEmployees.MarshalOptions = adMarshalAll
            rstEmployees.Update
        ElseIf MsgBox(strMarshalModified, vbYesNo) = vbYes Then
            rstEmployees.MarshalOptions = adMarshalModifiedOnly
            rstEmployees.Update
        End If
    End If

    ' Show the resulting data.
    MsgBox "Data in recordset = " & rstEmployees!fname & " " & _
        rstEmployees!lname

    ' Restore original data because this is a demonstration.
    If Not (strOldFirst = rstEmployees!fname And _
            strOldLast = rstEmployees!lname) Then
        rstEmployees!fname = strOldFirst
        rstEmployees!lname = strOldLast
        rstEmployees.Update
    End If

    rstEmployees.Close

End Sub


MaxRecords プロパティの例 (VB)

次の例では、MaxRecords プロパティを使って、Titles テーブル中の最も高価な 10 タイトルを含む Recordset を開きます。

Public Sub MaxRecordsX()

    Dim rstTemp As ADODB.Recordset
    Dim strCnn As String

    ' Open recordset containing the 10 most expensive
    ' titles in the Titles table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstTemp = New ADODB.Recordset
    rstTemp.MaxRecords = 10
    rstTemp.Open "SELECT Title, Price FROM Titles " & _
        "ORDER BY Price DESC", strCnn, , , adCmdText

    ' Display the contents of the recordset.
    Debug.Print "Top Ten Titles by Price:"

    Do While Not rstTemp.EOF
        Debug.Print "  " & rstTemp!Title & " - " & rstTemp!Price
        rstTemp.MoveNext
    Loop
    rstTemp.Close

End Sub


Move メソッドの例 (VB)

この例では、Move メソッドを使って、ユーザーの入力に基づいてレコード ポインタを配置します。

Public Sub MoveX()

    Dim rstAuthors As ADODB.Recordset
    Dim strCnn As String
    Dim varBookmark As Variant
    Dim strCommand As String
    Dim lngMove As Long

    ' Open recordset from Authors table.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.CursorType = adOpenStatic
    ' Use client cursor to allow use of
    ' AbsolutePosition property.
    rstAuthors.CursorLocation = adUseClient
    rstAuthors.Open "SELECT au_id, au_fname, au_lname, city, state " & _
        "FROM Authors ORDER BY au_lname", strCnn, , , adCmdText

    rstAuthors.MoveFirst

    Do While True
        ' Display information about current record and
        ' ask how many records to move.

        strCommand = InputBox( _
            "Record " & rstAuthors.AbsolutePosition & _
            " of " & rstAuthors.RecordCount & vbCr & _
            "Author: " & rstAuthors!au_fname & _
            " " & rstAuthors!au_lname & vbCr & _
            "Location: " & rstAuthors!City & _
            ", " & rstAuthors!State & vbCr & vbCr & _
            "Enter number of records to Move " & _
            "(positive or negative).")

        If strCommand = "" Then Exit Do

        ' Store bookmark in case the Move goes too far
        ' forward or backward.
        varBookmark = rstAuthors.Bookmark

        ' Move method requires parameter of data type Long.
        lngMove = CLng(strCommand)
        rstAuthors.Move lngMove

        ' Trap for BOF or EOF.
        If rstAuthors.BOF Then
            MsgBox "Too far backward! " & _
                "Returning to current record."
            rstAuthors.Bookmark = varBookmark
        End If
        If rstAuthors.EOF Then
            MsgBox "Too far forward! " & _
                "Returning to current record."
            rstAuthors.Bookmark = varBookmark
        End If
    Loop
    rstAuthors.Close

End Sub


MoveFirst、MoveLast、MoveNext、MovePrevious メソッドの例 (VB)

この例では、与えられたコマンドに基づいて Recordset のレコード ポインタを移動するのに、MoveFirst、MoveLast、MoveNext、および MovePrevious メソッドを使います。実行するには、このプロシージャに MoveAny プロシージャが必要です。

Public Sub MoveFirstX()

    Dim rstAuthors As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String
    Dim intCommand As Integer

    ' Open recordset from Authors table.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.CursorType = adOpenStatic
    ' Use client cursor to enable AbsolutePosition property.
    rstAuthors.CursorLocation = adUseClient
    rstAuthors.Open "Authors", strCnn, , , adCmdTable

    ' Show current record information and get user's method choice.
    Do While True

        strMessage = "Name: " & rstAuthors!au_fName & " " & _
            rstAuthors!au_lName & vbCr & "Record " & _
            rstAuthors.AbsolutePosition & " of " & _
            rstAuthors.RecordCount & vbCr & vbCr & _
            "[1 - MoveFirst, 2 - MoveLast, " & vbCr & _
            "3 - MoveNext, 4 - MovePrevious]"
        intCommand = Val(Left(InputBox(strMessage), 1))
        If intCommand < 1 Or intCommand > 4 Then Exit Do

        ' Call method based on user's input.
        MoveAny intCommand, rstAuthors
    Loop
    rstAuthors.Close

End Sub

Public Sub MoveAny(intChoice As Integer, _
    rstTemp As Recordset)

    ' Use specified method, trapping for BOF and EOF.
    Select Case intChoice
        Case 1
            rstTemp.MoveFirst
        Case 2
            rstTemp.MoveLast
        Case 3
            rstTemp.MoveNext
            If rstTemp.EOF Then
                MsgBox "Already at end of recordset!"
                rstTemp.MoveLast
            End If
        Case 4
            rstTemp.MovePrevious
            If rstTemp.BOF Then
                MsgBox "Already at beginning of recordset!"
                rstTemp.MoveFirst
            End If
    End Select

End Sub


NextRecordset メソッドの例 (VB)

この例では、NextRecordset メソッドを使って、3 つに分割された SELECT ステートメントからなる複合コマンド ステートメントを使用する、レコードセット内のデータを参照します。

Public Sub NextRecordsetX()

    Dim rstCompound As New ADODB.Recordset
    Dim strCnn As String
    Dim intCount As Integer

    ' Open compound recordset.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "

    Set rstCompound = New ADODB.Recordset
    rstCompound.Open "SELECT * FROM Authors; " & _
        "SELECT * FROM stores; " & _
        "SELECT * FROM jobs", strCnn, , , adCmdText

    ' Display results from each SELECT statement.
    intCount = 1
    Do Until rstCompound.State = adStateClosed
        Debug.Print "Contents of recordset #" & intCount
        Do While Not rstCompound.EOF
            Debug.Print , rstCompound.Fields(0), _
                rstCompound.Fields(1)
            rstCompound.MoveNext
        Loop

        Set rstCompound = rstCompound.NextRecordset
        intCount = intCount + 1
    Loop

End Sub


NumericScale、Precision プロパティの例 (VB)

この例では、NumericScale、Precision プロパティを使って、Pubs データベースの Discounts テーブル内にあるフィールドの小数点の桁数と精度を表示します。

Public Sub NumericScaleX()

    Dim rstDiscounts As ADODB.Recordset
    Dim fldTemp As ADODB.Field
    Dim strCnn As String

    ' Open recordset.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstDiscounts = New ADODB.Recordset
    rstDiscounts.Open "Discounts", strCnn, , , adCmdTable

    ' Display numeric scale and precision of
    ' numeric and small integer fields.
    For Each fldTemp In rstDiscounts.Fields
        If fldTemp.Type = adNumeric _
            Or fldTemp.Type = adSmallInt Then
            MsgBox "Field: " & fldTemp.Name & vbCr & _
                "Numeric scale: " & _
                    fldTemp.NumericScale & vbCr & _
                "Precision: " & fldTemp.Precision
        End If
    Next fldTemp

    rstDiscounts.Close

End Sub


Open、Close メソッドの例 (VB)

この例では、開かれている Recordset と Connection オブジェクトの両方に、Open と Close メソッドを使用します。

Public Sub OpenX()

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim varDate As Variant

    ' Open connection.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn

    ' Open employee table.
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.Open "employee", cnn1, , , adCmdTable

    ' Assign the first employee record's hire date
    ' to a variable, then change the hire date.
    varDate = rstEmployees!hire_date
    Debug.Print "Original data"
    Debug.Print "  Name - Hire Date"
    Debug.Print "  " & rstEmployees!fName & " " & _
        rstEmployees!lName & " - " & rstEmployees!hire_date
    rstEmployees!hire_date = #1/1/1900#
    rstEmployees.Update
    Debug.Print "Changed data"
    Debug.Print "  Name - Hire Date"
    Debug.Print "  " & rstEmployees!fName & " " & _
        rstEmployees!lName & " - " & rstEmployees!hire_date

    ' Requery Recordset and reset the hire date.
    rstEmployees.Requery
    rstEmployees!hire_date = varDate
    rstEmployees.Update
    Debug.Print "Data after reset"
    Debug.Print "  Name - Hire Date"
    Debug.Print "  " & rstEmployees!fName & " " & _
        rstEmployees!lName & " - " & rstEmployees!hire_date

    rstEmployees.Close
    cnn1.Close

End Sub


OpenSchema メソッドの例 (VB)

この例では、OpenSchema メソッドを使って、Pubs データベース内の、それぞれのテーブルの名前と種類を表示します。

Public Sub OpenSchemaX()

    Dim cnn1 As ADODB.Connection
    Dim rstSchema As ADODB.Recordset
    Dim strCnn As String

    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    Set rstSchema = cnn1.OpenSchema(adSchemaTables)

    Do Until rstSchema.EOF
        Debug.Print "Table name: " & _
            rstSchema!TABLE_NAME & vbCr & _
            "Table type: " & rstSchema!TABLE_TYPE & vbCr
        rstSchema.MoveNext
    Loop
    rstSchema.Close

    cnn1.Close

End Sub

この例では、OpenSchema メソッドの Criteria 引数内に TABLE_TYPE クエリ制約を指定します。結果として、Pubs データベースに指定された Views に関するスキーマ情報のみが返されます。そして、この例ではそれぞれのテーブルの名前と種類が表示されます。

Public Sub OpenSchemaX2()

    Dim cnn2 As ADODB.Connection
    Dim rstSchema As ADODB.Recordset
    Dim strCnn As String

    Set cnn2 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn2.Open strCnn

    Set rstSchema = cnn2.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "VIEW"))

        Do Until rstSchema.EOF
            Debug.Print "Table name: " & _
                rstSchema!TABLE_NAME & vbCr & _
                "Table type: " & rstSchema!TABLE_TYPE & vbCr
            rstSchema.MoveNext
        Loop
    rstSchema.Close

    cnn2.Close

End Sub


Optimize プロパティの例 (VB)

この例では、Field オブジェクトのダイナミック Optimize プロパティの機能を示します。Pubs データベース内の Authors テーブルの zip フィールドには、インデックスが作成されていません。zip フィールドの Optimize プロパティを True に設定すると、ADO によってインデックスが作成され、Find メソッドのパフォーマンスが向上します。

Sub Main()
    OptimizeX
End Sub

Public Sub OptimizeX()
Dim rst As ADODB.Recordset

Set rst = New ADODB.Recordset
rst.CursorLocation = adUseClient        'Enable index creation
rst.Open "SELECT * FROM Authors", _
            "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;", _
            adOpenStatic, adLockReadOnly, adCmdText
rst!zip.Properties("Optimize") = True   'Create the index
rst.Find "zip = '94595'"                'Find Akiko Yokomoto
Debug.Print rst!au_fname & " " & rst!au_lname & " " & _
            rst!address & " " & rst!city & " " & rst!State
rst!zip.Properties("Optimize") = False  'Delete the index

rst.Close
End Sub


OriginalValue、UnderlyingValue プロパティの例 (VB)

この例では、OriginalValue および UnderlyingValue プロパティを使って、Recordset のバッチ更新中にレコードの基になるデータが変更された場合に、メッセージを表示します。

Public Sub OriginalValueX()

    Dim cnn1 As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim fldType As ADODB.Field
    Dim strCnn As String

    ' Open connection.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Open recordset for batch update.
    Set rstTitles = New ADODB.Recordset
    Set rstTitles.ActiveConnection = cnn1
    rstTitles.CursorType = adOpenKeyset
    rstTitles.LockType = adLockBatchOptimistic
    rstTitles.Open "Titles"

    ' Set field object variable for Type field.
    Set fldType = rstTitles!Type

    ' Change the type of psychology titles.
    Do Until rstTitles.EOF
        If Trim(fldType) = "psychology" Then
            fldType = "self_help"
        End If
        rstTitles.MoveNext
    Loop

    ' Similate a change by another user by updating
    ' data using a command string.
    cnn1.Execute "UPDATE Titles SET type = 'sociology' " & _
        "WHERE type = 'psychology'"

    'Check for changes.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If fldType.OriginalValue <> _
            fldType.UnderlyingValue Then

            MsgBox "Data has changed!" & vbCr & vbCr & _
                "  Title ID: " & rstTitles!title_id & vbCr & _
                "  Current value: " & fldType & vbCr & _
                "  Original value: " & _
                fldType.OriginalValue & vbCr & _
                "  Underlying value: " & _
                fldType.UnderlyingValue & vbCr
        End If
        rstTitles.MoveNext
    Loop

    ' Cancel the update because this is a demonstration.
    rstTitles.CancelBatch
    rstTitles.Close

    ' Restore original values.
    cnn1.Execute "UPDATE Titles SET type = 'psychology' " & _
        "WHERE type = 'sociology'"

    cnn1.Close

End Sub


Prepared プロパティの例 (VB)

この例では、一方はステートメントが準備され (またはコンパイルされて)、もう一方はステートメントが準備されていない、2 つの Command オブジェクトを開いて、Prepared プロパティの機能を示します。

Public Sub PreparedX()

    Dim cnn1 As ADODB.Connection
    Dim cmd1 As ADODB.Command
    Dim cmd2 As ADODB.Command
    Dim strCnn As String
    Dim strCmd As String
    Dim sngStart As Single
    Dim sngEnd As Single
    Dim sngNotPrepared As Single
    Dim sngPrepared As Single
    Dim intLoop As Integer

    ' Open a connection.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn

    ' Create two command objects for the same
    ' command - one prepared and one not prepared.
    strCmd = "SELECT title, type FROM Titles ORDER BY type"

    Set cmd1 = New ADODB.Command
    Set cmd1.ActiveConnection = cnn1
    cmd1.CommandText = strCmd

    Set cmd2 = New ADODB.Command
    Set cmd2.ActiveConnection = cnn1
    cmd2.CommandText = strCmd
    cmd2.Prepared = True

    ' Set a timer, then execute the unprepared
    ' command 20 times.
    sngStart = Timer
    For intLoop = 1 To 20
        cmd1.Execute
    Next intLoop
    sngEnd = Timer
    sngNotPrepared = sngEnd - sngStart

    ' Reset the timer, then execute the prepared
    ' command 20 times.
    sngStart = Timer
    For intLoop = 1 To 20
        cmd2.Execute
    Next intLoop
    sngEnd = Timer
    sngPrepared = sngEnd - sngStart

    ' Display performance results.
    MsgBox "Performance Results:" & vbCr & _
        "    Not Prepared: " & Format(sngNotPrepared, _
        "##0.000") & " seconds" & vbCr & _
        "    Prepared: " & Format(sngPrepared, _
        "##0.000") & " seconds"

    cnn1.Close

End Sub


Provider、DefaultDatabase プロパティの例 (VB)

この例では、異なるプロバイダを使用する 3 つの Connection オブジェクトを開くことによって、Provider プロパティの機能を示します。この例ではまた、DefaultDatabase プロパティを使って Microsoft ODBC Provider の既定のデータベースを設定します。

Public Sub ProviderX()

    Dim cnn1 As ADODB.Connection
    Dim cnn2 As ADODB.Connection
    Dim cnn3 As ADODB.Connection

    ' Open a connection using the Microsoft ODBC provider.
    Set cnn1 = New ADODB.Connection
    cnn1.ConnectionString = "driver={SQL Server};" & _
        "server=srv;uid=sa;pwd="
    cnn1.Open strCnn
    cnn1.DefaultDatabase = "Pubs"

    ' Display the provider.
    MsgBox "Cnn1 provider: " & cnn1.Provider

    ' Open a connection using the Microsoft Jet provider.
    Set cnn2 = New ADODB.Connection
    cnn2.Provider = "Microsoft.Jet.OLEDB.3.51"
    cnn2.Open "C:\Samples\northwind.mdb", "admin", ""

    ' Display the provider.
    MsgBox "Cnn2 provider: " & cnn2.Provider

   ' Open a connection using the Microsoft SQL Server provider.
    Set cnn3 = New ADODB.Connection
    cnn3.Provider = "sqloledb"
    cnn3.Open "Data Source=srv;Initial Catalog=Pubs;", "sa", ""

    ' Display the provider.
    MsgBox "Cnn3 provider: " & cnn3.Provider

    cnn1.Close
    cnn2.Close
    cnn3.Close

End Sub


Read、ReadText、Write、WriteText メソッドの例 (VB)

この例では、テキスト ボックスの内容をテキスト Stream とバイナリ Stream の両方に読み込む方法を示します。Position、Size、Charset、SetEOS など、ほかのプロパティおよびメソッドも示されています。

Public Sub ReadX()
    'Declare variables
    Dim objStream As Stream
    Dim varA As Variant
    Dim bytA() As Byte
    Dim i As Integer
    Dim strBytes As String

    'Instantiate and Open Stream
    Set objStream = New Stream
    objStream.Open

    'Write the text content of a textbox to the stream
    objStream.WriteText Text1.Text

    'Display the text contents and size of the stream
    objStream.Position = 0
    Debug.Print "Default text:"
    Debug.Print objStream.ReadText
    Debug.Print objStream.Size

    'Switch character set and display
    objStream.Position = 0
    objStream.Charset = "Windows-1252"
    Debug.Print "New Charset text:"
    Debug.Print objStream.ReadText
    Debug.Print objStream.Size

    'Switch to a binary stream and display
    objStream.Position = 0
    objStream.Type = adTypeBinary
    Debug.Print "Binary:"
    Debug.Print objStream.Read
    Debug.Print objStream.Size

    'Load an array of bytes with the text box text
    ReDim bytA(Len(Text1.Text))
    For i = 1 To Len(Text1.Text)
        bytA(i - 1) = CByte(Asc(Mid(Text1.Text, i, 1)))
    Next

    'Write the buffer to the binary stream and display
    objStream.Position = 0
    objStream.Write bytA()
    objStream.SetEOS
    objStream.Position = 0
    Debug.Print "Binary after Write:"
    Debug.Print objStream.Read
    Debug.Print objStream.Size

    'Switch back to a text stream and display
    Debug.Print "Translated back:"
    objStream.Position = 0
    objStream.Type = adTypeText
    Debug.Print objStream.ReadText
    Debug.Print objStream.Size
End Sub


Refresh メソッドの例 (VB)

この例では、Refresh メソッドを使って、ストアド プロシージャ Command オブジェクトの Parameters コレクションを更新します。

Public Sub RefreshX()

    Dim cnn1 As ADODB.Connection
    Dim cmdByRoyalty As ADODB.Command
    Dim rstByRoyalty As ADODB.Recordset
    Dim rstAuthors As ADODB.Recordset
    Dim intRoyalty As Integer
    Dim strAuthorID As String
    Dim strCnn As String

    ' Open connection.
    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Open a command object for a stored procedure
    ' with one parameter.
    Set cmdByRoyalty = New ADODB.Command
    Set cmdByRoyalty.ActiveConnection = cnn1
    cmdByRoyalty.CommandText = "byroyalty"
    cmdByRoyalty.CommandType = adCmdStoredProc
    cmdByRoyalty.Parameters.Refresh

    ' Get paramater value and execute the command,
    ' storing the results in a recordset.
    intRoyalty = Trim(InputBox("Enter royalty:"))
    cmdByRoyalty.Parameters(1) = intRoyalty
    Set rstByRoyalty = cmdByRoyalty.Execute()

    ' Open the Authors table to get author names for display.
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.Open "Authors", cnn1, , , adCmdTable

    ' Print current data in the recordset, adding
    ' author names from Authors table.
    Debug.Print "Authors with " & intRoyalty & " percent royalty"
    Do While Not rstByRoyalty.EOF
        strAuthorID = rstByRoyalty!au_id
        Debug.Print "    " & rstByRoyalty!au_id & ", ";
        rstAuthors.Filter = "au_id = '" & strAuthorID & "'"
        Debug.Print rstAuthors!au_fname & " " & _
            rstAuthors!au_lname
        rstByRoyalty.MoveNext
    Loop

    rstByRoyalty.Close
    rstAuthors.Close
    cnn1.Close

End Sub


Resync メソッドの例 (VB)

この例では、Resync メソッドを使って、静的レコードセット内のデータを更新します。

Public Sub ResyncX()

    Dim strCnn As String
    Dim rstTitles As ADODB.Recordset

    ' Open connections.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "

    ' Open recordset for Titles table.
    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenKeyset
    rstTitles.LockType = adLockBatchOptimistic
    rstTitles.Open "Titles", strCnn, , , adCmdTable

    ' Change the type of the first title in the recordset.
    rstTitles!Type = "database"

    ' Display the results of the change.
    MsgBox "Before resync: " & vbCr & vbCr & _
        "Title - " & rstTitles!Title & vbCr & _
        "Type - " & rstTitles!Type

    ' Resync with database and redisplay results.
    rstTitles.Resync
    MsgBox "After resync: " & vbCr & vbCr & _
        "Title - " & rstTitles!Title & vbCr & _
        "Type - " & rstTitles!Type

    rstTitles.CancelBatch
    rstTitles.Close

End Sub


Save、Open メソッドの例 (VB)

次の 3 つの例では、Save メソッドと Open メソッドを組み合わせて使用する方法を示します。

出張先に、データベースに含まれるテーブルを持っていく必要があるとします。出かける前に Recordset としてデータにアクセスし、持ち出し可能な形式で保存します。出張先では、接続されていないローカルな Recordset としてアクセスします。Recordset に変更を加え、それを再度保存します。最終的に会社に戻ったときに、再度データベースに接続し、出張中に行った変更に関する更新を、データベースに対して行います。

Public Sub Main()
    SaveX1
    SaveX2
    SaveX3
End Sub

最初に、Authors テーブルにアクセスし、保存します。

Public Sub SaveX1()
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

rst.Open "SELECT au_id, au_lname, au_fname, phone, city FROM Authors", _
         "Provider=SQLOLEDB;Data Source=MySrvr;User Id=sa;" & _
         "Password=;Initial Catalog=pubs;" _
         adOpenDynamic, adLockOptimistic, adCmdText

'For sake of illustration, save the Recordset to a diskette in XML
'format.
rst.Save "a:\Pubs.xml", adPersistXML

rst.Close
End Sub

ここで、出張先に到着しました。接続されていないローカルな Recordset として Authors テーブルにアクセスします。保存したファイル a:\Pubs.xml にアクセスするためには、使用するコンピュータで MSPersist プロバイダが使用可能になっている必要があることに注意してください。

Public Sub SaveX2()
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

'For sake of illustration, we specify all parameters.
rst.Open "a:\Pubs.xml", "Provider=MSPersist;", , adLockOptimistic, adCmdFile

'Now you have a local, disconnected Recordset. Edit it as you desire.
'(In this example, the change makes no difference).
rst.Find "au_lname = 'Carson'"
If rst.EOF Then
    Debug.Print "Name not found."
    Exit Sub
End If

rst!city = "Berkeley"
rst.Update

'Save changes in ADTG format this time, purely for sake of illustration.
'Note that the previous version is still on the diskette, as a:\Pubs.xml.
rst.Save "a:\Pubs.adtg", adPersistADTG
rst.Close
End Sub

最終的に会社に戻り、保存した変更に関する更新を、データベースに対して行います。

Public Sub SaveX3()
Dim cnn As New ADODB.Connection
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

'If there is no ActiveConnection, you can open with defaults.
rst.Open "a:\Pubs.adtg"

'Connect to the database, associate the Recordset with the connection,
'then update the database table with the changed Recordset.
cnn.Open "Provider=SQLOLEDB;Data Source=MySrvr;User Id=sa;" & _
         "Password=;Initial Catalog=pubs;"
rst.ActiveConnection = cnn
rst.UpdateBatch

rst.Close
cnn.Close
End Sub


Seek メソッド、Index プロパティの例 (VB)

この例では、Recordset オブジェクトの Seek メソッドと Index プロパティを、指定された Employee ID と連動して使って、Nwind.mdb データベースの Employees テーブル内の社員の名前を検索します。

Public Sub Main()
    SeekX
End Sub

Public Sub SeekX()
Dim rst As ADODB.Recordset
Dim strID As String
Dim strPrompt As String
strPrompt = "Enter an EmployeeID (e.g., 1 to 9)"

Set rst = New ADODB.Recordset
rst.CursorLocation = adUseServer
rst.Open "employees", _
                "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=c:\temp\northwind.mdb;" & _
                "user id=admin;password=;", _
                adOpenKeyset, adLockReadOnly, adCmdTableDirect

' Does this provider support Seek and Index?
If rst.Supports(adIndex) And rst.Supports(adSeek) Then
rst.Index = "Primarykey"
' Display all the employees.
        rst.MoveFirst
        Do While rst.EOF = False
            Debug.Print rst!EmployeeID; ": "; rst!firstname; " "; _
                            rst!LastName
            rst.MoveNext
        Loop

' Prompt the user for an EmployeeID between 1 and 9.
        rst.MoveFirst
        Do
            strID = LCase(Trim(InputBox(strPrompt, "Seek Example")))
            ' Quit if strID is a zero-length string (CANCEL, null, etc.)
            If Len(strID) = 0 Then Exit Do
            If Len(strID) = 1 And strID >= "1" And strID <= "9" Then
                rst.Seek Array(strID), adSeekAfterEQ
                If rst.EOF Then
                    Debug.Print "Employee not found."
                Else
                    Debug.Print strID; ": Employee='"; rst!firstname; " "; _
                    rst!LastName; "'"
                End If
            End If
        Loop
End If

rst.Close
End Sub


Sort プロパティの例 (VB)

この例では、Recordset オブジェクトの Sort プロパティを使って、Pubs データベースの Authors テーブルから取得した Recordset の行を並べ替えます。二次ユーティリティ ルーチンで各行を出力します。

Sub Main()
    SortX
End Sub

Public Sub SortX()
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset

rst.CursorLocation = adUseClient
cnn.Open "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;"
rst.Open "SELECT * FROM Authors", cnn, _
            adOpenStatic, adLockReadOnly, adCmdText
SortXprint "Initial Order", rst

rst.Sort = "au_lname ASC, au_fname ASC"
SortXprint "Last Name Ascending", rst

rst.Sort = "au_lname DESC, au_fname ASC"
SortXprint "Last Name Descending", rst

rst.Close
cnn.Close
End Sub

次のコードは、与えられたタイトルと指定された Recordset の内容を出力する二次ユーティリティ ルーチンです。

Public Sub SortXprint ( title As String, rstp As ADODB.Recordset )
Debug.Print "---------------" & title & "---------------"
Debug.Print "First Name  Last Name" & vbCr & _
                "---------------------------------------------------"
rstp.MoveFirst
While Not rstp.EOF
    Debug.Print rstp!au_fname & " " & rstp!au_lname
    rstp.MoveNext
Wend
Debug.Print
End Sub


Source プロパティの例 (VB)

この例では、異なるデータ ソースに基づく 3 つの Recordset オブジェクトを開いて、Source プロパティの機能を示します。

Public Sub SourceX()

    Dim cnn1 As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim rstPublishers As ADODB.Recordset
    Dim rstPublishersDirect As ADODB.Recordset
    Dim rstTitlesPublishers As ADODB.Recordset
    Dim cmdSQL As ADODB.Command
    Dim strCnn As String
    Dim strSQL As String

    ' Open a connection.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Open a recordset based on a command object.
    Set cmdSQL = New ADODB.Command
    Set cmdSQL.ActiveConnection = cnn1
    cmdSQL.CommandText = "Select title, type, pubdate " & _
        "FROM Titles ORDER BY title"
    Set rstTitles = cmdSQL.Execute()

    ' Open a recordset based on a table.
    Set rstPublishers = New ADODB.Recordset
    rstPublishers.Open "publishers", strCnn, , , adCmdTable

    ' Open a recordset based on a table.
    Set rstPublishersDirect = New ADODB.Recordset
    rstPublishersDirect.Open "publishers", strCnn, , , adCmdTableDirect

    ' Open a recordset based on an SQL string.
    Set rstTitlesPublishers = New ADODB.Recordset
    strSQL = "SELECT title_ID AS TitleID, title AS Title, " & _
        "publishers.pub_id AS PubID, pub_name AS PubName " & _
        "FROM publishers INNER JOIN Titles " & _
        "ON publishers.pub_id = Titles.pub_id " & _
        "ORDER BY Title"
    rstTitlesPublishers.Open strSQL, strCnn, , , adCmdText

    ' Use the Source property to display the source of each recordset.
    MsgBox "rstTitles source: " & vbCr & _
        rstTitles.Source & vbCr & vbCr & _
        "rstPublishers source: " & vbCr & _
        rstPublishers.Source & vbCr & vbCr & _
        "rstPublishersDirect source: " & vbCr & _
        rstPublishersDirect.Source & vbCr & vbCr & _
        "rstTitlesPublishers source: " & vbCr & _
        rstTitlesPublishers.Source

    rstTitles.Close
    rstPublishers.Close
    rstTitlesPublishers.Close
    cnn1.Close

End Sub


State プロパティの例 (VB)

この例では、State プロパティを使って、非同期接続が開かれ非同期コマンドが実行している間、メッセージを表示します。

Public Sub StateX()

    Dim cnn1 As ADODB.Connection
    Dim cnn2 As ADODB.Connection
    Dim cmdChange As ADODB.Command
    Dim cmdRestore As ADODB.Command
    Dim strCnn As String

    ' Open two asynchronous connections, displaying
    ' a message while connecting.
    Set cnn1 = New ADODB.Connection
    Set cnn2 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "

    cnn1.Open strCnn, , , adAsyncConnect
    While (cnn1.State = adStateConnecting)
        Debug.Print "Opening first connection...."
    Wend

    cnn2.Open strCnn, , , adAsyncConnect
    While (cnn2.State = adStateConnecting)
        Debug.Print "Opening second connection...."
    Wend

    ' Create two command objects.
    Set cmdChange = New ADODB.Command
    cmdChange.ActiveConnection = cnn1
    cmdChange.CommandText = "UPDATE Titles SET type = 'self_help' " & _
        "WHERE type = 'psychology'"

    Set cmdRestore = New ADODB.Command
    cmdRestore.ActiveConnection = cnn2
    cmdRestore.CommandText = "UPDATE Titles SET type = 'psychology' " & _
        "WHERE type = 'self_help'"

    ' Executing the commands, displaying a message
    ' while they are executing.
    cmdChange.Execute , , adAsyncExecute
    While (cmdChange.State = adStateExecuting)
        Debug.Print "Change command executing...."
    Wend

    cmdRestore.Execute , , adAsyncExecute
    While (cmdRestore.State = adStateExecuting)
        Debug.Print "Restore command executing...."
    Wend

    cnn1.Close
    cnn2.Close

End Sub


Status プロパティの例 (Field) (VB)

この例では、Internet Publishing Provider を使って読み取り/書き込みフォルダのドキュメントを開きます。Record の Field オブジェクトの Status プロパティは、最初は adFieldPendingInsert に設定され、次に adFieldOk に更新されます。

sub insert()
    Dim rec As New Record
    ' Open a read/write document
    rec.Open "http://websrv/folder/subfolder", , adModeReadWrite, _
        adCreateCollection Or adOpenIfExists

    Debug.print "Append couple of fields"
    rec.Fields.Append "chektest:fld1", adWChar, 42, adFldUpdatable, "fld1"
    rec.Fields.Append "chektest:fld2", adWChar, 42, adFldUpdatable, "fld2"
    Debug.Print "status for the fields"
    Debug.Print rec.Fields("chektest:fld1").Status 'adFieldPendingInsert
    Debug.Print rec.Fields("chektest:fld2").Status 'adFieldPendingInsert
    rec.Fields.Update
    debug.print "Update succeeds"
    Debug.Print rec.Fields("chektest:fld1").Status
        ' adFieldOK if the update succeeds
    Debug.Print rec.Fields("chektest:fld2").Status
        ' adFieldOK if succeeds
End sub

次の例では、ドキュメント内の開いている Record から既知の Field を削除します。Status プロパティは、最初は adFieldOK に設定され、次に adFieldPendingUnknown に設定されます。

sub delete()
    Dim rec As New Record
    Dim fld As Field
    ' Open a read/write document
    rec.Open "http://websrv/folder/subfolder", , adModeReadWrite, _
        adCreateCollection Or adOpenIfExists
    Debug.Print rec.Fields("chektest:fld1").status ' should be adFieldOK
    ' Delete a field which already exists in the collection
    rec.Fields.Delete "chektest:fld1"
    Set fld = rec.Fields("chektest:fld1")
    Debug.Print rec.Fields("chektest:fld1").Status    ' adFieldpendingDelete
    rec.Fields.Update
    Debug.Print "Deleted"
    Debug.Print fld.Status    ' adFieldPendingUnknown
End sub

次の例では、読み取り専用のドキュメント内の開いている Record から Field を削除します。Status は、adFieldPendingDelete に設定されます。Update で削除が失敗し、Status は adFieldPendingDelete と adFieldPermissionDenied の和に設定されます。CancelUpdate によって、ペンディング状態の Status 設定がクリアされます。

sub delete2()
    Dim rec As New Record
    Dim fld As Field
    ' Open a read/write document
    rec.Open "http://websrv/folder/subfolder", , adModeReadWrite, _
        adCreateCollection Or adOpenIfExists

    Debug.Print "Try to delete something without permission"
    rec.Fields.Delete ("RESOURCE_PARSENAME")
    Set fld = rec.Fields("RESOURCE_PARSENAME")
    Debug.Print "Pending delete"
    Debug.Print fld.Status    ' adFieldpendingDelete
    Debug.Print "Delete should fail on Update"
    rec.Fields.Update    ' Should fail
    Debug.Print fld.Status    ' Pending delete plus error
    rec.Fields.CancelUpdate
    Debug.Print fld.Status    ' Okay
End sub


Status プロパティの例 (Recordset) (VB)

この例では、Status プロパティを使って、バッチ更新の前にバッチ操作で修正されたレコードを表示します。

Public Sub StatusX()

    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String

    ' Open recordset for batch update.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenKeyset
    rstTitles.LockType = adLockBatchOptimistic
    rstTitles.Open "Titles", strCnn, , , adCmdTable

    ' Change the type of psychology titles.
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            rstTitles!Type = "self_help"
        End If
        rstTitles.MoveNext
    Loop

    ' Display Title ID and status.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If rstTitles.Status = adRecModified Then
            Debug.Print rstTitles!title_id & " - Modified"
        Else
            Debug.Print rstTitles!title_id
        End If
        rstTitles.MoveNext
    Loop

    ' Cancel the update because this is a demonstration.
    rstTitles.CancelBatch
    rstTitles.Close

End Sub


StayInSync プロパティの例 (VB)

この例では、階層 Recordset 内の行へのアクセスを簡単にする StayInSync プロパティの機能を示します。

外側のループで、各 author の姓名、州、および ID が表示されます。各行に追加された Recordset が Fields コレクションから取得され、StayInSync プロパティによって、親のRecordset が新しい行に移動するたびに、自動的に rstTitleAuthor に割り当てられます。内側のループで、追加されたレコードセットの各行から 4 つのフィールドが表示されます。

Public Sub Main()
    StayInSyncX
End Sub

Public Sub StayInSyncX()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim rstTitleAuthor As New ADODB.Recordset

Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
cnn.Open "DSN=Pubs;Provider=MSDataShape;Data Provider=MSDASQL;uid=sa;pwd=;"
rst.StayInSync = True
rst.Open "SHAPE  {select * from Authors} " & _
                    "APPEND ({select * from titleauthor}" & _
                    "RELATE au_id TO au_id) AS chapTitleAuthor", _
                    cnn, , , adCmdText
Set rstTitleAuthor = rst("chapTitleAuthor").Value
While Not rst.EOF
    Debug.Print rst!au_fname & " " & rst!au_lname & " " & _
                    rst!state & " " & rst!au_id
    While Not rstTitleAuthor.EOF
        Debug.Print rstTitleAuthor(0) & " " & rstTitleAuthor(1) & " " & _
                    rstTitleAuthor(2) & " " & rstTitleAuthor(3)
        rstTitleAuthor.MoveNext
    Wend
    rst.MoveNext
Wend
End Sub


Supports メソッドの例 (VB)

この例では、Supports メソッドを使って、異なるカーソル タイプで開かれたレコードセットによってサポートされるオプションを表示します。実行するには、このプロシージャに DisplaySupport プロシージャが必要です。

Public Sub SupportsX()

    Dim aintCursorType(4) As Integer
    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String
    Dim intIndex As Integer

    ' Open connections.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "

    ' Fill array with CursorType constants.
    aintCursorType(0) = adOpenForwardOnly
    aintCursorType(1) = adOpenKeyset
    aintCursorType(2) = adOpenDynamic
    aintCursorType(3) = adOpenStatic

    ' Open recordset using each CursorType and
    ' optimistic locking. Then call the DisplaySupport
    ' procedure to display the supported options.
    For intIndex = 0 To 3
        Set rstTitles = New ADODB.Recordset
        rstTitles.CursorType = aintCursorType(intIndex)
        rstTitles.LockType = adLockOptimistic
        rstTitles.Open "Titles", strCnn, , , adCmdTable

        Select Case aintCursorType(intIndex)
            Case adOpenForwardOnly
                Debug.Print "ForwardOnly cursor supports:"
            Case adOpenKeyset
                Debug.Print "Keyset cursor supports:"
            Case adOpenDynamic
                Debug.Print "Dynamic cursor supports:"
            Case adOpenStatic
                Debug.Print "Static cursor supports:"
        End Select

        DisplaySupport rstTitles
        rstTitles.Close
    Next intIndex

End Sub

Public Sub DisplaySupport(rstTemp As ADODB.Recordset)

    Dim alngConstants(11) As Long
    Dim booSupports As Boolean
    Dim intIndex As Integer

    ' Fill array with cursor option constants.
    alngConstants(0) = adAddNew
    alngConstants(1) = adApproxPosition
    alngConstants(2) = adBookmark
    alngConstants(3) = adDelete
    alngConstants(4) = adFind
    alngConstants(5) = adHoldRecords
    alngConstants(6) = adMovePrevious
    alngConstants(7) = adNotify
    alngConstants(8) = adResync
    alngConstants(9) = adUpdate
    alngConstants(10) = adUpdateBatch

    For intIndex = 0 To 10
        booSupports = _
            rstTemp.Supports(alngConstants(intIndex))
        If booSupports Then
            Select Case alngConstants(intIndex)
                Case adAddNew
                    Debug.Print "   AddNew"
                Case adApproxPosition
                    Debug.Print "   AbsolutePosition and AbsolutePage"
                Case adBookmark
                    Debug.Print "   Bookmark"
                Case adDelete
                    Debug.Print "   Delete"
                Case adFind
                    Debug.Print "   Find"
                Case adHoldRecords
                    Debug.Print "   Holding Records"
                Case adMovePrevious
                    Debug.Print "   MovePrevious and Move"
                Case adNotify
                    Debug.Print "   Notifications"
                Case adResync
                    Debug.Print "   Resyncing data"
                Case adUpdate
                    Debug.Print "   Update"
                Case adUpdateBatch
                    Debug.Print "   batch updating"
            End Select
        End If
    Next intIndex

End Sub


Type プロパティの例 (Field) (VB)

この例では、Employees テーブル内のすべての Field オブジェクトの Type プロパティの値に対応する定数名を表示して、Type プロパティの機能を示します。実行するには、このプロシージャに FieldType 関数が必要です。

Public Sub TypeX()

    Dim rstEmployees As ADODB.Recordset
    Dim fldLoop As ADODB.Field
    Dim strCnn As String

    ' Open recordset with data from Employees table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    Debug.Print "Fields in Employees Table:" & vbCr

    ' Enumerate Fields collection of Employees table.
    For Each fldLoop In rstEmployees.Fields
        Debug.Print "  Name: " & fldLoop.Name & vbCr & _
            "  Type: " & FieldType(fldLoop.Type) & vbCr
    Next fldLoop

End Sub

Public Function FieldType(intType As Integer) As String

    Select Case intType
        Case adChar
            FieldType = "adChar"
        Case adVarChar
            FieldType = "adVarChar"
        Case adSmallInt
            FieldType = "adSmallInt"
        Case adUnsignedTinyInt
            FieldType = "adUnsignedTinyInt"
        Case adDBTimeStamp
            FieldType = "adDBTimeStamp"
    End Select

End Function


Type プロパティの例 (Property) (VB)

この例では、Type プロパティの機能を示します。これは、Properties や Fields などのコレクションの名前および種類を一覧表示するユーティリティ モデルです。

その Properties コレクションにアクセスするために Recordset を開く必要はありません。Properties コレクションは、Recordset オブジェクトのインスタンスが作成されると使用可能になります。ただし、CursorLocation プロパティを adUseClient に設定すると、Recordset オブジェクトの Properties コレクションにいくつかのダイナミック プロパティが追加されるため、この例は多少興味深いものになっています。例をわかりやすくするために、ここでは明示的に Item プロパティを使用して、各 Property オブジェクトにアクセスします。

Public Sub Main()
    TypeX
End Sub

Public Sub TypeX()
Dim rst As ADODB.Recordset
Dim prop As ADODB.Property
Dim ix As Integer
Dim strMsg As String

Set rst = New ADODB.Recordset
rst.CursorLocation = adUseClient
For ix = 0 To rst.Properties.Count - 1
Set prop = rst.Properties.Item(ix)
Select Case prop.Type
    Case adBigInt
        strMsg = "adBigInt"
    Case adBinary
        strMsg = "adBinary"
    Case adBoolean
        strMsg = "adBoolean"
    Case adBSTR
        strMsg = "adBSTR"
    Case adChapter
        strMsg = "adChapter"
    Case adChar
        strMsg = "adChar"
    Case adCurrency
        strMsg = "adCurrency"
    Case adDate
        strMsg = "adDate"
    Case adDBDate
        strMsg = "adDBDate"
   Case adDBTime
        strMsg = "adDBTime"
    Case adDBTimeStamp
        strMsg = "adDBTimeStamp"
    Case adDecimal
        strMsg = "adDecimal"
    Case adDouble
        strMsg = "adDouble"
    Case adEmpty
        strMsg = "adEmpty"
    Case adError
        strMsg = "adError"
    Case adFileTime
        strMsg = "adFileTime"
    Case adGUID
        strMsg = "adGUID"
    Case adIDispatch
        strMsg = "adIDispatch"
    Case adInteger
        strMsg = "adInteger"
    Case adIUnknown
        strMsg = "adIUnknown"
    Case adLongVarBinary
        strMsg = "adLongVarBinary"
    Case adLongVarChar
        strMsg = "adLongVarChar"
    Case adLongVarWChar
        strMsg = "adLongVarWChar"
    Case adNumeric
        strMsg = "adNumeric"
    Case adPropVariant
        strMsg = "adPropVariant"
    Case adSingle
        strMsg = "adSingle"
    Case adSmallInt
        strMsg = "adSmallInt"
    Case adTinyInt
        strMsg = "adTinyInt"
    Case adUnsignedBigInt
        strMsg = "adUnsignedBigInt"
    Case adUnsignedInt
        strMsg = "adUnsignedInt"
    Case adUnsignedSmallInt
        strMsg = "adUnsignedSmallInt"
    Case adUnsignedTinyInt
        strMsg = "adUnsignedTinyInt"
    Case adUserDefined
        strMsg = "adUserDefined"
    Case adVarBinary
        strMsg = "adVarBinary"
    Case adVarChar
        strMsg = "adVarChar"
    Case adVariant
        strMsg = "adVariant"
    Case adVarNumeric
        strMsg = "adVarNumeric"
    Case adVarWChar
        strMsg = "adVarWChar"
    Case adWChar
        strMsg = "adWChar"
    Case Else
        strMsg = "*UNKNOWN*"
End Select
Debug.Print "Property " & ix & ": " & prop.Name & _
                ", Type = " & strMsg
Next ix
End Sub


Update、CancelUpdate メソッドの例 (VB)

この例では、Update メソッドの機能を、関連する CancelUpdate メソッドと共に示します。

Public Sub UpdateX()

    Dim rstEmployees As ADODB.Recordset
    Dim strOldFirst As String
    Dim strOldLast As String
    Dim strMessage As String

    ' Open recordset with names from Employees table.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.Open "SELECT fname, lname " & _
        "FROM Employee ORDER BY lname", strCnn, , , adCmdText

    ' Store original data.
    strOldFirst = rstEmployees!fname
    strOldLast = rstEmployees!lname
    ' Change data in edit buffer.
    rstEmployees!fname = "Linda"
    rstEmployees!lname = "Kobara"

    ' Show contents of buffer and get user input.
    strMessage = "Edit in progress:" & vbCr & _
        "  Original data = " & strOldFirst & " " & _
        strOldLast & vbCr & "  Data in buffer = " & _
        rstEmployees!fname & " " & rstEmployees!lname & vbCr & vbCr & _
        "Use Update to replace the original data with " & _
        "the buffered data in the Recordset?"

    If MsgBox(strMessage, vbYesNo) = vbYes Then
        rstEmployees.Update
    Else
        rstEmployees.CancelUpdate
    End If

    ' Show the resulting data.
    MsgBox "Data in recordset = " & rstEmployees!fname & " " & _
        rstEmployees!lname

    ' Restore original data because this is a demonstration.
    If Not (strOldFirst = rstEmployees!fname And _
            strOldLast = rstEmployees!lname) Then
        rstEmployees!fname = strOldFirst
        rstEmployees!lname = strOldLast
        rstEmployees.Update
    End If

    rstEmployees.Close

End Sub

この例では、Update メソッドの機能を、関連する AddNew メソッドと共に示します。

Public Sub UpdateX2()

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strEmpID As String
    Dim strOldFirst As String
    Dim strOldLast As String
    Dim strMessage As String

    ' Open a connection.
    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Open recordset with data from Employees table.
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.Open "employee", cnn1, , , adCmdTable

    rstEmployees.AddNew
    strEmpID = "B-S55555M"
    rstEmployees!emp_id = strEmpID
    rstEmployees!fname = "Bill"
    rstEmployees!lname = "Sornsin"

    ' Show contents of buffer and get user input.
    strMessage = "AddNew in progress:" & vbCr & _
        "Data in buffer = " & rstEmployees!emp_id & ", " & _
        rstEmployees!fname & " " & rstEmployees!lname & vbCr & vbCr & _
        "Use Update to save buffer to recordset?"

    If MsgBox(strMessage, vbYesNoCancel) = vbYes Then
        rstEmployees.Update
        ' Go to the new record and show the resulting data.
        MsgBox "Data in recordset = " & rstEmployees!emp_id & ", " & _
             rstEmployees!fname & " " & rstEmployees!lname
    Else
        rstEmployees.CancelUpdate
        MsgBox "No new record added."
    End If

    ' Delete new data because this is a demonstration.
    cnn1.Execute "DELETE FROM employee WHERE emp_id = '" & strEmpID & "'"

    rstEmployees.Close

End Sub


UpdateBatch、CancelBatch メソッドの例 (VB)

この例では、UpdateBatch メソッドの機能を、関連する CancelBatch メソッドと共に示します。

Public Sub UpdateBatchX()

    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String
    Dim strTitle As String
    Dim strMessage As String

    ' Assign connection string to variable.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "

    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenKeyset
    rstTitles.LockType = adLockBatchOptimistic
    rstTitles.Open "Titles", strCnn, , , adCmdTable

    rstTitles.MoveFirst

    ' Loop through recordset and ask user if she wants
    ' to change the type for a specified title.
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            strTitle = rstTitles!Title
            strMessage = "Title: " & strTitle & vbCr & _
                "Change type to self help?"

            If MsgBox(strMessage, vbYesNo) = vbYes Then
                rstTitles!Type = "self_help"
            End If
        End If

        rstTitles.MoveNext
    Loop

    ' Ask the user if she wants to commit to all the
    ' changes made above.
    If MsgBox("Save all changes?", vbYesNo) = vbYes Then
        rstTitles.UpdateBatch
    Else
        rstTitles.CancelBatch
    End If

    ' Print current data in recordset.
    rstTitles.Requery
    rstTitles.MoveFirst
    Do While Not rstTitles.EOF
        Debug.Print rstTitles!Title & " - " & rstTitles!Type
        rstTitles.MoveNext
    Loop

    ' Restore original values because this is a demonstration.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "self_help" Then
            rstTitles!Type = "psychology"
        End If
        rstTitles.MoveNext
    Loop
    rstTitles.UpdateBatch

    rstTitles.Close

End Sub


Value プロパティの例 (VB)

この例では、Field、Property オブジェクトを使って、Employee テーブルのフィールドとプロパティの値を表示することによって、Value プロパティの機能を示します。

Public Sub ValueX()

    Dim rstEmployees As ADODB.Recordset
    Dim fldLoop As ADODB.Field
    Dim prpLoop As ADODB.Property
    Dim strCnn As String

    ' Open recordset with data from Employee table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    Debug.Print "Field values in rstEmployees"
    ' Enumerate the Fields collection of the Employees
    ' table.
    For Each fldLoop In rstEmployees.Fields
        ' Because Value is the default property of a
        ' Field object, the use of the actual keyword
        ' here is optional.
        Debug.Print "    " & fldLoop.Name & " = " & fldLoop.Value
    Next fldLoop

    Debug.Print "Property values in rstEmployees"
    ' Enumerate the Properties collection of the
    ' Recordset object.
    For Each prpLoop In rstEmployees.Properties
        ' Because Value is the default property of a
        ' Property object, the use of the actual keyword
        ' here is optional.
        Debug.Print "    " & prpLoop.Name & " = " & prpLoop.Value
    Next prpLoop

    rstEmployees.Close

End Sub


Version プロパティの例 (VB)

この例では、Connection オブジェクトの Version プロパティを使って、現在の ADO のバージョンを表示します。また、いくつかのダイナミック プロパティを使って、次の項目を表示します。

  • 現在の DBMS の名前およびバージョン

  • OLE DB のバージョン

  • プロバイダの名前およびバージョン

  • ODBC のバージョン

  • ODBC ドライバの名前およびバージョン
Public Sub VersionX()

    Dim cnn1 As ADODB.Connection

    ' Open connection.
    Set cnn1 = New ADODB.Connection
    strCnn = "driver={SQL Server};server=srv;" & _
        "user id=sa;password=;database=Pubs;"
    cnn1.Open strCnn

    strVersionInfo = "ADO Version: " & cnn1.Version & vbCr & _
    "DBMS Name: " & cnn1.Properties("DBMS Name") & vbCr & _
    "DBMS Version: " & cnn1.Properties("DBMS Version") & vbCr & _
    "OLE DB Version: " & cnn1.Properties("OLE DB Version") & vbCr & _
    "Provider Name: " & cnn1.Properties("Provider Name") & vbCr & _
    "Provider Version: " & cnn1.Properties("Provider Version") & vbCr & _
    "Driver Name: " & cnn1.Properties("Driver Name") & vbCr & _
    "Driver Version: " & cnn1.Properties("Driver Version") & vbCr & _
    "Driver ODBC Version: " & cnn1.Properties("Driver ODBC Version")

    MsgBox strVersionInfo

    cnn1.Close

End Sub


Microsoft Visual Basic, Scripting Edition での ADO コードの例

Visual Basic, Scripting Edition (VBScript) で記述するときの、ADO オブジェクト、メソッド、プロパティの使用方法については、次のトピックを参照してください。

注意 最初から最後までのコード例全体を、コード エディタに貼り付けてください。この例は、一部分だけ使用したり、改行の情報が失われると、正常に動作しない場合があります。

オブジェクト

  • DataControl オブジェクトの例

  • DataSpace オブジェクトの例

  • DataFactory オブジェクトの例

メソッド

  • AddNew メソッドの例

  • Cancel メソッドの例

  • CancelUpdate メソッドの例

  • Clone メソッドの例

  • ConvertToString メソッドの例

  • CreateObject メソッドと DataSpace オブジェクトの例

  • CreateObject、Query メソッドと DataFactory オブジェクトの例

  • CreateRecordset メソッドの例

  • Delete メソッドの例

  • Execute、Requery、Clear メソッドの例

  • Move メソッドの例

  • MoveFirst、MoveLast、MoveNext、MovePrevious メソッドの例

  • Open、Close メソッドの例

  • Query メソッドの例

  • Refresh メソッドの例

  • SubmitChanges メソッドの例

プロパティ

  • Connect プロパティの例

  • ExecuteOptions、FetchOptions プロパティの例

  • FilterColumn、FilterCriterion、FilterValue、SortColumn、SortDirection プロパティと Reset メソッドの例

  • Recordset、SourceRecordset プロパティの例

  • ReadyState プロパティの例

  • Server プロパティの例

  • SQL プロパティの例

  • URL プロパティの例


AddNew メソッドの例 (VBScript)

この例では、AddNew メソッドを使って、指定された名前で新規のレコードを作成します。

次の例は、Active Server Pages (ASP) で使用してください。この例を完全に機能させて表示するには、SDK と共にインストールされるデータ ソース AdvWorks.mdb が、C:\mssdk\samples\dataaccess\rds に置かれている必要があります。これは、Microsoft Access のデータベース ファイルです。

検索機能を使ってファイル Adovbs.inc を検索し、使用するディレクトリに置きます。次のコードをコピーして、メモ帳または別のテキスト エディタに貼り付け、「AddNew.asp」という名前で保存します。結果は、任意のクライアント ブラウザで表示できます。

この例を実行するときは、HTML フォームを使用して仮の新しいレコードを追加します。次に [Add New] をクリックします。不要なレコードを削除する場合は、「Delete メソッドの例」を参照してください。

<%@Language = VBScript %>
<!-- #Include file="ADOVBS.INC" -->
<HTML>
<HEAD>
<TITLE>ADO Open Method</TITLE>
<STYLE>
<!--
TH {
    background-color: #008080;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: xx-small;
    color: white;
    }
TD {
    text-align: center;
    background-color: #f7efde;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: xx-small;
     }
-->
</STYLE>
</HEAD>
<BODY>
<FONT FACE="MS SANS SERIF" SIZE=2>
<Center><H3>ADO AddNew Method</H3>
<!-- ADO Connection Object used to create recordset-->
<%
src = "C:\mssdk\samples\dataaccess\rds\advworks.mdb"
sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & src
'Create and Open Connection Object
Set OBJdbConn = Server.CreateObject("ADODB.Connection")
OBJdbConn.Open  sConnStr
'Create and Open Recordset Object
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConn
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"
RsCustomerList.Open
%>
<!--
If this is first time page is open, Form collection will be empty when data is entered.
run AddNew method
-->
<% If Not IsEmpty(Request.Form) Then
    If Not Request.Form("CompanyName") = "" Then
        RsCustomerList.AddNew
        RsCustomerList("CompanyName") = Request.Form("CompanyName")
        RsCustomerList("ContactLastName") = Request.Form("LastName")
        RsCustomerList("ContactFirstName") = Request.Form("FirstName")
        RsCustomerList("PhoneNumber") = Request.Form("PhoneNumber")
        RsCustomerList("City") = Request.Form("City")
        RsCustomerList("StateOrProvince") = Request.Form("State")
        RsCustomerList.Update
        RsCustomerList.MoveFirst
    End If
End If
%>

<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>

<!-- BEGIN column header row for Customer Table-->

<TR>
<TD>Company Name</TD>
<TD>Contact Name</TD>
<TD>Phone Number</TD>
<TD>City</TD>
<TD>State/Province</TD>
</TR>
<!--Display ADO Data from Customer Table
one row on each pass through recordset-->
<% Do While Not RsCustomerList.EOF %>
<TR>
  <TD> <%= RSCustomerList("CompanyName")%> </TD>
  <TD> <%= RScustomerList("ContactLastName") & ", " %>
       <%= RScustomerList("ContactFirstName") %> </TD>
  <TD> <%= RScustomerList("PhoneNumber")%> </TD>
  <TD> <%= RScustomerList("City")%> </TD>
  <TD> <%= RScustomerList("StateOrProvince")%> </TD>
</TR>
<!-- Next Row = Record Loop and add to row html table-->
<%
  RScustomerList.MoveNext
Loop
%>
</TABLE>
<HR>
<!-- Form to enter new record posts variables back to this page -->
<Form Method=Post Action="AddNew.asp" Name=Form>
<TABLE>
<TR>
<TD>Company Name:</TD>
<TD><Input Type="Text" Size="50" Name="CompanyName" Value = ""></TD>
<TR>
<TD>Contact First Name:</TD>
<TD><Input Type="Text" Size="50" Name="FirstName" Value = ""></TD>
<TR>
<TD>Contact Last Name:</TD>
<TD><Input Type="Text" Size="50" Name="LastName" Value = ""></TD>
<TR>
<TD>Contact Phone:</TD>
<TD><Input Type="Text" Size="50" Name="PhoneNumber" Value = ""></TD>
<TR>
<TD>City:</TD>
<TD><Input Type="Text" Size="50" Name="City" Value = ""></TD>
<TR>
<TD>State / Province:</TD>
<TD><Input Type="Text" Size="5" Name="State" Value = ""></TD>
<TR>
<TD><Input Type="Submit" Value="Add New">
    <Input Type="Reset" Value="Reset Form">
</TABLE>
</Form>
<%'Show location of data source
Response.Write(OBJdbConn)
%>
<Script Language = "VBScript">
Sub Form_OnSubmit
    MsgBox "Sending New Record to Server",,"ADO-ASP _Example"
End Sub
</Script>
</BODY>
</HTML>


Cancel メソッドの例 (VBScript)

次の例では、実行時に Cancel メソッドを読み込む方法を示します。

<Script Language="VBScript">
<!--
Sub cmdCancelAsync
  ADC.Cancel
   ' Terminates currently running AsyncExecute,
   ' ReadyState property set to adcReadyStateLoaded,
   ' Recordset set to Nothing
End Sub
-->
</Script>


CancelUpdate メソッドの例 (VBScript)

この例をテストするには、このコードをコピーして、通常の HTML 文書の <Body> タグと </Body> タグの間に貼り付け、「ADCapi6.asp」という名前を付けて保存してください。ASP スクリプトでサーバーを識別しています。

<Center>
<H2>RDS API Code Examples</H2>
<HR>
<H3>Remote Data Service SubmitChanges and CancelUpdate Methods</H3>

<!-- RDS.DataControl with parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS HEIGHT=1 WIDTH=1>
    <PARAM NAME="SQL" VALUE="Select * from Employee">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB;Data Source=MyServer;">
</OBJECT>

<TABLE DATASRC="#RDS">
<THEAD>
<TR ID="ColHeaders">
    <TH>ID</TH>
    <TH>FName</TH>
    <TH>LName</TH>
    <TH>Name</TH>
    <TH>Title</TH>
    <TH>Type</TH>
    <TH>Email</TH>
    <TH>MgrEmail</TH>
    <TH>Bldg</TH>
    <TH>Rm</TH>
    <TH>Phone</TH>
</TR>
</THEAD>

<TBODY>
<TR>
    <TD> <INPUT DATAFLD="ID" size=4> </TD>
    <TD> <INPUT DATAFLD="FirstName" size=10> </TD>
    <TD> <INPUT DATAFLD="LastName" size=10> </TD>
    <TD> <INPUT DATAFLD="Name" size=15> </TD>
    <TD> <INPUT DATAFLD="Title" size=20> </TD>
    <TD> <INPUT DATAFLD="Type" size=10> </TD>
    <TD> <INPUT DATAFLD="Email" size=10> </TD>
    <TD> <INPUT DATAFLD="ManagerEmail" size=10> </TD>
    <TD> <INPUT DATAFLD="Building" size=3> </TD>
    <TD> <INPUT DATAFLD="Room" size=5> </TD>
    <TD> <INPUT DATAFLD="Phone" size=8> </TD>
</TR>
</TBODY>
</TABLE>

<HR>
<INPUT TYPE=BUTTON NAME="SubmitChange" VALUE="Submit Changes"><INPUT TYPE=BUTTON NAME="CancelChange" VALUE="Cancel Update"><BR>
<H4>Add a new person or alter a current entry on the grid. Move off that Row. <BR>
Submit the Changes to your DBMS or cancel the updates. </H4>
</Center>
<Script Language="VBScript">
<!--
' Set parameters of RDS.DataControl at Run Time
Sub SubmitChange_OnClick
    RDS.SubmitChanges
    RDS.Refresh
End Sub

Sub CancelUpdate_OnClick
    RDS.CancelUpdate
End Sub
-->
</Script>


Clone メソッドの例 (VBScript)

この例では、Clone メソッドを使って Recordset のコピーを作成し、ユーザーがそれぞれのコピーのレコード ポインタを個別に配置できるようにします。

次の例は、Active Server Pages (ASP) で使用してください。この例を完全に機能させて表示するには、IIS と共にインストールされる、C:\InetPub\ASPSamp\AdvWorks に置かれるデータ ソースの AdvWorks.mdb を使用して、AdvWorks というシステム データ ソース名 (DSN) を作成する必要があります。これは、Microsoft Access のデータベース ファイルです。検索機能を使ってファイル Adovbs.inc を検索し、使用するディレクトリに置きます。次のコードをコピーして、メモ帳または別のテキスト エディタに貼り付け、「Clone.asp」という名前で保存します。結果は、任意のクライアント ブラウザで表示できます。

例を実行するときは、RsCustomerList.Source = "Customers" の行を RsCustomerList.Source = "Products" に変更して、大きなテーブルのレコード数をカウントします。

<!-- #Include file="ADOVBS.INC" -->
<% Language = VBScript %>
<HTML>
<HEAD>
<TITLE>ADO Clone Method</TITLE>
</HEAD>
<BODY>
<H3>ADO Clone Method</H3>
<!--- ADO Connection Object used to Create recordset-->
<%
src = "C:\mssdk\samples\dataaccess\rds\advworks.mdb"
sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & src

'Create and Open Connection Object
Set OBJdbConn = Server.CreateObject("ADODB.Connection")
OBJdbConn.Open  sConnStr
'Create and open Recordset object
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConn
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"
RsCustomerList.Open
%>

<!-- Loop through Customers Table, adding 1 to the Counter variable each pass -->
<%
    Set MyRecordset = RSCustomerList.Clone
    Counter = 0
    Do Until MyRecordset.EOF
        Counter = Counter + 1
        MyRecordset.MoveNext
    Loop
%>
<!-- Display Results -->
<H3>There Are <%=Counter %> Records in the Customers Table</H3>
<BR><HR>
<H4>Location of DSN Datbase</H4>
<%' Show location of DSN data source
Response.Write(OBJdbConn)
%>
</BODY>
</HTML>


Connect プロパティの例 (VBScript)

このコードでは、デザイン時における Connect プロパティの設定方法を示します。

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="ADC1">
.
    <PARAM NAME="SQL" VALUE="Select * from Sales">
    <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;User Id=sa;Password=;Initial Catalog=Pubs;Data Source=MyServer;">
    <PARAM NAME="Server" VALUE="http://MyWebServer">
.
</OBJECT>

この例では、VBScript コード内で Connect プロパティを実行時に設定する方法を示します。

この例をテストするには、このコードをコピーして、通常の HTML 文書の <Body> タグと </Body> タグの間に貼り付け、「Adcapi3.asp」という名前を付けて保存してください。ASP スクリプトでサーバーを識別しています。

<H2>RDS API Code Examples </H2>
<HR>
<H3>Set Connect Property at Run Time</H3>
<!-- RDS.DataControl with no parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS HEIGHT=1 WIDTH=1>
</OBJECT>

<TABLE DATASRC=#RDS>
<TBODY>
  <TR>
    <TD><SPAN DATAFLD="FirstName"></SPAN></TD>
    <TD><SPAN DATAFLD="LastName"></SPAN></TD>
  </TR>
</TBODY>
</TABLE>

SERVER: <Input Size=70 Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>
CONNECT: <Input Size=70 Name="txtConnect"><BR>
SQL: <Input Size=70 Name="txtSQL" Value="Select * from Employee">
<BR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run">
<BR>
To Fill Grid enter Connect String in middle text box, try<BR>
<B>Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB;Data Source=MyServer;</B>

<Script Language="VBScript">
<!--
' Set parameters of RDS.DataControl at Run Time
Sub Run_OnClick
    RDS.Server = txtServer.Value
    RDS.SQL = txtSQL.Value
    RDS.Connect = txtConnect.Value
    RDS.Refresh
End Sub
-->
</Script>


ConvertToString メソッドの例 (VBScript)

次の例では、RDSServer.DataFactory の ConvertToString メソッドを使って、Recordset を MIME 形式でエンコードされた文字列に変換する方法を示します。また、文字列を元の Recordset に変換する方法も示します。

<HTML>
<HEAD><TITLE>ConverToString Example</TITLE><HEAD>
<BODY>

<SCRIPT LANGUAGE=VBSCRIPT>
Sub ConvertToStringX()
    Dim objRs, objDF, strServer, vString
    Const adcExecSync = 1
    Const adcFetchUpFront = 1

    ' Replace value below with your server name to use without ASP.
    strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"

    Set objDF = RDS1.CreateObject("RDSServer.DataFactory", strServer)
    Set objRs = objDF.Query(txtConnect.Value,txtQueryRecordset.Value)

    ' convert Recordset to MIME encoded string
    vString = objDF.ConvertToString(objRs)

    ' display MIME string for demo purposes
    txtRS.value = vString

    ' convert MIME string back to useable ADO Recordset
    ' using RDS.DataControl
    RDC1.SQL = vString

    RDC1.ExecuteOptions = adcExecSync
    RDC1.FetchOptions = adcFetchUpFront
    RDC1.Refresh

    MsgBox "RecordCount = " & RDC1.Recordset.RecordCount
End Sub
</SCRIPT>

Connect String:
 <INPUT TYPE=Text NAME=txtConnect SIZE=50
    VALUE="Provider=sqloledb;Initial Catalog=pubs;User Id=sa;Password=;Data Source=MyServer;">
 <BR>

Query:
 <INPUT TYPE=Text NAME=txtQueryRecordset SIZE=50
    VALUE="select * from jobs">
 <BR>

 <INPUT TYPE=Button VALUE="ConvertToString" OnClick="ConvertToStringX()">
 <BR>

MIME Encoded RS: <BR>
 <TEXTAREA NAME=txtRS ROWS=15 COLS=50 WRAP=virtual></TEXTAREA>

<!-- RDS.DataSpace  ID RDS1 -->
 <OBJECT ID="RDS1" WIDTH=1 HEIGHT=1
     CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
 </OBJECT>

<!-- RDS.DataControl ID RDC1 -->
 <OBJECT ID="RDC1" WIDTH=1 HEIGHT=1
     CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33">
 </OBJECT>
</BODY>
</HTML>


CreateRecordset メソッドの例 (VBScript)

この例では、サーバー側で Recordset を作成します。このレコードセットには、4 行から成る列が 2 つあります。

Sub CreateARecordSet
    Dim ColInfo(1), c0(3), c1(3)

    c0(0) = "Name"            ' Column name.
    c0(1) = CInt(129)        ' Column type (129 = adChar).
    c0(2) = CInt(40)        ' Column size.
    c0(3) = False            ' Is the column nullable?

    c1(0) = "Age"            ' Column name.
    c1(1) = CInt(3)        ' Column type (3 = adInteger).
    c1(2) = CInt(-1)        ' Column size.
    c1(3) = True            ' Is the column nullable?

    ' Add the columns to the recordset definition.
    ColInfo(0) = c0
    ColInfo(1) = c1

    ADC1.SourceRecordset = ADF1.CreateRecordset(ColInfo)
End Sub


DataControl オブジェクトの例 (VBScript)

次のコードでは、デザイン時に RDS.DataControl の各パラメータを設定し、それらをデータ連結コントロールにバインドする方法を示します。このコードをコピーして、通常の HTML 文書の <Body> タグと </Body> タグの間に貼り付け、「Adcapi1.asp」という名前を付けて保存してください。ASP スクリプトでサーバーを識別しています。

<H2>RDS API Code Examples</H2>
<HR>
<H3>Remote Data Service</H3>
<TABLE DATASRC=#RDS>
<TBODY>
    <TR>
        <TD><SPAN DATAFLD="FirstName"></SPAN></TD>
        <TD><SPAN DATAFLD="LastName"></SPAN></TD>
    </TR>
</TBODY>
</TABLE>
<!-- Remote Data Service with Parameters set at Design Time -->

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS>
    <PARAM NAME="SQL" VALUE="Select * from Employee">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB;Data Source=MyServer;">
</OBJECT>

次の例では、RDS.DataControl の必須パラメータを実行時に設定する方法を示します。この例をテストするには、このコードをコピーして、通常の HTML 文書の <Body> タグと </Body> タグの間に貼り付け、「ADCapi2.asp」という名前を付けて保存してください。ASP スクリプトでサーバーを識別しています。

<H2>RDS API Code Examples</H2>
<HR>
<H3>Remote Data Service Run Time</H3>

<TABLE DATASRC=#RDS>
<TBODY>
  <TR>
    <TD><SPAN DATAFLD="FirstName"></SPAN></TD>
    <TD><SPAN DATAFLD="LastName"></SPAN></TD>
  </TR>
</TBODY>
</TABLE>

<!-- RDS.DataControl with no parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS HEIGHT=1 WIDTH=1>
</OBJECT>
<HR>
<Input Size=70 Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>
<Input Size=70 Name="txtConnect" Value="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB;Data Source=MyServer;">
<BR>
<Input Size=70 Name="txtSQL" Value="Select * from Employee">
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>
<H4>Fill Grid with these values or change them to see data from another ODBC data source on your server</H4>

<Script Language="VBScript">
<!--
' Set parameters of RDS.DataControl at Run Time
Sub Run_OnClick
    RDS.Server = txtServer.Value
    RDS.SQL = txtSQL.Value
    RDS.Connect = txtConnect.Value
    RDS.Refresh
End Sub
-->
</Script>


DataSpace オブジェクト、CreateObject メソッドの例 (VBScript)

次の例では、RDS.DataSpace の CreateObject メソッドを、既定のビジネス オブジェクトである RDSServer.DataFactory を指定して使用する方法を示します。この例をテストするには、このコードをコピーして、通常の HTML 文書の <Body> タグと </Body> タグの間に貼り付け、「ADCapi8.asp」という名前を付けて保存してください。ASP スクリプトでサーバーを識別しています。

<H2>RDS API Code Examples</H2>
<HR>
<H3>Using Query Method of RDSServer.DataFactory</H3>

<!-- RDS.DataSpace  ID RDS1-->
<OBJECT ID="RDS1" WIDTH=1 HEIGHT=1
CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
</OBJECT>

<!-- RDS.DataControl with parameters set at run time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS WIDTH=1 HEIGHT=1>
</OBJECT>

<TABLE DATASRC=#RDS>
<TBODY>
  <TR>
    <TD><SPAN DATAFLD="FirstName"></SPAN></TD>
    <TD><SPAN DATAFLD="LastName"></SPAN></TD>
  </TR>
</TBODY>
</TABLE>

<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run">

<H4>Click Run. The CreateObject Method of the RDS.DataSpace Object Creates an instance of the RDSServer.DataFactory.
The Query Method of the RDSServer.DataFactory is used to bring back a Recordset.</H4>

<Script Language="VBScript">
<!--
Dim DF
Dim strServer
Dim strConnect
Dim strSQL
strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"
strConnect = "Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;" & _
                  "Initial Catalog=AddrBookDB;Data Source=MyServer;"
strSQL = "Select * from Employee"

Sub Run_OnClick()
    Dim objADORs      'Create Recordset Object
    Set DF = RDS1.CreateObject("RDSServer.DataFactory", strServer)      'Get Recordset
    Set objADORs = DF.Query(strConnect, strSQL)
    ' Use  RDS.DataControl to bind Recordset to Data
    ' Aware Grid Control

    RDS.SourceRecordset = objADORs

End Sub
-->
</Script>

次の例では、CreateObject メソッドを使って、カスタム ビジネス オブジェクトである VbBusObj.VbBusObjCls のインスタンスを作成する方法を示します。ここでは、Web サーバー名を識別する Active Server Pages スクリプトも使用しています。完全な例を表示するには、サンプル アプリケーション セレクタから、クライアント層の列にある VBScript in Internet Explorer および中間層の列にあるカスタム Visual Basic ビジネス オブジェクトを選択してください。

Sub Window_OnLoad()
    strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"
    Set BO = ADS1.CreateObject("VbBusObj.VbBusObjCls", strServer)
    txtConnect.Value = "dsn=Pubs;uid=sa;pwd=;"
    txtGetRecordset.Value = "Select * From authors"
End Sub


DataFactory オブジェクトと Query、CreateObject メソッドの例 (VBScript)

この例では、RDS.DataSpace オブジェクトの CreateObject メソッドを使って RDSServer.DataFactory オブジェクトを作成します。この例をテストするには、このコードをコピーして、通常の HTML 文書の <Body> タグと </Body> タグの間に貼り付け、「ADCapi7.asp」という名前を付けて保存してください。ASP スクリプトでサーバーを識別しています。

<H2>RDS API Code Examples</H2>
<HR>
<H3>Using Query Method of RDSServer.DataFactory</H3>

<!-- RDS.DataSpace  ID RDS1-->
<OBJECT ID="RDS1" WIDTH=1 HEIGHT=1
CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
</OBJECT>

<!-- RDS.DataControl with parameters
set at run time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS WIDTH=1 HEIGHT=1>
</OBJECT>

<TABLE DATASRC=#RDS>
<TBODY>
  <TR>
    <TD><SPAN DATAFLD="FirstName"></SPAN></TD>
    <TD><SPAN DATAFLD="LastName"></SPAN></TD>
  </TR>
</TBODY>
</TABLE>

<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run">
<BR>
<H4>Click Run. The CreateObject Method of the
RDS.DataSpace Object Creates an instance of the
RDSServer.DataFactory.
The Query Method of the RDSServer.DataFactory is used
to bring back a Recordset. </H4>

<Script Language="VBScript">
<!--
Dim DF
Dim strServer
Dim strConnect
Dim strSQL

strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"
strConnect = "Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB;Data Source=MyServer;"
strSQL = "Select * from Employee"

Sub Run_OnClick()
' Create RDSServer.DataFactory Object
    Dim objADORs
' Get Recordset
    Set DF = RDS1.CreateObject("RDSServer.DataFactory", strServer)
    Set objADORs = DF.Query(strConnect, strSQL)
' Set parameters of RDS.DataControl at Run Time
    RDS.Server = strServer
    RDS.SQL = strSQL
    RDS.Connect = strConnect
    RDS.Refresh
End Sub
-->
</Script>


Delete メソッドの例 (VBScript)

この例では、Delete メソッドを使って、指定されたレコードを Recordset から削除します。

次の例は、Active Server Pages (ASP) で使用してください。この例を完全に機能させて表示するには、SDK と共にインストールされるデータ ソース AdvWorks.mdb が、C:\mssdk\samples\dataaccess\rds に置かれている必要があります。これは、Microsoft Access のデータベース ファイルです。

検索機能を使ってファイル Adovbs.inc を検索し、使用するディレクトリに置きます。次のコードをコピーして、メモ帳または別のテキスト エディタに貼り付け、「Delete.asp」という名前で保存します。結果は、任意のクライアント ブラウザで表示できます。

例を実行するときは、最初に AddNew の例を使用してレコードをいくつか追加します。その後で、それらのレコードを削除してください。任意のクライアント ブラウザで結果を確認してください。

<%@ Language=VBScript %>
<!-- #Include file="ADOVBS.INC" -->
<HTML>
<HEAD>
<TITLE>ADO Delete Method</TITLE>
</HEAD>
<STYLE>
<!--
TH {
    background-color: #008080;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: xx-small;
    color: white;
    }
TD {
    text-align: center;
    background-color: #f7efde;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: xx-small;
     }
-->
</STYLE>

<BODY>
<H3>ADO Delete Method</H3>

<!--- ADO Connection Object used to Create recordset-->
<%
src = "C:\mssdk\samples\dataaccess\rds\advworks.mdb"
sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & src

'Create and Open Connection Object
Set OBJdbConn = Server.CreateObject("ADODB.Connection")
OBJdbConn.Open  sConnStr
'Create and Open Recordset Object
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConn
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"
RsCustomerList.Open
%>
<!-- Move to designated record and delete it -->
<%
If Not IsEmpty(Request.Form("WhichRecord")) Then
    'Get value to move from Form Post method
    Moves = Request.Form("WhichRecord")

    RsCustomerList.Move CInt(Moves)
    If Not RsCustomerList.EOF or RsCustomerList.BOF Then
        RsCustomerList.Delete 1
        RsCustomerList.MoveFirst
    Else
        Response.Write "Not a Valid Record Number"
        RsCustomerList.MoveFirst
    End If
End If

%>
<!-- BEGIN column header row for Customer Table-->

<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<TR>
    <TH>Rec. #</TH>
    <TH>Company Name</TH>
    <TH>Contact Name</TH>
    <TH>Phone Number</TH>
    <TH>City</TH>
    <TH>State/Province</TH>
</TR>

<!--Display ADO Data from Customer Table Loop through Recordset adding
One Row to HTML Table each pass-->
<%
iCount = 0
Do While Not RsCustomerList.EOF %>
<TR>
  <TD> <%= CStr(iCount) %>
  <TD> <%= RSCustomerList("CompanyName")%> </TD>
  <TD> <%= RScustomerList("ContactLastName") & ", " %>
       <%= RScustomerList("ContactFirstName") %>
  </TD>
  <TD> <%= RScustomerList("PhoneNumber")%> </TD>
  <TD> <%= RScustomerList("City")%> </TD>
  <TD> <%= RScustomerList("StateOrProvince")%> </TD>
</TR>
<!-Next Row = Record Loop and add to html table-->
<%
  iCount = iCount + 1
  RScustomerList.MoveNext
Loop
%>
</TABLE>
<!-- Do Client side Input Data Validation Move to named record and Delete it -->

<Center>
<H4>Clicking Button Will Remove Designated Record</H4>
<H5>There are <%=RsCustomerList.RecordCount%> Records in this Set</H5>
<Form Method=Post Action="Delete.asp" Name=Form>
<Input Type=Text Name="WhichRecord" Size=3>
</Form>
<Input Type=Button Name=cmdDelete Value="Delete Record">

</BODY>

<Script Language = "VBScript">
Sub cmdDelete_OnClick
    If IsNumeric(Document.Form.WhichRecord.Value) Then
        Document.Form.WhichRecord.Value = CInt(Document.Form.WhichRecord.Value)
        Dim Response
        Response = MsgBox("Are You Sure About Deleting This Record?", vbYesNo,  "ADO-ASP Example")

        If Response = vbYes Then
            Document.Form.Submit
        End If
    Else
        MsgBox "You Must Enter a Valid Record Number",,"ADO-ASP Example"
    End If
End Sub
</Script>
</HTML>


Execute、Requery、Clear メソッドの例 (VBScript)

この例では、Command オブジェクトの Execute メソッドを実行する場合と Connection オブジェクトの Execute メソッドを実行する場合を示します。またここでは、Recordset オブジェクト内の最新のデータを取得する Requery メソッド、および Errors コレクションの内容をクリアする Clear メソッドも使用します。このプロシージャを実行するには、ExecuteCommand と PrintOutput プロシージャが必要です。

次の例は、Active Server Pages (ASP) で使用してください。この例を完全に機能させて表示するには、SDK と共にインストールされるデータ ソース AdvWorks.mdb が、C:\mssdk\samples\dataaccess\rds に置かれている必要があります。これは、Microsoft Access のデータベース ファイルです。

検索機能を使ってファイル Adovbs.inc を検索し、使用するディレクトリに置きます。次のコードをコピーして、メモ帳または別のテキスト エディタに貼り付け、「Execute.asp」という名前で保存します。結果は、任意のクライアント ブラウザで表示できます。

<%@ Language=VBScript %>
<!-- #Include file="ADOVBS.INC" -->
<HTML>
<HEAD>
<TITLE>ADO Execute Method</TITLE>
<STYLE>
<!--
BODY {
    font-family: "MS SANS SERIF",sans-serif;
     }
.thead1 {
    background-color: #008080;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
    color: white;
    }
.thead2 {
    background-color: #800000;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
    color: white;
    }
.tbody {
    text-align: center;
    background-color: #f7efde;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
     }
-->
</STYLE>
</HEAD>

<BODY>
<H3>ADO Execute Method</H3>
<HR>
<H4>Recordset Retrieved Using Connection Object</H4>
<!--- Recordsets retrieved using Execute method of Connection and Command Objects-->
<%
sDsrc="C:\mssdk\samples\dataaccess\rds\advworks.mdb"
sConnStr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDsrc

Set OBJdbConnection = Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open sConnStr
SQLQuery = "SELECT * FROM Customers"
'1st Recordset RSCustomerList using conn execute mthd
Set RSCustomerList = OBJdbConnection.Execute(SQLQuery)

Set OBJdbCommand = Server.CreateObject("ADODB.Command")
OBJdbCommand.ActiveConnection = OBJdbConnection
SQLQuery2 = "SELECT * From Products"
OBJdbCommand.CommandText = SQLQuery2
'2nd Recordset RSProductList using conn execute mthd
Set RSProductList = OBJdbCommand.Execute
%>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0 ALIGN=CENTER>
<!-- BEGIN column header row for Customer Table-->
<TR CLASS=thead1>
  <TH>Company Name</TH>
  <TH>Contact Name</TH>
  <TH>E-mail address</TH>
  <TH>City</TH>
  <TH>State/Province</TH>
</TR>

<!--Display ADO Data from Customer Table-->
<%
Do While Not RScustomerList.EOF %>
  <TR CLASS=tbody>
  <TD>
  <%= RSCustomerList("CompanyName")%>
  </TD>
  <TD>
  <%= RScustomerList("ContactLastName") & ", " %>
  <%= RScustomerList("ContactFirstName") %>
  </TD>
  <TD>
  <%= RScustomerList("ContactLastName")%>
  </TD>
  <TD>
  <%= RScustomerList("City")%>
  </TD>
  <TD>
  <%= RScustomerList("StateOrProvince")%>
  </TD>
  </TR>
  <!-Next Row = Record Loop and add to html table-->
  <%
  RScustomerList.MoveNext
Loop
RScustomerList.Close
%>
</TABLE>

<HR>
<H4>Recordset Retrieved Using Command Object</H4>

<TABLE CELLPADDING=5 BORDER=0 ALIGN=CENTER WIDTH="80%">

<!-- BEGIN column header row for Product List Table-->
<TR CLASS=thead2>
  <TH>Product Type</TH>
  <TH>Product Name</TH>
  <TH>Product Description</TH>
  <TH>Unit Price</TH>
</TR>

<!-- Display ADO Data Product List-->
<% Do While Not RsProductList.EOF %>
  <TR CLASS=tbody>
  <TD>
  <%= RsProductList("ProductType")%>
  </TD>
  <TD>
  <%= RsProductList("ProductName")%>
  </TD>
  <TD>
   <%= RsProductList("ProductDescription")%>
  </TD>
  <TD>
  <%= RsProductList("UnitPrice")%>
  </TD>
  <!--  Next Row = Record -->
<%
  RsProductList.MoveNext
Loop
'Remove objects from memory to free resources
RsProductList.Close
OBJdbConnection.Close
Set ObJdbCommand = Nothing
Set RsProductList = Nothing
Set OBJdbConnection = Nothing
%>
</TABLE>
</BODY>
</HTML>


ExecuteOptions、FetchOptions プロパティの例 (VBScript)

次のコードでは、デザイン時に、ExecuteOptions プロパティおよび FetchOptions プロパティを設定する方法を示します。未設定のままでは、ExecuteOptions は既定で adcExecSync に設定されています。この設定で Refresh メソッドが呼び出された場合、現在の呼び出しスレッド上で、つまり同期として実行されます。

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="RDS1">
.
<PARAM NAME="SQL" VALUE="Select * from Sales">
<PARAM NAME="Connect" VALUE="DSN=Pubs;UID=sa;PWD=;">
<PARAM NAME="Server" VALUE="http://MyWebServer">
<PARAM NAME="ExecuteOptions" VALUE="1">
<PARAM NAME="FetchOptions" VALUE="3">
.
</OBJECT>

次の例では、実行時に VBScript のコード内で ExecuteOptions プロパティおよび FetchOptions プロパティを設定する方法を示します。これらのプロパティの使用例については、Refresh メソッドを参照してください。

<Script Language="VBScript">
<!--
Const adcExecSync = 1
Const adcFetchAsynch = 3

Sub ExecuteHow
  ' Execute next refresh of Recordset asynchronously
  ' to the calling thread.
  RDS1.ExecuteOptions = adcExecSync
  RDS1.FetchOptions = adcFetchAsynch
  RDS.Refresh
End Sub
-->
</Script>


FilterColumn、FilterCriterion、FilterValue、SortColumn、SortDirection プロパティと Reset メソッドの例 (VBScript)

次のコードでは、デザイン時に RDS.DataControl の Server パラメータを設定し、コントロールをデータ ソースを使ってデータ連結 HTML テーブルにバインドする方法を示します。

<%@ Language=VBScript %>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS HEIGHT=1 WIDTH=1>
    <PARAM NAME="SQL" VALUE="Select * from Employee">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB;Data Source=MyServer;">
</OBJECT>

Sort Column: <SELECT NAME="cboSortColumn">
                  <OPTION VALUE=""></OPTION>
                  <OPTION VALUE=ID>ID</OPTION>
                  <OPTION VALUE=FirstName>FirstName</OPTION>
                  <OPTION VALUE=LastName>LastName</OPTION>
                  <OPTION VALUE=Title>Title</OPTION>
                  <OPTION VALUE=Type>Type</OPTION>
                  <OPTION VALUE=Email>Email</OPTION>
                  <OPTION VALUE=Building>Building</OPTION>
                  <OPTION VALUE=Room>Room</OPTION>
                  <OPTION VALUE=Phone>Phone</OPTION>
             </SELECT>
             <br>
Sort Direction: <SELECT NAME="cboSortDir">
                  <OPTION VALUE=""></OPTION>
                  <OPTION VALUE=TRUE>TRUE</OPTION>
                  <OPTION VALUE=FALSE>FALSE</OPTION>
                </SELECT>
<HR WIDTH="25%">
Filter Column: <SELECT NAME="cboFilterColumn">
                  <OPTION VALUE=""></OPTION>
                  <OPTION VALUE=ID>ID</OPTION>
                  <OPTION VALUE=FirstName>FirstName</OPTION>
                  <OPTION VALUE=LastName>LastName</OPTION>
                  <OPTION VALUE=Title>Title</OPTION>
                  <OPTION VALUE=Type>Type</OPTION>
                  <OPTION VALUE=Email>Email</OPTION>
                  <OPTION VALUE=Building>Building</OPTION>
                  <OPTION VALUE=Room>Room</OPTION>
                  <OPTION VALUE=Phone>Phone</OPTION>
             </SELECT>
             <br>
Filter Criterion: <SELECT NAME="cboCriterion">
                    <OPTION VALUE=""></OPTION>
                    <OPTION VALUE="=">=</OPTION>
                    <OPTION VALUE="&gt;">&gt;</OPTION>
                    <OPTION VALUE="&lt;">&lt;</OPTION>
                    <OPTION VALUE="&gt;=">&gt;=</OPTION>
                    <OPTION VALUE="&lt;=">&lt;=</OPTION>
                    <OPTION VALUE="&lt;&gt;">&lt;&gt;</OPTION>
                  </SELECT>
              <br>
Filter Value: <INPUT NAME="txtFilterValue">
<HR WIDTH="25%">
<INPUT TYPE=BUTTON NAME=Clear VALUE="CLEAR ALL"> &nbsp;
<INPUT TYPE=BUTTON NAME=SortFilter VALUE="APPLY">

<HR>
<TABLE DATASRC=#RDS ID="DataTable">
<THEAD>
  <TR>
    <TH>ID</TH>
    <TH>FirstName</TH>
    <TH>LastName</TH>
    <TH>Title</TH>
    <TH>Type</TH>
    <TH>Email</TH>
    <TH>Building</TH>
    <TH>Room</TH>
    <TH>Phone</TH>
  </TR>
</THEAD>
<TBODY>
  <TR>
    <TD><SPAN DATAFLD="ID"></SPAN></TD>
    <TD><SPAN DATAFLD="FirstName"></SPAN></TD>
    <TD><SPAN DATAFLD="LastName"></SPAN></TD>
    <TD><SPAN DATAFLD="Title"></SPAN></TD>
    <TD><SPAN DATAFLD="Type"></SPAN></TD>
    <TD><SPAN DATAFLD="Email"></SPAN></TD>
    <TD><SPAN DATAFLD="Building"></SPAN></TD>
    <TD><SPAN DATAFLD="Room"></SPAN></TD>
    <TD><SPAN DATAFLD="Phone"></SPAN></TD>
  </TR>
</TBODY>
</TABLE>

<Script Language="VBScript">
<!--
Const adFilterNone = 0

Sub SortFilter_OnClick
    Dim vCriterion
    Dim vSortDir
    Dim vSortCol
    Dim vFilterCol

    ' The value of SortColumn will be the
    ' value of what the user picks in the
    ' cboSortColumn box.
    vSortCol = cboSortColumn.options(cboSortColumn.selectedIndex).value

    If(vSortCol <> "") then
        RDS.SortColumn = vSortCol
    End If

    ' The value of SortDirection will be the
    ' value of what the user specifies in the
    ' cboSortdirection box.

    If (vSortCol <> "") then
        vSortDir = cboSortDir.options(cboSortDir.selectedIndex).value
        If (vSortDir = "") then
            MsgBox "True or False are only acceptable Sort Direction values."
            Exit Sub
        Else
            RDS.SortDirection = vSortDir
        End If
    End If

    ' The value of FilterColumn will be the
    ' value of what the user specifies in the
    ' cboFilterColumn box.
    vFilterCol = cboFilterColumn.options(cboFilterColumn.selectedIndex).value

    If(vFilterCol <> "") then
        RDS.FilterColumn = vFilterCol
    End If

    ' The value of FilterCriterion will be the
    ' text value of what the user specifies in the
    ' cboCriterion box.
    vCriterion = cboCriterion.options(cboCriterion.selectedIndex).value
    If (vCriterion <> "") Then
        RDS.FilterCriterion = vCriterion
    End If

    ' txtFilterValue is a rich text box
    ' control. The value of FilterValue will be the
    ' text value of what the user specifies in the
    ' txtFilterValue box.
    If (txtFilterValue.value <> "") Then
        RDS.FilterValue = txtFilterValue.value
    End If

    ' Execute the sort and filter on a client-side
    ' Recordset based on the specified sort and filter
    ' properties. Calling Reset refreshes the result set
    ' that is displayed in the data-bound controls to
    ' display the filtered, sorted recordset.
    RDS.Reset
End Sub

Sub Clear_onClick()
    'clear the HTML input controls
    cboSortColumn.selectedIndex = 0
    cboSortDir.selectedIndex = 0
    cboFilterColumn.selectedIndex = 0
    cboCriterion.selectedIndex = 0
    txtFilterValue.value = ""

    'clear the filter
    RDS.FilterCriterion = ""
    RDS.Reset(FALSE)
End Sub
-->
</Script>
</BODY>
</HTML>


Move メソッドの例 (VBScript)

この例では、Move メソッドを使って、ユーザーの入力に基づいてレコード ポインタを配置します。

次の例は、Active Server Pages (ASP) で使用してください。この例を完全に機能させて表示するには、SDK と共にインストールされるデータ ソース AdvWorks.mdb が、C:\mssdk\samples\dataaccess\rds に置かれている必要があります。これは、Microsoft Access のデータベース ファイルです。

検索機能を使ってファイル Adovbs.inc を検索し、使用するディレクトリに Adovbs.inc を置きます。次のコードをコピーして、メモ帳または別のテキスト エディタに貼り付け、「Move.asp」という名前で保存します。結果は、任意のブラウザで表示できます。

整数以外の文字または英字を入力すると、エラー処理の動作を確認できます。

<%@ Language=VBScript %>
<!-- #Include file="ADOVBS.INC" -->
<HTML>
<HEAD>
<TITLE>ADO Move Methods</TITLE>
<STYLE>
<!--
BODY {
    font-family: "MS SANS SERIF",sans-serif;
     }
.thead1 {
    background-color: #008080;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
    color: white;
    }
.tbody {
    text-align: center;
    background-color: #f7efde;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
     }
-->
</STYLE>
</HEAD>
<BODY>
<H3>ADO Move Methods</H3>
<%
src = "C:\mssdk\samples\dataaccess\rds\advworks.mdb"
sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & src

'Create and Open Connection Object
Set OBJdbConn = Server.CreateObject("ADODB.Connection")
OBJdbConn.Open  sConnStr

'Create and Open Recordset Object
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConn
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"

RsCustomerList.Open

'Check number of user moves this session.
'Increment by amount in Form.
Session("Clicks") = Session("Clicks") + Request.Form("MoveAmount")
Clicks = Session("Clicks")
' Move to last known recordset position plus amount passed
' by Form Post method.
RsCustomerList.Move CInt(Clicks)

'Error Handling
    If RsCustomerList.EOF Then
            Session("Clicks") = RsCustomerList.RecordCount
            Response.Write "This is the Last Record"
            RsCustomerList.MoveLast
        Else If RsCustomerList.BOF Then
            Session("Clicks") = 1
            RsCustomerList.MoveFirst
            Response.Write "This is the First Record"
        End If
    End If
%>

<H3>Current Record Number is <BR>
<%
If Session("Clicks") = 0 Then
    Session("Clicks") = 1
End If
Response.Write(Session("Clicks") )%> of <%=RsCustomerList.RecordCount%></H3>
<HR>

<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>

<!-- BEGIN column header row for Customer Table-->

<TR CLASS=thead1>
    <TD>Company Name</TD>
    <TD>Contact Name</TD>
    <TD>Phone Number</TD>
    <TD>City</TD>
    <TD>State/Province</TD>
</TR>

<!--Display ADO Data from Customer Table-->

<TR CLASS=tbody>
  <TD> <%= RSCustomerList("CompanyName")%> </TD>
  <TD> <%= RScustomerList("ContactLastName") & ", " %>
       <%= RScustomerList("ContactFirstName") %> </TD>
  <TD> <%= RScustomerList("PhoneNumber")%> </TD>
  <TD> <%= RScustomerList("City")%> </TD>
  <TD> <%= RScustomerList("StateOrProvince")%> </TD>
</TR>
</TABLE>

<HR>
<Input Type=Button Name=cmdDown  Value="&lt;  ">
<Input Type=Button Name=cmdUp Value=" &gt;">
<H5>Click Direction Arrows for Previous or Next Record
<BR> Click Move Amount to use Move Method
Enter Number of Records to Move + or - </H5>

<TABLE>

<FORM Method = Post Action="Move.asp" Name=Form>
<TR>
    <TD><Input Type="Button" Name=Move Value="Move Amount "></TD>
    <TD></TD>
    <TD><Input Type="Text" Size="4" Name="MoveAmount" Value=0></TD>
<TR>
</FORM>
</TABLE>

</BODY>

<Script Language = "VBScript">

Sub Move_OnClick
    ' Make sure move value entered is an integer.
    If IsNumeric(Document.Form.MoveAmount.Value)Then
        Document.Form.MoveAmount.Value = CInt(Document.Form.MoveAmount.Value)
        Document.Form.Submit
    Else
        MsgBox "You Must Enter a Number", ,"ADO-ASP Example"
        Document.Form.MoveAmount.Value = 0
    End If
End Sub

Sub cmdDown_OnClick
    Document.Form.MoveAmount.Value = -1
    Document.Form.Submit
End Sub

Sub cmdUp_OnClick
    Document.Form.MoveAmount.Value = 1
    Document.Form.Submit
End Sub
</Script>


MoveFirst、MoveLast、MoveNext、MovePrevious メソッドの例 (VBScript)

この例では、与えられたコマンドに基づいて Recordset のレコード ポインタを移動するのに、MoveFirst、MoveLast、MoveNext、および MovePrevious メソッドを使います。このプロシージャを実行するには、MoveAny プロシージャが必要です。

次の例は、Active Server Pages (ASP) で使用してください。この例を完全に機能させて表示するには、SDK と共にインストールされるデータ ソース AdvWorks.mdb が、C:\mssdk\samples\dataaccess\rds に置かれている必要があります。これは、Microsoft Access のデータベース ファイルです。

検索機能を使ってファイル Adovbs.inc を検索し、使用するディレクトリに Adovbs.inc を置きます。次のコードをコピーして、メモ帳または別のテキスト エディタに貼り付け、「MoveOne.asp」という名前で保存します。結果は、任意のブラウザで表示できます。

レコードセットの上限または下限を越えて移動しようとすると、エラー処理の動作を確認できます。

<%@ Language=VBScript %>
<!-- #Include file="ADOVBS.INC" -->
<HTML><HEAD>
<TITLE>ADO MoveNext, MovePrevious, MoveLast, MoveFirst Methods</TITLE>
<STYLE>
<!--
BODY {
    font-family: "MS SANS SERIF",sans-serif;
     }
.thead {
    background-color: #008080;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
    color: white;
    }
.tbody {
    text-align: center;
    background-color: #f7efde;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
     }
.tmsg {
    color: red;
    text-align: center;
    }
-->
</STYLE>
</HEAD>

<BODY>
<H3>ADO Methods<BR>MoveNext, MovePrevious, MoveLast, MoveFirst</H3>
<!-- Create Connection and Recordset Objects on Server -->
<%
src = "C:\mssdk\samples\dataaccess\rds\advworks.mdb"
sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & src

'Create and Open Connection Object
Set OBJdbConn = Server.CreateObject("ADODB.Connection")
OBJdbConn.Open  sConnStr
'Create and Open Recordset Object
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConn
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.CursorLocation = adUseClient
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"
RsCustomerList.Open

RsCustomerList.MoveFirst

If Not IsEmpty(Request.Form("MoveAction")) Then
    strAction = Request.Form("MoveAction")
    varPosition  = Request.Form("Position")

    RsCustomerList.AbsolutePosition = varPosition

    Select Case strAction

      Case "MoveNext"

        RsCustomerList.MoveNext
        If RsCustomerList.EOF Then
            RsCustomerList.MoveLast
            strMessage = "Can't move beyond the last record."
        End If

      Case "MovePrev"

        RsCustomerList.MovePrevious
        If RsCustomerList.BOF Then
            RsCustomerList.MoveFirst
            strMessage = "Can't move beyond the first record."
        End If

      Case "MoveLast"

        RsCustomerList.MoveLast

      Case "MoveFirst"

        RsCustomerList.MoveFirst

    End Select
End If

%>

<H3>Current Record Number is <BR>
<!-- Display Current Record Number and Recordset Size -->
<%=RsCustomerList.AbsolutePosition%> of <%=RsCustomerList.RecordCount%></H3>
<HR>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<!-- BEGIN column header row for Customer Table-->
<TR CLASS=thead>
    <TD>Company Name</TD>
    <TD>Contact Name</TD>
    <TD>Phone Number</TD>
    <TD>City</TD>
    <TD>State/Province</TD>
</TR>

<!--Display ADO Data from Customer Table-->
<TR CLASS=tbody>
  <TD> <%= RSCustomerList("CompanyName")%> </TD>
  <TD> <%= RScustomerList("ContactLastName") & ", " %>
       <%= RScustomerList("ContactFirstName") %> </TD>
  <TD> <%= RScustomerList("PhoneNumber")%> </TD>
  <TD> <%= RScustomerList("City")%> </TD>
  <TD> <%= RScustomerList("StateOrProvince")%> </TD>
</TR>
<TR CLASS=tmsg>
  <TD COLSPAN=5><%=strMessage%></TD>
</TR>
</TABLE>

<HR>
<Input Type=Button Name=cmdDown  Value="&lt;  ">
<Input Type=Button Name=cmdUp Value="  &gt;">
<BR>
<Input Type=Button Name=cmdFirst Value="First Record">
<Input Type=Button Name=cmdLast Value="Last Record">

<H5>Click Direction Arrows to Use MovePrevious or MoveNext</H5>

<!-- Use Hidden Form Fields to send values to Server -->

<Form Method=Post
      Action="<%=Request.ServerVariables("SCRIPT_NAME")%>"
      Name=Form>
<Input Type="Hidden" Size="4" Name="MoveAction" Value="Move">
<Input Type="Hidden" Size="4" Name="Position" Value="<%= RsCustomerList.AbsolutePosition %>">
</Form>

<HR>
</BODY>

<Script Language = "VBScript">
Sub cmdDown_OnClick
    'Set Values in Form Input Boxes and Submit Form
    Document.form.MoveAction.Value = "MovePrev"
    Document.Form.Submit
End Sub

Sub cmdUp_OnClick
    Document.form.MoveAction.Value = "MoveNext"
    Document.Form.Submit
End Sub

Sub cmdFirst_OnClick
    Document.form.MoveAction.Value = "MoveFirst"
    Document.Form.Submit
End Sub

Sub cmdLast_OnClick
    Document.form.MoveAction.Value = "MoveLast"
    Document.Form.Submit
End Sub
</Script>


Open、Close メソッドの例 (VBScript)

この例では、既に開かれている Recordset と Connection オブジェクトの両方に対し、Open と Close メソッドを使用します。

次の例は、Active Server Pages (ASP) で使用してください。この例を完全に機能させて表示するには、SDK と共にインストールされるデータ ソース AdvWorks.mdb が、C:\mssdk\samples\dataaccess\rds に置かれている必要があります。これは、Microsoft Access のデータベース ファイルです。

検索機能を使ってファイル Adovbs.inc を検索し、使用するディレクトリに置きます。次のコードをコピーして、メモ帳または別のテキスト エディタに貼り付け、「OpenClose.asp」という名前で保存します。結果は、任意のブラウザで表示できます。

<%@ Language=VBScript %>
<!-- #Include file="ADOVBS.INC" -->
<HTML>
<HEAD>
<TITLE>ADO Open Method</TITLE>
<STYLE>
<!--
BODY {
    font-family: "MS SANS SERIF",sans-serif;
     }
.thead {
    background-color: #008080;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
    color: white;
    }
.thead2 {
    background-color: #800000;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
    color: white;
    }
.tbody {
    text-align: center;
    background-color: #f7efde;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
     }
-->
</STYLE>
</HEAD>
<BODY>
<H3>ADO Open Method</H3>

<TABLE WIDTH=600 BORDER=0>
<TR>
<TD VALIGN=TOP COLSPAN=3>
<FONT SIZE=2>
<!--- ADO Connection used to create 2 recordsets-->
<%
src = "C:\mssdk\samples\dataaccess\rds\advworks.mdb"
sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & src

'Create and Open Connection Object
Set OBJdbConn = Server.CreateObject("ADODB.Connection")
OBJdbConn.Open  sConnStr
SQLQuery = "SELECT * FROM Customers"

'First Recordset RsCustomerList
Set RsCustomerList = OBJdbConn.Execute(SQLQuery)

'Second Recordset RsProductist
Set RsProductList = Server.CreateObject("ADODB.Recordset")
RsProductList.CursorType = adOpenDynamic
RsProductList.LockType = adLockOptimistic
RsProductList.Open "Products", OBJdbConn
%>

<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<!-- BEGIN column header row for Customer Table-->
<TR CLASS=thead>
    <TD>Company Name</TD>
    <TD>Contact Name</TD>
    <TD>E-mail address</TD>
    <TD>City</TD>
    <TD>State/Province</TD>
</TR>

<!--Display ADO Data from Customer Table-->
<% Do While Not RScustomerList.EOF %>
<TR CLASS=tbody>
  <TD> <%= RSCustomerList("CompanyName")%> </TD>
  <TD> <%= RScustomerList("ContactLastName") & ", " %>
       <%= RScustomerList("ContactFirstName") %> </TD>
  <TD> <%= RScustomerList("ContactLastName")%> </TD>
  <TD> <%= RScustomerList("City")%> </TD>
  <TD> <%= RScustomerList("StateOrProvince")%> </TD>
</TR>
<!-Next Row = Record Loop and add to html table-->
<%
   RScustomerList.MoveNext
Loop
RScustomerList.Close
%>
</TABLE>

<HR>

<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<!-- BEGIN column header row for Product List Table-->

<TR CLASS=thead2>
    <TD>Product Type</TD>
    <TD>Product Name</TD>
    <TD>Product Description</TD>
    <TD>Unit Price</TD>
</TR>
<!-- Display ADO Data Product List-->
<% Do While Not RsProductList.EOF %>
  <TR CLASS=tbody>
  <TD> <%= RsProductList("ProductType")%> </TD>
  <TD> <%= RsProductList("ProductName")%> </TD>
  <TD> <%= RsProductList("ProductDescription")%> </TD>
  <TD> <%= RsProductList("UnitPrice")%> </TD>
  </TR>
  <!--  Next Row = Record -->
<%
  RsProductList.MoveNext
Loop
OBJdbConn.Close

'Remove Objects from Memory Freeing
Set RsProductList = Nothing
Set OBJdbConn = Nothing
%>
</TABLE>
</BODY>
</HTML>


ReadyState プロパティの例 (VBScript)

この例では、VBScript コード中で実行時に RDS.DataControl オブジェクトの ReadyStateプロパティを取得する方法を示します。ReadyState は読み取り専用プロパティです。

この例をテストするには、このコードをコピーして、通常の HTML 文書の <Body> タグと </Body> タグの間に貼り付け、「RDSReadySt.asp」という名前を付けて保存してください。ASP スクリプトでサーバーを識別しています。

<%@ Language=VBScript %>
<H2>RDS API Code Examples </H2>
<HR>
<H3>RDS.DataControl ReadyState Property</H3>
<!-- RDS.DataControl with parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS>
    <PARAM NAME="SQL" VALUE="Select * from Employee for browse">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB;Data Source=MyServer;">
    <PARAM NAME="ExecuteOptions" VALUE="adcExecAsync">
    <PARAM NAME="FetchOptions" VALUE="adcFetchAsync">
</OBJECT>

<Script Language="VBScript">

Sub Window_OnLoad
    Select Case RDS.ReadyState
        case 2: MsgBox "Executing Query"
        case 3: MsgBox "Fetching records in background"
        case 4: MsgBox "All records fetched"
    End Select
End Sub
</Script>


Recordset、SourceRecordset プロパティの例 (VBScript)

この例では、既定のビジネス オブジェクトである RDSServer.DataFactory の必須パラメータを実行時に設定する方法を示します。

この例をテストするには、このコードをコピーして、通常の HTML 文書の <Body> タグと </Body> タグの間に貼り付け、「SourceRS.asp」という名前を付けて保存してください。ASP スクリプトでサーバーを識別しています。

<Center>
<H2>RDS API Code Examples</H2>
<HR>
<H3>Using SourceRecordset and Recordset with RDSServer.DataFactory</H3>
<!-- RDS.DataSpace ID RDS1 -->
<OBJECT ID="RDS1" WIDTH=1 HEIGHT=1
CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
</OBJECT>

<!-- RDS.DataControl with parameters set at Run Time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDC WIDTH=1 HEIGHT=1>
</OBJECT>

<TABLE DATASRC=#RDC>
    <TR>
        <TD> <INPUT DATAFLD="FirstName" SIZE=15> </TD>
        <TD> <INPUT DATAFLD="LastName" SIZE=15 id=text1 name=text1> </TD>
        <TD> <INPUT DATAFLD="Title" SIZE=15 id=text2 name=text2> </TD>
        <TD> <INPUT DATAFLD="Type" SIZE=15 id=text3 name=text3> </TD>
        <TD> <INPUT DATAFLD="Email" SIZE=15 id=text4 name=text4> </TD>
    </TR>
</TABLE>
<HR>
<Input Size=70 Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>
<Input Size=70 Name="txtConnect" Value="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB"><BR>
<Input Size=70 Name="txtSQL" Value="Select * from Employee">
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>

</Center>
<Script Language="VBScript">
<!--
Dim ADF
Dim strServer
strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"

Sub Run_OnClick()
    Dim objADORs
    ' Create RDSServer.DataFactory Object
    Set RDF = RDS1.CreateObject("RDSServer.DataFactory", strServer)
    ' Get Recordset
    Set objADORs = RDF.Query(txtConnect.Value,txtSQL.Value)

    ' Set parameters of RDS.DataControl at run time.
    RDC.Server = txtServer.Value
    RDC.SQL = txtSQL.Value
    RDC.Connect = txtConnect.Value
    RDC.Refresh
End Sub
-->
</Script>


Refresh メソッドの例 (VBScript)

次の例では、RDS.DataControl の必要なパラメータを実行時に設定する方法を示します。Refresh メソッドによる Recordset の取得方法は、ExecuteOptions と FetchOptions プロパティの設定によって決定されます。この例をテストするには、このコードをコピーして通常の ASP ドキュメントに貼り付け、「Refresh.asp」という名前を付けて保存してください。ASP スクリプトでサーバーを識別しています。

<%@ Language=VBScript %>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE></TITLE>
</HEAD>
<BODY>
<H2>RDS API Code Examples </H2>
<HR>
<TABLE DATASRC=#RDC>
    <TR>
        <TD> <INPUT DATAFLD="FirstName" SIZE=15 id=text5 name=text5> </TD>
        <TD> <INPUT DATAFLD="LastName" SIZE=15 id=text1 name=text1> </TD>
        <TD> <INPUT DATAFLD="Title" SIZE=15 id=text2 name=text2> </TD>
        <TD> <INPUT DATAFLD="Type" SIZE=15 id=text3 name=text3> </TD>
        <TD> <INPUT DATAFLD="Email" SIZE=15 id=text4 name=text4> </TD>
    </TR>
</TABLE>

<!-- RDS.DataControl with no parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDC HEIGHT=1 WIDTH=1>
</OBJECT>
<HR>
Server: <Input Size=70 Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>
Connect: <Input Size=70 Name="txtConnect" Value="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB"><BR>
SQL: <Input Size=70 Name="txtSQL" Value="Select * from Employee">
<HR>
<TABLE BORDER=1 WIDTH="60%">
<TR>
    <TD COLSPAN=3 BGCOLOR=silver>
    Choose if you want the Recordset brought back Synchronously on the
    current calling thread or Asynchronously on another thread.
    </TD>
</TR>
<TR>
    <TD>Synchronously: <BR>
        <Input Type="Radio" Name="optExecuteOptions" Checked OnClick="SetExO('adcExecSync')">
    </TD>
    <TD>Asynchronously: <BR>
        <Input Type="Radio" Name="optExecuteOptions"  OnClick="SetExO('adcExecAsync')">
    </TD>
    <TD>&nbsp;</TD>
</TR>
<TR>
    <TD COLSPAN=3 BGCOLOR=silver>
    Fetch Up Front, Background Fetch with Blocking or Background Fetch
    without Blocking
    </TD>
<TR>
    <TD>Up Front:<BR>
        <Input Type="Radio" Name="optFetchOptions"  OnClick="SetFO('adcFetchUpFront')">
    </TD>
    <TD>Background w/ Blocking:<BR>
        <Input Type="Radio" Name="optFetchOptions" Checked OnClick="SetFO('adcFetchBackground')">
    </TD>
    <TD>Background w/o Blocking:<BR>
        <Input Type="Radio" Name="optFetchOptions"  OnClick="SetFO('adcFetchAsync')">
    </TD>
</TR>
</TABLE>

<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>

<Script Language="VBScript">
<!--
Dim EO         'ExecuteOptions
Dim FO         'FetchOptions
EO = "adcExecSync"    'Default value
FO = "adcFetchBackground"   'Default value

Sub SetExO(NewEO)
    EO = NewEO
End Sub

Sub SetFO(NewFO)
    FO = NewFO
End Sub

' Set parameters of RDS.DataControl at Run Time
Sub Run_OnClick
    RDC.Server = txtServer.Value
    RDC.SQL = txtSQL.Value
    RDC.Connect = txtConnect.Value
    If EO = "adcExecSync" Then   'Determine which ExecuteOption chosen
        RDC.ExecuteOptions = adcExecSync
        MsgBox "Recordset brought in on current calling thread Syncronously"
    Else
        RDC.ExecuteOptions = adcExecAsync
        MsgBox "Recordset brought in on another thread Asyncronously"
    End If

    If FO = "adcFetchBackground" Then      'Determine                  ‘which FetchOption chosen
        RDC.FetchOptions = adcFetchBackground
        MsgBox "Control goes back to user after first batch of records returned"
    ElseIf FO = " adcFetchUpFront" Then
        RDC.FetchOptions = adcFetchUpFront
        MsgBox "All records returned before control goes back to user"
    Else
        RDC.FetchOptions = adcFetchAsync
        MsgBox "Control goes back to user immediately"
    End If

    RDC.Refresh
End Sub
-->
</Script>
</BODY>
</HTML>


Server プロパティの例 (VBScript)

次のコードでは、デザイン時に RDS.DataControl パラメータを設定し、コントロールを SQLOLEDB プロバイダを使ってデータ連結コントロールにバインドする方法を示します。このコードをコピーして通常の ASP ドキュメントに貼り付け、「ServerProp.asp」という名前で保存してください。ASP スクリプトでサーバーを識別しています。

<%@ Language=VBScript %>
<HTML>
<HEAD>
<TITLE>Server Property Example</TITLE>
</HEAD>
<BODY>
<H2>RDS API Code Examples </H2>
<HR><BR>
<H3>Remote Data Service</H3>

<TABLE DATASRC=#RDS>
    <TR>
        <TD> <SPAN DATAFLD="FirstName"></SPAN> </TD>
        <TD> <SPAN DATAFLD="LastName"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Title"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Type"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Email"></SPAN> </TD>
    </TR>
</TABLE>
<!-- Remote Data Service with Parameters set at Design Time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS HEIGHT=1 WIDTH=1>
    <PARAM NAME="SQL" VALUE="Select * from Employee for browse">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB;Data Source=MyServer;">
</OBJECT>

</BODY>
</HTML>

次の例では、RDS.DataControl の必要なパラメータを実行時に設定する方法を示します。この例をテストするには、このコードをコピーして通常の ASP ドキュメントに貼り付け、「ServerProp2.asp」という名前を付けて保存してください。ASP スクリプトでサーバーを識別しています。

<%@ Language=VBScript %>
<HTML>
<HEAD>
<TITLE>Remote Data Service Server Property Set at Run Time</TITLE>
</HEAD>
<BODY>

<H2>RDS API Code Examples</H2>

<H3>Remote Data Service Server Property Set at Run Time</H3>

<!-- RDS.DataControl with no parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDC HEIGHT=1 WIDTH=1>
</OBJECT>

<TABLE DATASRC=#RDC>
    <TR>
        <TD> <SPAN DATAFLD="FirstName"></SPAN> </TD>
        <TD> <SPAN DATAFLD="LastName"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Title"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Type"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Email"></SPAN> </TD>
    </TR>
</TABLE>

<HR>
<Input Size=70 Name="txtServer" Value="HTTP://<%= Request.ServerVariables("SERVER_NAME")%>">
<BR>
<Input Size=70 Name="txtConnect" Value="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB;Data Source=MyServer;">
<BR>
<Input Size=70 Name="txtSQL" Value="Select * from Employee">
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>

<Script Language="VBScript">
<!--
' Set parameters of RDS.DataControl at Run Time
Sub Run_OnClick
    RDC.Server = txtServer.Value
    RDC.SQL = txtSQL.Value
    RDC.Connect = txtConnect.Value
    RDC.Refresh
End Sub
-->
</Script>
</BODY>
</HTML>


SQL プロパティの例 (VBScript)

このコードでは、Pubs というデータベースを使って、RDS.DataControl の SQL パラメータをデザイン時に設定し、そのコントロールをデータ連結コントロールにバインドする方法を示します。Pubs は SQL Server に付属しています。この例をテストするには、使用している Web サーバー上で、SQL.asp という ASP ドキュメントを作成し、次のコードを貼り付けてください。

<%@ Language=VBScript %>
<HTML>
<HEAD>
</HEAD>
<BODY>
<!-- RDS.DataControl -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID=RDC HEIGHT=1 WIDTH=1>
    <PARAM NAME="SQL" VALUE="Select * from Authors">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="dsn=Pubs;UID=sa;PWD=;">
</OBJECT>

<!-- Data Table -->

<TABLE DATASRC=#RDC BORDER=1>
    <TR>
        <TD> <SPAN DATAFLD="au_id"></SPAN> </TD>
        <TD> <SPAN DATAFLD="au_lname"></SPAN> </TD>
        <TD> <SPAN DATAFLD="au_fname"></SPAN> </TD>
        <TD> <SPAN DATAFLD="city"></SPAN> </TD>
        <TD> <SPAN DATAFLD="state"></SPAN> </TD>
    </TR>
</TABLE>

</BODY>
</HTML>

次の例では、RDS.DataControl の必要なパラメータを実行時に設定する方法を示します。この例をテストするには、このコードをコピーして通常の ASP ドキュメントに貼り付け、「SQL2.asp」という名前を付けて保存してください。ASP スクリプトでサーバーを識別しています。

<%@ Language=VBScript %>
<HTML>
<BODY>
<H2>RDS API Code Examples </H2>
<H3>Remote Data Service SQL Property Set at Run Time</H3>

<!-- RDS.DataControl with no parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDC HEIGHT=1 WIDTH=1>
</OBJECT>

<TABLE DATASRC=#RDC>
    <TR>
        <TD> <SPAN DATAFLD="FirstName"></SPAN> </TD>
        <TD> <SPAN DATAFLD="LastName"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Title"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Type"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Email"></SPAN> </TD>
    </TR>
</TABLE>

<HR>
<Input Size=70 Name="txtServer" Value= "http://<%=Request.ServerVariables("SERVER_NAME")%>">
<BR>
<Input Size=70 Name="txtConnect" Value="dsn=Pubs;UID=sa;PWD=;">
<BR>
<Input Size=70 Name="txtSQL" VALUE="Select * from Employee">
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>

<Script Language="VBScript">
<!--
' Set parameters of RDS.DataControl at Run Time.
Sub Run_OnClick
    RDC.Server = txtServer.Value
    RDC.SQL = txtSQL.Value
    RDC.Connect = txtConnect.Value
    RDC.Refresh
End Sub
-->
</Script>
</BODY>
</HTML>


SubmitChanges メソッドの例 (VBScript)

次のコードでは、RDS.DataControl オブジェクトに対する SubmitChanges メソッドの使用方法を示します。

この例をテストするには、このコードをコピーして通常の ASP ドキュメントに貼り付け、「SubmitChanges.asp」という名前で保存してください。ASP スクリプトでサーバーを識別しています。

<%@ Language=VBScript %>
<HTML>
<BODY>
<H2>RDS API Code Examples</H2>
<H3>Remote Data Service SubmitChanges and CancelUpdate Methods</H3>

<!-- RDS.DataControl with parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDC HEIGHT=1 WIDTH=1>
    <PARAM NAME="SQL" VALUE="Select * from Employee for browse">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB;Data Source=MyServer;">
</OBJECT>

<TABLE DATASRC="#RDC">
<THEAD>
<TR ID="ColHeaders">
   <TH>ID</TH>
   <TH>FName</TH>
   <TH>LName</TH>
   <TH>Name</TH>
   <TH>Title</TH>
   <TH>Type</TH>
   <TH>Email</TH>
   <TH>MgrEmail</TH>
   <TH>Bldg</TH>
   <TH>Rm</TH>
   <TH>Phone</TH>
</TR>
</THEAD>

<TBODY>
<TR>
   <TD> <INPUT DATAFLD="ID" size=4> </TD>
   <TD> <INPUT DATAFLD="FirstName" size=10> </TD>
   <TD> <INPUT DATAFLD="LastName" size=10> </TD>
   <TD> <INPUT DATAFLD="Name" size=15> </TD>
   <TD> <INPUT DATAFLD="Title" size=20> </TD>
   <TD> <INPUT DATAFLD="Type" size=10> </TD>
   <TD> <INPUT DATAFLD="Email" size=10> </TD>
   <TD> <INPUT DATAFLD="ManagerEmail" size=10> </TD>
   <TD> <INPUT DATAFLD="Building" size=3> </TD>
   <TD> <INPUT DATAFLD="Room" size=5> </TD>
   <TD> <INPUT DATAFLD="Phone" size=8> </TD>
</TR>
</TBODY>
</TABLE>

<HR>
<INPUT TYPE=BUTTON NAME="SubmitChange" VALUE="Submit-Changes">
<INPUT TYPE=BUTTON NAME="CancelChange" VALUE="Cancel-Update"><BR>
<H4>Alter a current entry in the table. Move off that Row. <BR>
Submit the Changes to your DBMS or cancel the updates. </H4>
</Center>
<Script Language="VBScript">
<!--
' Set parameters of RDS.DataControl at Run Time
Sub SubmitChange_OnClick
    RDC.SubmitChanges
    RDC.Refresh
End Sub

Sub CancelUpdate_OnClick
    RDC.CancelUpdate
    RDC.Refresh
End Sub
-->
</Script>
</BODY>
</HTML>

次のコードの一部分は、RDSServer.DataFactory オブジェクトに対する SubmitChanges メソッドの使用方法を示しています。RDS.DataControl が使われない Visual Basic プロジェクトの場合、RDSServer.DataFactory に変更を送る必要がある場合があります。このプロジェクトを作成するには、Visual Basic のフォームを開き、リスト ボックス (List1)、3 つのテキスト ボックス (txtServer、txtConnect、および txtGetRecordset)、2 つのコマンド ボタン (cmdGetRecordset と cmdSubmitChanges) を配置します。

Dim ads As Object    ' RDS.DataSpace object
Dim adf As Object    ' RDSServer.DataFactory object
Dim objADORs As Object    'ADOR.Recordset object

Private Sub UserDocument_Initialize()
    Call Form_Load
End Sub

Private Sub Form_Load()
    txtServer.Text = "http://MyWebServer"
    txtConnect.Text = "Dsn=Pubs;Uid=sa;Pwd=;"
    txtGetRecordset.Text = "Select au_lname from authors"
End Sub

Private Sub cmdGetRecordset_Click()
    Dim Server As String
    Server = txtServer.Text

    ' Create RDS.DataSpace using CreateObject Method of RDS.DataSpace.
    Set ads = CreateObject("RDS.DataSpace")
    Set adf = ads.CreateObject("RDSServer.DataFactory", Server)

    ' Populate ListBox with Recordset.
    MousePointer = vbHourglass
    Set objADORs = adf.Query(CStr(txtConnect.Text), CStr(txtGetRecordset.Text))
    List1.Clear
    While Not objADORs.EOF
        List1.AddItem objADORs(0).Value
        objADORs.MoveNext
    Wend
    MousePointer = vbNormal
End Sub
Sub cmdSubmitChanges_OnClick
    adf.SubmitChanges " Dsn=Pubs;Uid=sa;Pwd=;", _
    objADORs
End Sub


URL プロパティの例 (VBScript)

次のコードでは、クライアント側で URL プロパティを設定し、.ASP ファイルを指定する方法を示します。.ASP ファイルにより、データ ソースへの変更が次々と処理されます。

Sub Update_OnClick
    If ADC.ReadyState <> adcReadyStateLoaded then
        ADC.URL = "RDSSubmit.asp"
        ADC.SubmitChanges
        ADC.Refresh
    Else
        MsgBox "Query results still arriving, Please wait"
    End if
End Sub

RDSSubmit.asp にあるサーバー側のコードにより、更新されたレコードセットがデータ ソースに送られます。

<%

Option Explicit

Dim strSQL, strConnection, rstCustomers

strConnection = _
    "Provider=SQLOLEDB;Server=Srv;Database=Pubs;User Id=sa;Password=;"
Set rstCustomers = Server.CreateObject("ADODB.Recordset")

On Error Resume Next
rstCustomers.Open Request
rstCustomers.ActiveConnection = strConnection
rstCustomers.UpdateBatch
If Err.Number <> 0 Then
    Request.Status = "500 " + Err.Source + ": " + Err.Description
End If
%>


Microsoft Visual C++ での ADO コードの例

Microsoft Visual C++ で記述するときの ADO のメソッド、プロパティ、およびイベントの使用方法については、次のコード例を参照してください。

注意 コード例は最初から最後までの全体をコード エディタに貼り付けてください。このコード例は、一部分だけを使ったり、改行の情報が失われると、正常に動作しない場合があります。

メソッド

  • AddNew メソッドの例

  • Append、CreateParameter メソッドの例

  • AppendChunk、GetChunk メソッドの例

  • BeginTrans、CommitTrans、RollbackTrans メソッドの例

  • Cancel メソッドの例

  • Clone メソッドの例

  • CompareBookmarks メソッドの例

  • Delete メソッドの例

  • Execute、Requery、Clear メソッドの例

  • Find メソッドの例

  • GetRows メソッドの例

  • GetString メソッドの例

  • MoveFirst、MoveLast、MoveNext、MovePrevious メソッドの例

  • NextRecordset メソッドの例

  • Open、Close メソッドの例

  • OpenSchema メソッドの例

  • Refresh メソッドの例

  • Resync メソッドの例

  • Save、Open メソッドの例

  • Seek メソッド、Index プロパティの例

  • Supports メソッドの例

  • Update、CancelUpdate メソッドの例

  • UpdateBatch、CancelBatch メソッドの例

プロパティ

  • AbsolutePage、PageCount、PageSize プロパティの例

  • AbsolutePosition、CursorLocation プロパティの例

  • ActiveCommand プロパティの例

  • ActiveConnection、CommandText、CommandTimeout、CommandType、Size、Direction プロパティの例

  • ActualSize、DefinedSize プロパティの例

  • Attributes、Name プロパティの例

  • BOF、EOF、Bookmark プロパティの例

  • CacheSize プロパティの例

  • ConnectionString、ConnectionTimeout、State プロパティの例

  • Count プロパティの例

  • CursorType、LockType、EditMode プロパティの例

  • Description、NativeError、Number、Source、SQLState プロパティの例

  • Filter、RecordCount プロパティの例

  • Handler プロパティの例

  • Index プロパティと Seek メソッドの例

  • IsolationLevel、Mode プロパティの例

  • Item プロパティの例

  • MarshalOptions プロパティの例

  • MaxRecords プロパティの例

  • NumericScale、Precision プロパティの例

  • Optimize プロパティの例

  • OriginalValue、UnderlyingValue プロパティの例

  • Prepared プロパティの例

  • Provider、DefaultDatabase プロパティの例

  • Sort プロパティの例

  • Source プロパティの例

  • State プロパティの例

  • Status プロパティの例

  • StayInSync プロパティの例

  • Type プロパティの例 (Field)

  • Type プロパティの例 (Property)

  • Value プロパティの例

  • Version プロパティの例

その他

  • ADO イベント モデルの例


ADO イベント モデルの例 (VC++)

「言語別の ADO イベントのインスタンス作成」の Visual C++ のセクションには、ADO イベント モデルのインスタンスを作成する方法についての一般的な説明があります。ここでは、#import ディレクティブによって作成される環境内でイベント モデルのインスタンスを作成する具体的な例を示します。

一般的な説明では、メソッド シグネチャの参照として adoint.h を使います。ただし、#import ディレクティブを使う結果として、一般的な説明の詳細な点が多少変わります。

  • #import ディレクティブは、typedef、メソッド シグネチャのデータ型およびそれらの基本形の修飾子を解決します。

  • 上書きの必要がある純粋仮想メソッドには、すべて "raw_" というプレフィックスが付きます。

コードの一部は、単にコーディングのスタイルを示しています。

  • Advise メソッドが使う IUnknown のポインタは、QueryInterface への呼び出しを使って明示的に取得されます。

  • クラス定義にデストラクタを明示的にコーディングする必要はありません。

  • QueryInterface、AddRef、および Release の、より強固なインプリメンテーションをコーディングすることもできます。

  • __uuidof() ディレクティブを拡張的に使って、インターフェイスの ID を取得します。

最後に、例には動作可能なコードが含まれています。

  • 例は、コンソール アプリケーションとして記述されています。

  • ユーザー定義のコードは、"// Do some work" というコメントの下に挿入してください。

  • 既定では、すべてのイベント ハンドラは、何も実行しないで後の通知をキャンセルします。ユーザーは、アプリケーションに適したコードを挿入し、必要に応じて通知を利用してください。
// eventmodel.cpp : Defines the entry point for the console application.
//

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")
#include <comdef.h>
#include <stdio.h>

//----The Connection events----------------------------------------------

class CConnEvent : public ConnectionEventsVt
{
private:
        ULONG   m_cRef;
    public:
        CConnEvent() { m_cRef = 0; };
        ~CConnEvent() {};

        STDMETHODIMP QueryInterface(REFIID riid, void ** ppv);
        STDMETHODIMP_(ULONG) AddRef(void);
        STDMETHODIMP_(ULONG) Release(void);

        STDMETHODIMP raw_InfoMessage(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection);

        STDMETHODIMP raw_BeginTransComplete(
            LONG TransactionLevel,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection);

    STDMETHODIMP raw_CommitTransComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection);

        STDMETHODIMP raw_RollbackTransComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection);

        STDMETHODIMP raw_WillExecute(
            BSTR *Source,
            CursorTypeEnum *CursorType,
            LockTypeEnum *LockType,
            long *Options,
            EventStatusEnum *adStatus,
            struct _Command *pCommand,
            struct _Recordset *pRecordset,
            struct _Connection *pConnection);

        STDMETHODIMP raw_ExecuteComplete(
            LONG RecordsAffected,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Command *pCommand,
            struct _Recordset *pRecordset,
            struct _Connection *pConnection);

    STDMETHODIMP raw_WillConnect(
            BSTR *ConnectionString,
            BSTR *UserID,
            BSTR *Password,
            long *Options,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection);

        STDMETHODIMP raw_ConnectComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection);

        STDMETHODIMP raw_Disconnect(
            EventStatusEnum *adStatus,
            struct _Connection *pConnection);
};

//-----The Recordset events----------------------------------------------

class CRstEvent : public RecordsetEventsVt
    {
    private:
        ULONG m_cRef;
    public:
        CRstEvent() { m_cRef = 0; };
        ~CRstEvent() {};

            STDMETHODIMP QueryInterface(REFIID riid, void ** ppv);
            STDMETHODIMP_(ULONG) AddRef(void);
            STDMETHODIMP_(ULONG) Release(void);

            STDMETHODIMP raw_WillChangeField(
            LONG cFields,
            VARIANT Fields,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_FieldChangeComplete(
            LONG cFields,
            VARIANT Fields,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_WillChangeRecord(
            EventReasonEnum adReason,
            LONG cRecords,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_RecordChangeComplete(
            EventReasonEnum adReason,
            LONG cRecords,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_WillChangeRecordset(
            EventReasonEnum adReason,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_RecordsetChangeComplete(
            EventReasonEnum adReason,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_WillMove(
            EventReasonEnum adReason,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_MoveComplete(
            EventReasonEnum adReason,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_EndOfRecordset(
            VARIANT_BOOL *fMoreData,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_FetchProgress(
            long Progress,
            long MaxProgress,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_FetchComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);
};

//-----Implement each connection method----------------------------------

        STDMETHODIMP CConnEvent::raw_InfoMessage(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CConnEvent::raw_BeginTransComplete(
            LONG TransactionLevel,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CConnEvent::raw_CommitTransComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CConnEvent::raw_RollbackTransComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

    STDMETHODIMP CConnEvent::raw_WillExecute(
            BSTR *Source,
            CursorTypeEnum *CursorType,
            LockTypeEnum *LockType,
            long *Options,
            EventStatusEnum *adStatus,
            struct _Command *pCommand,
            struct _Recordset *pRecordset,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CConnEvent::raw_ExecuteComplete(
            LONG RecordsAffected,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Command *pCommand,
            struct _Recordset *pRecordset,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CConnEvent::raw_WillConnect(
            BSTR *ConnectionString,
            BSTR *UserID,
            BSTR *Password,
            long *Options,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CConnEvent::raw_ConnectComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CConnEvent::raw_Disconnect(
            EventStatusEnum *adStatus,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

//-----Implement each recordset method-----------------------------------

        STDMETHODIMP CRstEvent::raw_WillChangeField(
            LONG cFields,
            VARIANT Fields,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_FieldChangeComplete(
            LONG cFields,
            VARIANT Fields,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_WillChangeRecord(
            EventReasonEnum adReason,
            LONG cRecords,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_RecordChangeComplete(
            EventReasonEnum adReason,
            LONG cRecords,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_WillChangeRecordset(
            EventReasonEnum adReason,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_RecordsetChangeComplete(
            EventReasonEnum adReason,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_WillMove(
            EventReasonEnum adReason,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_MoveComplete(
            EventReasonEnum adReason,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_EndOfRecordset(
            VARIANT_BOOL *fMoreData,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_FetchProgress(
            long Progress,
            long MaxProgress,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_FetchComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

//-----Implement QueryInterface, AddRef, and Release---------------------

    STDMETHODIMP CRstEvent::QueryInterface(REFIID riid, void ** ppv)
    {
        *ppv = NULL;
        if (riid == __uuidof(IUnknown) ||
                 riid == __uuidof(RecordsetEventsVt)) *ppv = this;
        if (*ppv == NULL)
            return ResultFromScode(E_NOINTERFACE);
        AddRef();
        return NOERROR;
    }
    STDMETHODIMP_(ULONG) CRstEvent::AddRef(void) { return ++m_cRef; };
    STDMETHODIMP_(ULONG) CRstEvent::Release()
                                        {
                                        if (0 != --m_cRef) return m_cRef;
                                        delete this;
                                        return 0;
                                        }

    STDMETHODIMP CConnEvent::QueryInterface(REFIID riid, void ** ppv)

    {
        *ppv = NULL;
        if (riid == __uuidof(IUnknown) ||
             riid == __uuidof(ConnectionEventsVt)) *ppv = this;
        if (*ppv == NULL)
            return ResultFromScode(E_NOINTERFACE);
        AddRef();
        return NOERROR;
    }
    STDMETHODIMP_(ULONG) CConnEvent::AddRef() { return ++m_cRef; };
    STDMETHODIMP_(ULONG) CConnEvent::Release()
                                        {
                                        if (0 != --m_cRef) return m_cRef;
                                        delete this;
                                        return 0;
                                        }

//-----Write your main block of code-------------------------------------

int main(int argc, char* argv[])
{
    HRESULT hr;
    DWORD   dwConnEvt;
    DWORD   dwRstEvt;
    IConnectionPointContainer   *pCPC = NULL;
    IConnectionPoint         *pCP = NULL;
    IUnknown               *pUnk = NULL;
    CRstEvent               *pRstEvent = NULL;
    CConnEvent               *pConnEvent= NULL;
    int                     rc = 0;
    _RecordsetPtr            pRst;
    _ConnectionPtr            pConn;

    ::CoInitialize(NULL);

    hr = pConn.CreateInstance(__uuidof(Connection));
    if (FAILED(hr)) return rc;

    hr = pRst.CreateInstance(__uuidof(Recordset));
    if (FAILED(hr)) return rc;

    // Start using the Connection events

    hr = pConn->QueryInterface(__uuidof(IConnectionPointContainer),
        (void **)&pCPC);
    if (FAILED(hr)) return rc;
    hr = pCPC->FindConnectionPoint(__uuidof(ConnectionEvents), &pCP);
    pCPC->Release();
    if (FAILED(hr)) return rc;

    pConnEvent = new CConnEvent();
    hr = pConnEvent->QueryInterface(__uuidof(IUnknown), (void **) &pUnk);
    if (FAILED(hr)) return rc;
    hr = pCP->Advise(pUnk, &dwConnEvt);
    pCP->Release();
    if (FAILED(hr)) return rc;

    // Start using the Recordset events

    hr = pRst->QueryInterface(__uuidof(IConnectionPointContainer),
        (void **)&pCPC);
    if (FAILED(hr)) return rc;
    hr = pCPC->FindConnectionPoint(__uuidof(RecordsetEvents), &pCP);
    pCPC->Release();
    if (FAILED(hr)) return rc;

    pRstEvent = new CRstEvent();
    hr = pRstEvent->QueryInterface(__uuidof(IUnknown), (void **) &pUnk);
    if (FAILED(hr)) return rc;
    hr = pCP->Advise(pUnk, &dwRstEvt);
    pCP->Release();
    if (FAILED(hr)) return rc;

    // Do some work

    pConn->Open("dsn=Pubs;", "sa", "", adConnectUnspecified);
    pRst->Open("SELECT * FROM authors", (IDispatch *) pConn,
            adOpenStatic, adLockReadOnly, adCmdText);
    pRst->MoveFirst();
    while (pRst->EndOfFile == FALSE)
    {
        wprintf(L"Name = '%s'\n", (wchar_t*)
            ((_bstr_t) pRst->Fields->GetItem("au_lname")->Value));
        pRst->MoveNext();
    }

    pRst->Close();
    pConn->Close();

    // Stop using the Connection events

    hr = pConn->QueryInterface(__uuidof(IConnectionPointContainer),
        (void **) &pCPC);
    if (FAILED(hr)) return rc;
    hr = pCPC->FindConnectionPoint(__uuidof(ConnectionEvents), &pCP);
    pCPC->Release();
    if (FAILED(hr)) return rc;
    hr = pCP->Unadvise( dwConnEvt );
    pCP->Release();
    if (FAILED(hr)) return rc;

    // Stop using the Recordset events
    hr = pRst->QueryInterface(__uuidof(IConnectionPointContainer),
        (void **) &pCPC);
    if (FAILED(hr)) return rc;
    hr = pCPC->FindConnectionPoint(__uuidof(RecordsetEvents), &pCP);
    pCPC->Release();
    if (FAILED(hr)) return rc;
    hr = pCP->Unadvise( dwRstEvt );
    pCP->Release();
    if (FAILED(hr)) return rc;

    CoUninitialize();
    return 1;
}


AbsolutePage、PageCount、PageSize プロパティの例 (VC++)

この例では、AbsolutePage、PageCount、および PageSize プロパティを使って、Employee テーブルから名前と雇用日のデータを、一度に 5 レコードずつ表示します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include "conio.h"
#include "AbsolutepageX.h"

//Function Declarations.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AbsolutePageX(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AbsolutePageX();

    ::CoUninitialize();
}

/////////////////////////////////////////////////////////////
//                                                         //
//      AbsolutePageX Function                             //
//                                                         //
/////////////////////////////////////////////////////////////

void AbsolutePageX(void)
{

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr   pRstEmployees   = NULL;

    //Define Other Variables
    //Interface Pointer declared.(VC++ Extensions)
    IADORecordBinding   *picRs = NULL;
    CEmployeeRs emprs;          //C++ class object
    HRESULT hr = S_OK;
    _bstr_t strMessage;

    //Open a recordset using a Client Cursor
    //For the Employee Table

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Open a recordset.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        // Use client cursor to enable Absoluteposition property.
        pRstEmployees->CursorLocation = adUseClient;

        // You have to explicitly pass the default Cursor type
        // and LockType to the Recordset here
        TESTHR(hr =    pRstEmployees->Open("employee",
            strCnn,adOpenForwardOnly,adLockReadOnly,adCmdTable));

        //Open an IADORecordBinding interface pointer which we'll use for
        //Binding Recordset to a class
        TESTHR(pRstEmployees->QueryInterface
            (__uuidof(IADORecordBinding), (LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&emprs));

        //Display Names and hire dates, five records at a time
        pRstEmployees->PageSize = 5;

        int intPageCount = pRstEmployees->PageCount;

        for(int intPage=1;intPage<=intPageCount;intPage++)
        {
            pRstEmployees->put_AbsolutePage((enum PositionEnum)intPage);
            strMessage = "";

            for(int intRecord=1;
                intRecord<=pRstEmployees->PageSize;intRecord++)
            {
                printf("\t%s %s %.10s\n",
                    emprs.lau_fnameStatus == adFldOK ?
                    emprs.m_szau_fname : "<NULL>",
                    emprs.lau_lnameStatus == adFldOK ?
                    emprs.m_szau_lname : "<NULL>",
                    emprs.lau_hiredateStatus == adFldOK ?
                    emprs.m_szau_hiredate : "<NULL>");

                pRstEmployees->MoveNext();

                if(pRstEmployees->EndOfFile)
                    break;
                }

            printf("\n Press any key to continue...");getch();

            //Clear the Screen for the next Display
            system("cls");
        }

        // Clean up objects before exit.
        pRstEmployees->Close();

        //Release the IADORecordset Interface here
        if (picRs)
            picRs->Release();
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                printf("Error:\n");
                printf("Code = %08lx\n", e.Error());
                printf("Message = %s\n", e.ErrorMessage());
                printf("Source = %s\n", (LPCSTR) e.Source());
                printf("Description = %s\n", (LPCSTR) e.Description());
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        printf("Error:\n");
        for(long iError = 0; iError < nCount; iError++)
        {
            pErr = pConnection->Errors->GetItem(iError);
            printf("\t Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

AbsolutePageX.h:

#include "icrsint.h"

//This Class extracts only fname,lastname and hire_date

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    //Column fname is the 2nd field in the table
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_fname,
        sizeof(m_szau_fname), lau_fnameStatus, FALSE)

    ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_szau_lname,
        sizeof(m_szau_lname), lau_lnameStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(8, adVarChar, m_szau_hiredate,
        sizeof(m_szau_hiredate), lau_hiredateStatus, TRUE)

END_ADO_BINDING()

public:
    CHAR   m_szau_lname[41];
    ULONG  lau_lnameStatus;
    CHAR   m_szau_fname[41];
    ULONG  lau_fnameStatus;
    CHAR   m_szau_hiredate[40];
    ULONG  lau_hiredateStatus;
};


AbsolutePosition、CursorLocation プロパティの例 (VC++)

この例では、AbsolutePosition プロパティを使って Recordset のすべてのレコードを列挙するループの進行状況をトレースします。ここでは、CursorLocation プロパティを使ってカーソルをクライアント カーソルに設定することにより、AbsolutePosition プロパティを使用可能にしています。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include "conio.h"
#include "AbsolutePositionX.h"

//Function Declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AbsolutePositionX(void);
void AbsolutePosition2X(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AbsolutePositionX();

    //Clear the screen for the next display
    printf("Press any key to continue...");
    getch();
    system("cls");

    AbsolutePosition2X();
    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AbsolutePositionX Function                       //
//                                                       //
///////////////////////////////////////////////////////////

void AbsolutePositionX(void)
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstEmployees  = NULL;

    //Define Other Variables
    //Interface Pointer declared.(VC++ Extensions)
    IADORecordBinding *picRs = NULL;
    CEmployeeRs emprs;                  //C++ class object
    _bstr_t strMessage;
    char chKey;

    //Open a recordset using a Client Cursor
    //For the Employee Table

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        //Open a recordset.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        //Use client cursor to enable AbsolutePosition property.
        pRstEmployees->CursorLocation = adUseClient;

        //You have to explicitly pass the default Cursor type
        //and LockType to the Recordset.
        TESTHR(pRstEmployees->Open("employee",
        strCnn,adOpenForwardOnly,adLockReadOnly,adCmdTable));

        // Open an IADORecordBinding interface pointer which we'll use
        // for Binding Recordset to a class.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&emprs));

        strMessage= "";

        //Enumerate recordset
        do
        {
            //Display Current Record Information
            printf("Employee : %s \n record %ld of %d",
                emprs.lau_lnameStatus == adFldOK ?
                emprs.m_szau_lname : "<NULL>",
                pRstEmployees->AbsolutePosition,
                    pRstEmployees->RecordCount);

            printf("\nContinue?(y/n)  :");

            do
            {
                chKey = getch();
            }while(chKey != 'y' && chKey !='n');

            //Clear the Screen for the next output
            system("cls");

            if(chKey == 'n')
                break;

            strMessage = "";
            pRstEmployees->MoveNext();
        }while(!(pRstEmployees->EndOfFile));

        // Clean up objects before exit.
        pRstEmployees->Close();

        //Release the IADORecordset Interface here
        if (picRs)
            picRs->Release();
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        PrintProviderError(pRstEmployees->GetActiveConnection());
        printf("Source : %s \n  Description : %s \n",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      AbsolutePosition2X Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void AbsolutePosition2X(void)
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstEmployees  = NULL;

    //Define Other Variables
    //Interface Pointer declared.(VC++ Extensions)
    IADORecordBinding *picRs = NULL;
    CEmployeeRs emprs;                  //C++ class object
    _bstr_t strMessage;
    char chKey;

    //Open a recordset using a Client Cursor
    //For the Employee Table

    _bstr_t strCnn("Provider=sqloledb;Data Source=dhale1;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        //Open a recordset.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        //Use client cursor to enable AbsolutePosition property.
        pRstEmployees->CursorLocation = adUseClient;

        //You have to explicitly pass the default Cursor type
        //and LockType to the Recordset.
        TESTHR(pRstEmployees->Open("employee",
          strCnn,adOpenStatic,adLockReadOnly,adCmdTable));

        // Open an IADORecordBinding interface pointer which we'll use
        // for Binding Recordset to a class.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&emprs));

        long lGoToPos = 21;

        pRstEmployees->AbsolutePosition = (PositionEnum)lGoToPos;

        //Display Current Record Information
        printf("Employee : %s \n record %ld of %d",
            emprs.lau_lnameStatus == adFldOK ? emprs.m_szau_lname :
            "<NULL>", pRstEmployees->AbsolutePosition,
            pRstEmployees->RecordCount);

        printf("\nPress any key to continue:");
        getch();

        // Clean up objects before exit.
        pRstEmployees->Close();

        //Release the IADORecordset Interface here
        if (picRs)
            picRs->Release();
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                printf("Error:\n");
                printf("Code = %08lx\n", e.Error());
                printf("Message = %s\n", e.ErrorMessage());
                printf("Source = %s\n", (LPCSTR) e.Source());
                printf("Description = %s\n", (LPCSTR) e.Description());
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;
    long      nCount  = 0;
    long      i     = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s",
                pErr->Number,(LPCSTR) pErr->Description);
        }
    }
}

AbsolutePositionX.h:

#include <ole2.h>
#include <stdio.h>
#include "icrsint.h"

//This Class extracts lastname.

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

   //Column lname is the 4th field in the recordset
   ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_szau_lname,
         sizeof(m_szau_lname), lau_lnameStatus, TRUE)

END_ADO_BINDING()

public:
   CHAR   m_szau_lname[41];
   ULONG  lau_lnameStatus;
};


ActiveCommand プロパティ の例 (VC++)

この例では、ActiveCommand プロパティの機能を示します。

サブルーチンに Recordset オブジェクトを渡し、その Recordset オブジェクトの ActiveCommand プロパティを使って、その Recordset を作成したコマンド テキストとパラメータを表示します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "ActiveCommandX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ActiveCommandX(void);
void ActiveCommandXprint(_RecordsetPtr    pRst);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//        Main Function                                 //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ActiveCommandX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//            ActiveCommandX Function                   //
//                                                      //
//////////////////////////////////////////////////////////

void ActiveCommandX(void)
{
    HRESULT    hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection      = NULL;
    _CommandPtr    pCmd      = NULL;
    _RecordsetPtr  pRstAuthors    = NULL;

    //Definitions of other variables
    _bstr_t  strCnn("Provider=SQLOLEDB;Data Source=srv;”
                 “Initial Catalog=Pubs;User Id=sa;Password=;");
    _bstr_t  strName;
    CHAR strcharName[50];

    try
    {
        // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));
        TESTHR(pCmd.CreateInstance(__uuidof(Command)));

        printf("ActiveCommandX Example\n\n");
        printf("Enter an author's name (e.g., Ringer): ");
        gets(strcharName);
        char *tempStr = strtok(strcharName, " \t");
        strName = tempStr;

        pCmd->CommandText = "SELECT * FROM authors WHERE au_lname = ?";
        pCmd->Parameters->Append(pCmd->CreateParameter("LastName",
            adChar, adParamInput, 20, strName));

        pConnection->Open (strCnn, "", "", NULL);

        pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection));

        pRstAuthors = pCmd->Execute(NULL,NULL,adCmdText);

        ActiveCommandXprint(pRstAuthors);

        // Clean up objects before exit.
        pRstAuthors->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Recordset.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//              ActiveCommandXprint Function            //
//                                                      //
//////////////////////////////////////////////////////////

void ActiveCommandXprint(_RecordsetPtr    pRst = NULL)
{
    // Varible declaraion & initialization
    IADORecordBinding   *picRs  = NULL;  //Interface Pointer declared.
    CAuthorsRs autrs;                    //C++ class object
    HRESULT hr;
    bstr_t strName;

    //Open an IADORecordBinding interface pointer which
    //we'll use for Binding Recordset to a class.
    TESTHR(pRst->QueryInterface(
        __uuidof(IADORecordBinding),(LPVOID*)&picRs));

    //Bind the Recordset to a C++ Class here.
    TESTHR(picRs->BindToRecordset(&autrs));

    strName = ((_CommandPtr)pRst->GetActiveCommand())->
                  GetParameters()->GetItem("LastName")->Value;

    printf("Command text = '%s'\n",
        (LPCSTR)((_CommandPtr)pRst->GetActiveCommand())->CommandText);

    printf("Parameter = '%s'\n", (LPCSTR)strName);

    if (pRst->BOF)
        printf("Name = '%s'not found.", (LPCSTR)strName);
    else
    {
        printf ("Name = '%s  %s' author ID = '%s'",
          autrs.lau_fnameStatus == adFldOK ? autrs.m_au_fname : "<NULL>",
          autrs.lau_lnameStatus == adFldOK ? autrs.m_au_lname : "<NULL>",
          autrs.lau_idStatus == adFldOK ? autrs.m_au_id : "<NULL>");
    }

    //Release IADORecordset Interface
    if (picRs)
        picRs->Release();
}

//////////////////////////////////////////////////////////
//                                                      //
//        PrintProviderError Function                   //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;
    long      nCount  = 0;
    long      i     = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n",
                pErr->Number, (LPCSTR)pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//       PrintComError Function                         //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("\nError\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

ActiveCommandX.h

#include "icrsint.h"

// This Class extracts id, fname, lname from authors table.

class CAuthorsRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CAuthorsRs)

    // Column au_id is the 1st field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_au_id,
         sizeof(m_au_id), lau_idStatus, TRUE)

    // Column au_fname is the 2nd field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_au_fname,
         sizeof(m_au_fname), lau_fnameStatus, TRUE)

    // Column au_lname is the 3rd field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_au_lname,
         sizeof(m_au_lname), lau_lnameStatus, TRUE)

END_ADO_BINDING()

public:

    char     m_au_id[21];
    ULONG    lau_idStatus;
    char     m_au_fname[41];
    ULONG    lau_fnameStatus;
    char     m_au_lname[41];
    ULONG    lau_lnameStatus;
};


ActiveConnection、CommandText、CommandTimeout、CommandType、Size、Direction プロパティの例 (VC++)

この例では、ActiveConnection、CommandText、CommandTimeout、CommandType、Size、および Direction の各プロパティを使って、ストアド プロシージャを実行します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include "conio.h"
#include "ActiveConnectionX.h"

//Function declaration
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ActiveConnectionX(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ActiveConnectionX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      ActiveConnectionX Function                       //
//                                                       //
///////////////////////////////////////////////////////////

void ActiveConnectionX(void)
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection    = NULL;
    _CommandPtr     pCmdByRoyalty  = NULL;
    _RecordsetPtr   pRstByRoyalty  = NULL;
    _RecordsetPtr   pRstAuthors    = NULL;
    _ParameterPtr   pPrmByRoyalty  = NULL;

    // Define other variables
    IADORecordBinding   *picRs = NULL; // Declare interface pointer.
    CEmployeeRs emprs;                 // C++ class object
    int intRoyalty;
    VARIANT vtroyal;
    _bstr_t strAuthorId;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

try
    {
    //Define a command object for a stored procedure.

    TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
    hr = pConnection->Open(strCnn,"","",NULL);

    TESTHR(pCmdByRoyalty.CreateInstance(__uuidof(Command)));

    pCmdByRoyalty->ActiveConnection = pConnection;
    pCmdByRoyalty->CommandText = "byRoyalty";
    pCmdByRoyalty->CommandType = adCmdStoredProc;
    pCmdByRoyalty->CommandTimeout = 15;

    //Define stored procedure's input parameter.
    printf("Enter Royalty :  ");
    scanf("%d",&intRoyalty);

    //Assign Integer value
    vtroyal.vt = VT_I2;
    vtroyal.iVal  = intRoyalty;

    TESTHR(pPrmByRoyalty.CreateInstance(__uuidof(Parameter)));
    pPrmByRoyalty->Type = adInteger;
    pPrmByRoyalty->Size = 3;
    pPrmByRoyalty->Direction = adParamInput;
    pPrmByRoyalty->Value = vtroyal;
    pCmdByRoyalty->Parameters->Append(pPrmByRoyalty);

    //Create a recordset by executing a command.
    pRstByRoyalty = pCmdByRoyalty->Execute(NULL,NULL,adCmdStoredProc);

    //Open the authors table to get author names for display.

    TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));
    hr = pRstAuthors->Open("authors",
        strCnn,adOpenForwardOnly,adLockReadOnly,adCmdTable);

    //Open an IADORecordBinding interface pointer which we'll
    //use for Binding Recordset to a class
    TESTHR(pRstAuthors->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

    //Bind the Recordset to a C++ Class here
    TESTHR(picRs->BindToRecordset(&emprs));

    //Print current data in the recordset ,adding author names
    //from author table.
    printf("Authors With %d Percent Royalty",intRoyalty);

    while(!(pRstByRoyalty->EndOfFile))
    {
        strAuthorId = pRstByRoyalty->Fields->Item["au_id"]->Value;
        pRstAuthors->Filter = "au_id = '"+strAuthorId+"'";
        printf("\n\t%s, %s %s",
           emprs.lau_idStatus == adFldOK ? emprs.m_szau_id : "<NULL>",
           emprs.lau_fnameStatus == adFldOK ? emprs.m_szau_fname :
           "<NULL>",
           emprs.lau_lnameStatus == adFldOK ? emprs.m_szau_lname :
           "<NULL>");
        pRstByRoyalty->MoveNext();
    }

    // Clean up objects before exit
    pRstByRoyalty->Close();
    pRstAuthors->Close();

    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();
        pConnection->Close();
    }

catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        PrintProviderError(pConnection);
        printf("Source : %s \n Description : %s\n"
            ,(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;
    long      nCount  = 0;
    long      i     = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s", pErr->Number,
                (LPCSTR)pErr->Description);
        }
    }
}

ActiveConnectionX.h:

#include "icrsint.h"

//This Class extracts fname,lastname

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    //Column au_id is the 1st field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szau_id,
         sizeof(m_szau_id), lau_idStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_lname,
         sizeof(m_szau_lname), lau_lnameStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_fname,
         sizeof(m_szau_fname), lau_fnameStatus, TRUE)

END_ADO_BINDING()

public:

    CHAR m_szau_id[20];
    ULONG lau_idStatus;

    CHAR m_szau_fname[40];
    ULONG lau_fnameStatus;

    CHAR   m_szau_lname[40];
    ULONG  lau_lnameStatus;
};


ActualSize、DefinedSize プロパティの例 (VC++)

この例では、ActualSize プロパティおよび DefinedSize プロパティを使って、定義されているフィールド サイズと実際のフィールド サイズを表示します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ActualSizeX(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ActualSizeX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      ActualSizeX Function                             //
//                                                       //
///////////////////////////////////////////////////////////
void    ActualSizeX(void)
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstStores = NULL;

    //Define Other variables
    _bstr_t strMessage;
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        //Open a recordset for the stores table.
        TESTHR(pRstStores.CreateInstance(__uuidof(Recordset)));

        //You have to explicitly pass the Cursor type and LockType
        //to the Recordset here.
        hr = pRstStores->Open("stores",
                strCnn,adOpenForwardOnly,adLockReadOnly,adCmdTable);

        //Loop through the recordset displaying the contents
        //of the stor_name field, the field's defined size,
        //and its actual size.

        pRstStores->MoveFirst();

        while(!(pRstStores->EndOfFile))
        {
            strMessage = "Store Name: ";
            strMessage += (_bstr_t)pRstStores->Fields->
                             Item["stor_name"]->Value + "\n";
            strMessage += "Defined Size: ";
            strMessage += (_bstr_t)pRstStores->Fields->
                             Item["stor_name"]->DefinedSize + "\n";
            strMessage += "Actual Size: ";
            strMessage += (_bstr_t) pRstStores->Fields->
                             Item["stor_name"]->ActualSize + "\n";

            printf("%s\n",(LPCSTR)strMessage);
            printf("Press any key to continue...");
            getch();
            //Clear the screen for the next display
            system("cls");
            pRstStores->MoveNext();
        }

    // Clean up objects before exit.
    pRstStores->Close();
    }

    catch(_com_error &e)
    {
        _variant_t vtConnect = pRstStores->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
        case VT_BSTR:
                printf("Error:\n");
                printf("Code = %08lx\n", e.Error());
                printf("Message = %s\n", e.ErrorMessage());
                printf("Source = %s\n", (LPCSTR) e.Source());
                printf("Description = %s\n", (LPCSTR) e.Description());
                break;
        case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
        default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;
    long      nCount    = 0;
    long      i     = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,(LPCSTR ) pErr->Description);
        }
    }
}


AddNew メソッドの例 (VC++)

この例では、AddNew メソッドを使って、ユーザーによって指定された名前で新規のレコードを作成します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include "conio.h"
#include "AddNewX.h"

//Function declaration
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AddNewX(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AddNewX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AddNewX Function                                 //
//                                                       //
///////////////////////////////////////////////////////////
void  AddNewX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    _RecordsetPtr  pRstEmployees = NULL;
    _ConnectionPtr pConnection   = NULL;

    //Define Other variables
    IADORecordBinding   *picRs = NULL;  //Interface Pointer declared.
    CEmployeeRs emprs;                  //C++ class object
    HRESULT hr = S_OK;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;”
                “Initial Catalog=Pubs;User Id=sa;Password=;");
    _bstr_t strId;
    _bstr_t strMessage;

    try
    {
        //Open a connection
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        hr = pConnection->Open(strCnn,"","",NULL);

        //Open employee table.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        //You have to explicitly pass the Cursor type and LockType
        //to the Recordset here.
        pRstEmployees->Open("employee",
            _variant_t((IDispatch *) pConnection,true),
            adOpenKeyset,adLockOptimistic,adCmdTable);

        //Open an IADORecordBinding interface pointer which we'll use
        //for Binding Recordset to a class.
        TESTHR(pRstEmployees->QueryInterface(
                __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&emprs));

        // Get data from the user.The employee id must be formatted as
        // first,middle and last initial,five numbers,then M or F to
        // signify the gender.For example,the employee id for
        // Bill A. Sorensen would be "BAS55555M".

        printf("Enter Employee Id: ");scanf("%s",emprs.m_sz_empid);
        strId = emprs.m_sz_empid;
        printf("Enter First Name: ");scanf("%s",emprs.m_sz_fname);
        printf("Enter Last Name:");scanf("%s",emprs.m_sz_lname);

        //Proceed if the user actually entered something
        //for the id, the first and the last name.

        if(strcmp(emprs.m_sz_empid,"") &&
           strcmp(emprs.m_sz_fname,"") &&
           strcmp(emprs.m_sz_lname,""))
        {
            //This adds a new record to the table
            //if (FAILED(hr = picRs->AddNew(&emprs)))
            //_com_issue_error(hr);
            TESTHR(picRs->AddNew(&emprs));

            //Show the newly added data
            printf("New Record: %s  %s  %s \n",
                emprs.lemp_empidStatus == adFldOK ?
                emprs.m_sz_empid : "<NULL>",
                emprs.lemp_fnameStatus == adFldOK ?
                emprs.m_sz_fname : "<NULL>",
                emprs.lemp_lnameStatus == adFldOK ?
                emprs.m_sz_lname : "<NULL>");
        }
        else
            printf("Please enter an employee id, first name “
                “and last name.\n");

        //Delete the new record because this is a demonstration.
        pConnection->Execute("DELETE FROM EMPLOYEE WHERE emp_id ="
            "'" + strId + "'",NULL,adCmdText);

        //Release the IADORecordset Interface here
        if (picRs)
            picRs->Release();

        // Clean up objects before exit.
        pRstEmployees->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                printf("Error:\n");
                printf("Code = %08lx\n", e.Error());
                printf("Message = %s\n", e.ErrorMessage());
                printf("Source = %s\n", (LPCSTR) e.Source());
                printf("Description = %s\n", (LPCSTR) e.Description());
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr = NULL;
    long      nCount = 0;
    long      i = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\n\t Error number: %x\t%s",
                pErr->Number, (LPCSTR)pErr->Description);
        }
    }
}

AddNewX.h:

#include "icrsint.h"

//This Class extracts empid, fname and lastname

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    //Column empid is the 1st field in the recordset

    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_sz_empid,
         sizeof(m_sz_empid), lemp_empidStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sz_fname,
         sizeof(m_sz_fname), lemp_fnameStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_sz_lname,
         sizeof(m_sz_lname), lemp_lnameStatus, TRUE)

END_ADO_BINDING()

public:

   CHAR  m_sz_empid[10];
   ULONG lemp_empidStatus;
   CHAR   m_sz_fname[40];
   ULONG  lemp_fnameStatus;
   CHAR   m_sz_lname[41];
   ULONG  lemp_lnameStatus;
};


Append、CreateParameter メソッドの例 (VC++)

この例では、Append メソッドおよび CreateParameter メソッドを使って、入力パラメータでストアド プロシージャを実行します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include "conio.h"
#include "AppendX.h"

//Function declaration
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AppendX(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AppendX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AppendX Function                                 //
//                                                       //
///////////////////////////////////////////////////////////
void  AppendX(void)
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstByRoyalty = NULL;
    _RecordsetPtr pRstAuthors = NULL;
    _CommandPtr   pcmdByRoyalty = NULL;
    _ParameterPtr pprmByRoyalty = NULL;
    _ConnectionPtr pConnection = NULL;

    //Define Other variables
    IADORecordBinding   *picRs = NULL;  //Interface Pointer declared.
    CEmployeeRs emprs;                 //C++ class object

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    _bstr_t strMessage, strAuthorID;
    int intRoyalty;
    VARIANT vtRoyalty;

    try
    {
        //Open a Connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        hr = pConnection->Open(strCnn,"","",NULL);
        pConnection->CursorLocation = adUseClient;

        //Open Command Object with one Parameter
        TESTHR(pcmdByRoyalty.CreateInstance(__uuidof(Command)));
        pcmdByRoyalty->CommandText = "byroyalty";
        pcmdByRoyalty->CommandType = adCmdStoredProc;

        //Get parameter value and append parameter
        printf("Enter Royalty: ");
        scanf("%d",&intRoyalty);

        //Define Integer/variant.
        vtRoyalty.vt = VT_I2;
        vtRoyalty.iVal = intRoyalty;
        pprmByRoyalty = pcmdByRoyalty->CreateParameter(
            "percentage",adInteger,adParamInput,sizeof(int),vtRoyalty);
        pcmdByRoyalty->Parameters->Append(pprmByRoyalty);
        pprmByRoyalty->Value  = vtRoyalty;

        //Create Recordset by executing the command
        pcmdByRoyalty->ActiveConnection = pConnection;
        pRstByRoyalty = pcmdByRoyalty->Execute(
            NULL,NULL,adCmdStoredProc);

        //Open the authors table to get author names for display
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        //You have to explicitly pass the default Cursor type and
        //LockType to the Recordset here.
        hr = pRstAuthors->Open(
            "authors",_variant_t((IDispatch*)pConnection,true),
            adOpenForwardOnly,adLockReadOnly,adCmdTable);

        //Open an IADORecordBinding interface pointer which we'll
        //use for Binding Recordset to a class.
        TESTHR(pRstAuthors->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&emprs));

        //Print current data in the recordset, adding
        //author names from author table.
        printf("Authors with %d percent royalty ",intRoyalty);

        while(!(pRstByRoyalty->EndOfFile))
        {
            strAuthorID = pRstByRoyalty->Fields->Item["au_id"]->Value;
            pRstAuthors->Filter = "au_id = '"+strAuthorID+"'";

            printf("\n"  "%s, %s  %s",
                emprs.lau_idStatus == adFldOK ?
                emprs.m_szau_id : "<NULL>",
                emprs.lau_fnameStatus == adFldOK ?
                emprs.m_szau_fname : "<NULL>",
                emprs.lau_lnameStatus == adFldOK ?
                emprs.m_szau_lname : "<NULL>");
            pRstByRoyalty->MoveNext();
        }

        //Release the IADORecordset Interface here
        if (picRs)
            picRs->Release();

        pRstByRoyalty->Close();
        pRstAuthors->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        PrintProviderError(pConnection);

        printf("\n Source : %s \n Description : %s \n",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;
    long      nCount  = 0;
    long      i     = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\n Error Description: %s\n",
                pErr->Number,(LPCSTR) pErr->Description);
        }
    }
}

AppendX.h:

#include "icrsint.h"

//This Class extracts only author id,fname,lastname

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    //Column au_id is the 1st field in the recordset

    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szau_id,
         sizeof(m_szau_id), lau_idStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_lname,
         sizeof(m_szau_lname), lau_lnameStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_fname,
         sizeof(m_szau_fname), lau_fnameStatus, TRUE)

END_ADO_BINDING()

public:

    CHAR m_szau_id[20];
    ULONG lau_idStatus;

    CHAR m_szau_fname[40];
    ULONG lau_fnameStatus;

    CHAR   m_szau_lname[40];
    ULONG  lau_lnameStatus;
};


AppendChunk、GetChunk メソッドの例 (VC++)

この例では、AppendChunk メソッドおよび GetChunk メソッドを使って、別のレコードのデータを画像フィールドに格納します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#define ChunkSize    100

#include <ole2.h>
#include <stdio.h>
#include "conio.h"
#include "malloc.h"
#include "AppendChunkX.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AppendChunkX(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AppendChunkX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AppendChunkX Function                            //
//                                                       //
///////////////////////////////////////////////////////////
void  AppendChunkX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstPubInfo = NULL;
    _ConnectionPtr pConnection = NULL;

    //Define other variables
    //Interface Pointer declared.(VC++ Extensions)
    IADORecordBinding   *picRs = NULL;
    CPubInfoRs pubrs;          //C++ class object

    HRESULT hr = S_OK;
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    _bstr_t strMessage,strPubID,strPRInfo;
    _variant_t varChunk;
    long lngOffSet,lngLogoSize;
    char pubId[50];
    lngOffSet = 0;

    UCHAR chData;
    CHAR ch;
    SAFEARRAY FAR *psa;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = ChunkSize;

    try
    {
        //Open a Connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        TESTHR(pConnection->Open(strCnn,"","",NULL));

        TESTHR(hr= pRstPubInfo.CreateInstance(__uuidof(Recordset)));

        pRstPubInfo->CursorType = adOpenKeyset;
        pRstPubInfo->LockType = adLockOptimistic;

        TESTHR(pRstPubInfo->Open("pub_info",
            _variant_t((IDispatch*)pConnection,true),
            adOpenKeyset,adLockOptimistic,adCmdTable));

        //Open an IADORecordBinding interface pointer which we'll use
        //for Binding Recordset to a class
        TESTHR(pRstPubInfo->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&pubrs));

        //Display the available logos here
        strMessage = "Available logos are: " + (_bstr_t)"\n\n";
        printf(strMessage);
        int Counter = 0;
        while(!(pRstPubInfo->EndOfFile))
        {
            printf("\n%s",pubrs.m_sz_pubid);
            printf("\n%s",strtok(pubrs.m_sz_prinfo,","));

            //Display 5 records at a time and wait for user to continue.
            if (++Counter >= 5)
            {
                Counter = 0;
                printf("\nPress any key to continue...");
                getch();
            }
            pRstPubInfo->MoveNext();
        }

        //Prompt For a Logo to Copy
        printf("\nEnter the ID of a logo to copy: ");
        scanf("%s",pubId);
        strPubID = pubId;

        //Copy the logo to a variable in chunks
        pRstPubInfo->Filter = "pub_id = '"  + strPubID + "'";
        lngLogoSize = pRstPubInfo->Fields->Item["logo"]->ActualSize;

        //Create a safe array to store the array of BYTES
        rgsabound[0].cElements = lngLogoSize;
        psa = SafeArrayCreate(VT_UI1,1,rgsabound);

        long index1 = 0;
        while(lngOffSet < lngLogoSize)
        {
            varChunk = pRstPubInfo->Fields->
                        Item["logo"]->GetChunk(ChunkSize);

            //Copy the data only up to the Actual Size of Field.
            for(long index=0;index<=(ChunkSize-1);index++)
            {
                hr= SafeArrayGetElement(varChunk.parray,&index,&chData);
                if(SUCCEEDED(hr))
                {
                    //Take BYTE by BYTE and advance Memory Location
                    TESTHR(SafeArrayPutElement(psa,&index1,&chData));
                    index1++;
                }
                else
                    break;
            }
            lngOffSet = lngOffSet + ChunkSize;
        }
        lngOffSet = 0;

        printf("Enter a new Pub Id: ");
        scanf("%s",pubrs.m_sz_pubid);
        strPubID = pubrs.m_sz_pubid;

        printf("Enter descriptive text: " );
        scanf("%c",&ch);
        gets(pubrs.m_sz_prinfo);

        // Temporarily add new publisher to table to avoid error due
        // to foreign key constraint.
        pConnection->Execute("INSERT publishers(pub_id) VALUES('" +
            strPubID + "')",NULL,adCmdText);

        pRstPubInfo->AddNew();
        pRstPubInfo->Fields->GetItem("pub_id")->PutValue(strPubID);
        pRstPubInfo->Fields->GetItem("pr_info")->
            PutValue(pubrs.m_sz_prinfo);

        //Assign the Safe array  to a variant.
        varChunk.vt = VT_ARRAY|VT_UI1;
        varChunk.parray = psa;
        hr = pRstPubInfo->Fields->GetItem("logo")->
                AppendChunk(varChunk);

        //Update the table
        pRstPubInfo->Update();

        lngLogoSize = pRstPubInfo->Fields->Item["logo"]->ActualSize;

        //Show the newly added record.
        printf("New Record : %s\nDescription : %s\nLogo Size : %s\n",
            pubrs.m_sz_pubid,
            pubrs.m_sz_prinfo,(LPCSTR)(_bstr_t)pRstPubInfo->Fields->
            Item["logo"]->ActualSize);

        //Delete new records because this is demonstration.
        pConnection->Execute("DELETE FROM PUB_INFO WHERE pub_id = '"
                        + strPubID +"'",NULL,adCmdText);

        pConnection->Execute("DELETE FROM publishers WHERE pub_id = '"
                        + strPubID +"'",NULL,adCmdText);

        pRstPubInfo->Close();
        pConnection->Close();
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        PrintProviderError(pConnection);
        printf("Source : %s \n Description : %s\n",
                (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr   = NULL;
    long      nCount = 0;
    long      i      = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

AppendChunkX.h:

#include "icrsint.h"

//This Class extracts pubid,prinfo.

class CPubInfoRs : public CADORecordBinding
{
    BEGIN_ADO_BINDING(CPubInfoRs)

    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_sz_pubid,
         sizeof(m_sz_pubid), l_pubid, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_sz_prinfo,
         sizeof(m_sz_prinfo), l_prinfo, TRUE)

    END_ADO_BINDING()

public:
    CHAR   m_sz_pubid[10];
    ULONG  l_pubid;
    CHAR   m_sz_prinfo[200];
    ULONG l_prinfo;

};


Attributes、Name プロパティの例 (VC++)

この例では、Connection、Field、および Property オブジェクトの Attributes プロパティの値を表示します。ここでは、Name プロパティを使って、Field オブジェクトと Property オブジェクトの名前を表示します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AttributesX();
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AttributesX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AttributesX Function                             //
//                                                       //
///////////////////////////////////////////////////////////

void AttributesX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _RecordsetPtr    pRstEmployee  = NULL;
    _ConnectionPtr pConnection = NULL;
    FieldsPtr  fldLoop = NULL;
    PropertiesPtr proLoop = NULL;

    //Define Other Variables
    HRESULT  hr = S_OK;
    _variant_t Index;
    Index.vt = VT_I2;
    int j=0;
    //Open a recordset using a Client Cursor
    //For the Employee Table
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // open connection and record set
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open(strCnn,"","",NULL);

        TESTHR(pRstEmployee.CreateInstance(__uuidof(Recordset)));
        pRstEmployee->Open("Employee",
            _variant_t((IDispatch *)pConnection,true), adOpenForwardOnly,
            adLockReadOnly, adCmdTable);

        // Display the attributes of the Connection.
        printf("Connection attributes: %d \n", pConnection->Attributes);

        // Display the attributes of the employee table's fields
        printf("\nFields attributes:\n");
        fldLoop = pRstEmployee->GetFields();

        for (int i = 0; i < (int)fldLoop->GetCount(); i++)
        {
            Index.iVal=i;
            printf ("   %s = %d \n",
                (LPSTR)fldLoop->GetItem(Index)->GetName(),
                (int)fldLoop->GetItem(Index)->GetAttributes());
        }

        // Display Fields of the Employee table which are NULLBALE
        printf("\nNULLABLE Fields :");

        for (int i1 = 0; i1 < (int)fldLoop->GetCount(); i1++)
        {
            Index.iVal = i1;

            if (fldLoop->GetItem(Index)->GetAttributes() &
                    adFldIsNullable)
                {
                    printf ("%s  \n",(LPSTR)fldLoop->GetItem(Index)->
                                GetName());
                }
        }

        // Display the attributes of the Employee tables's
        // properties
        printf("\nProperty attributes:\n");
        proLoop = pRstEmployee->GetProperties();

        for (int i2 = 0; i2 < (int)proLoop->GetCount(); i2++)
        {
            j= j+1;
            Index.iVal=i2;
            printf (" %s = %d \n",
                (LPSTR)(_bstr_t)proLoop->GetItem(Index)->GetName(),
                (int)proLoop->GetItem(Index)->GetAttributes());

            if (((j % 23) == 0) || ( i2==6))
            {
                printf("\nPress any key to continue...");
                getch();

                //Clear the screen for the next display
                system("cls");
                j=0;
            }
        }
        // Clean up objects before exit.
        pRstEmployee->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.

        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.

    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;
    long      nCount  = 0;
    long      i    = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", (LPCSTR) pErr->Number,
                    (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("\nError\n");
    printf("Code = %08lx\n", e.Error());
    printf("Code meaning = %s\n", e.ErrorMessage());
    printf("Source = %s\n", (LPCSTR) bstrSource);
    printf("Description = %s\n", (LPCSTR) bstrDescription);
}


BeginTrans、CommitTrans、RollbackTrans メソッドの例 (VC++)

この例では、データベースの Titles テーブル内のすべての心理学書の書籍種別を変更します。BeginTrans メソッドで、Titles テーブルへのすべての変更を独立させるトランザクションを開始した後、CommitTrans メソッドで、変更を保存します。RollbackTrans メソッドを使うと、Update メソッドで保存した変更を変更前の状態に戻せます。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include <assert.h>
#include <malloc.h>
#include "BeginTransX.h"

inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void BeginTransX(void);
void PrintProviderError(_ConnectionPtr pConnection);

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    BeginTransX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      BeginTransX Function                             //
//                                                       //
///////////////////////////////////////////////////////////

void BeginTransX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr rstTitles = NULL;
    _ConnectionPtr pConnection = NULL;

    //Define Other Variables
    HRESULT hr = S_OK;
    IADORecordBinding   *picRs = NULL;  //Interface Pointer declared...
    CTitlesRs titlrs;
    _bstr_t strTitle;
    _bstr_t strMessage;
    LPSTR p_TempStr = NULL;
    char chKey;
    int i = 0;

    try
    {
        // open connection.
        _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        TESTHR(pConnection->Open(strCnn,"","",NULL));

        rstTitles.CreateInstance(__uuidof(Recordset));

        rstTitles->CursorType = adOpenDynamic;
        rstTitles->LockType = adLockPessimistic;

        // open Titles table
        TESTHR(rstTitles->Open("Titles",
            _variant_t((IDispatch*)pConnection,true),
            adOpenDynamic, adLockPessimistic,adCmdTable));

        rstTitles->MoveFirst();
        pConnection->BeginTrans();

        //Open an IADORecordBinding interface pointer which
        //we'll use for Binding Recordset to a class
        TESTHR(rstTitles->QueryInterface(
            __uuidof(IADORecordBinding), (LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&titlrs));

        // Loop through recordset and ask user if he wants
        // to change the type for a specified title.
          // Allocate memory to p_TempStr string pointer.
        p_TempStr = (LPSTR) malloc(sizeof(titlrs.m_szT_type));

        // Check for null string.
        assert(p_TempStr != NULL);
        while (VARIANT_FALSE == rstTitles->EndOfFile)
        {
            // Remove blank string
            strcpy(p_TempStr,strtok(titlrs.m_szT_type," "));

            // Compare type with psychology
            if (!strcmp(p_TempStr,"psychology"))
            {
                strTitle = titlrs.m_szT_title;
                strMessage = "Title: " + strTitle +
                        "\n Change type to Self help?(y/n)";

                // Change the title for specified Employee
                printf("%s\n",(LPCSTR)strMessage);
                do
                {
                    chKey = getch();
                }while(chKey != 'y' && chKey !='n');
                if(chKey == 'y')
                {
                    // Copy "self_help" title field
                    strcpy(titlrs.m_szT_type,"self_help");
                    picRs->Update(&titlrs);
                }
            }
            rstTitles->MoveNext();
        }
        // Ask if the User wants to commit to all the
        //Changes made above
        printf("\n\n Save all changes(y/n)?");
        do
        {
            chKey = getch();
        }while(chKey != 'y' && chKey !='n');

        if(chKey == 'y')

            // Save the changes to the title table
            pConnection->CommitTrans();
        else
            // Unsave the changes to the title table
            pConnection->RollbackTrans();

        // Print current data in recordset.
        rstTitles->Requery(0);

        // Move to the first record of the title table
        rstTitles->MoveFirst();
        printf("\n\nPress any key to continue...");
        getch();

        // Clear the screen for the next display
        system("cls");

        // Open IADORecordBinding interface pointer again
        // for binding Recordset to a class.
        TESTHR(rstTitles->QueryInterface(
            __uuidof(IADORecordBinding),
            (LPVOID*)&picRs));

        // Rebind the Recordset to a C++ Class.
        TESTHR(picRs->BindToRecordset(&titlrs));

        while (!rstTitles->EndOfFile)
        {
            i= i+1;
            if (i % 23 == 0)
            {
                printf("\nPress any key to continue...");
                getch();

                //Clear the screen for the next display
                system("cls");
            }
            printf("%s -  %s\n",titlrs.m_szT_title,titlrs.m_szT_type);
            rstTitles->MoveNext();
        }
        // Restore original data because this is a demonstration.
        rstTitles->MoveFirst();

        while (VARIANT_FALSE == rstTitles->EndOfFile)
        {
            strcpy(p_TempStr,titlrs.m_szT_type);
            p_TempStr = strtok(p_TempStr," ");

            if (!strcmp(p_TempStr,"self_help"))
            {
                strcpy(titlrs.m_szT_type,"psychology");
                picRs->Update(&titlrs);
            }
            rstTitles->MoveNext();
        }
        // Deallocate the memory
            free(p_TempStr);

        // Clean up objects before exit.
        rstTitles->Close();
        pConnection->Close();

        //Release IADORecordset Interface
        if (picRs)
            picRs->Release();
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        PrintProviderError(pConnection);

        printf("Source : %s\n",(LPCSTR)bstrSource);
        printf("Description : %s\n",(LPCSTR)bstrDescription);
    }
};

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr    = NULL;
    long      nCount  = 0;
    long      i       = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,(LPCSTR) pErr->Description);
        }
    }
}

BeginTransX.h:

#include "icrsint.h"

//This Class extracts only title and type
class CTitlesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitlesRs)

    //Column title is the 2nd field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szT_title,
         sizeof(m_szT_title), lT_titleStatus, FALSE)

    //Column type is the 3rd field in the recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szT_type,
         sizeof(m_szT_type), lT_typeStatus, TRUE)

END_ADO_BINDING()

public:

   CHAR   m_szT_title[150];
   ULONG  lT_titleStatus;
   CHAR   m_szT_type[40];
   ULONG  lT_typeStatus;
};


BOF、EOF、Bookmark プロパティの例 (VC++)

この例の最初の関数では、BOF および EOF プロパティを使って、ユーザーが Recordset の先頭または最後のレコードを越えて移動しようとしたときに、メッセージが表示されるようにします。また、ユーザーが Recordset 内のレコードにフラグを付けるときのために、Bookmark プロパティを使って、後でそのレコードに戻れるようにします。

2 番目の関数では、Bookmark プロパティを使って Recordset のほかのすべてのレコードの Bookmark を配列に格納し、次に配列を使ってそのレコードセットをフィルタします。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "BofEofBookmark.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void BOFX(void);
void BookmarkX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      BOFX Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    BOFX();

    //Clear the screen for the next display
    system("cls");

    BookmarkX();

    printf("Press any key to continue...");
    getch();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      BOFX Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void BOFX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _RecordsetPtr rstPublishers = NULL;

    //Define Other Variables
    HRESULT hr = S_OK;
    IADORecordBinding  *picRs = NULL;    //Interface Pointer declared.
    CPublishers Publs;

    bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");
    _bstr_t strMessage;
    _variant_t VarBookmark;
    int intCommand = 0;
    _variant_t TempPublisher;

    try
    {
        // Open recordset with data from Publishers table.
        TESTHR(rstPublishers.CreateInstance(__uuidof(Recordset)));
        rstPublishers->CursorType = adOpenStatic;

        // Use client cursor to enable AbsolutePosition property.
        rstPublishers->CursorLocation = adUseClient;
        rstPublishers->Open("select pub_id, pub_name from publishers"
            " order by pub_name", strCnn, adOpenStatic,
            adLockBatchOptimistic, adCmdText);

        //Open an IADORecordBinding interface pointer
        //which will be used for Binding Recordset to a class
        TESTHR(rstPublishers->QueryInterface(
            __uuidof(IADORecordBinding), (LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&Publs));

        rstPublishers->MoveFirst();

         while (true)    // Continuous loop.
        {
            // Display information about the current record
            // and get user input
            printf("Publisher:%s \n Record %d of %d\n\n",
                Publs.lP_pubnameStatus  == adFldOK ?
                Publs.m_szP_pubname : "<NULL>",
                rstPublishers->AbsolutePosition,
                rstPublishers->RecordCount);
            printf("Enter command:\n ");
            printf("[1 - next          /  2 - previous       /\n");
            printf(" 3 - set bookmark  /  4 - go to bookmark /\n");
            printf(" 5 - quit                                ]\n");

            scanf("%d", &intCommand);
            if ((intCommand < 1) || (intCommand > 4))
                break;    // Out of range entry exits program loop.

            switch(intCommand)
            {
                // Move forward or backward, trapping for BOF or EOF
                case 1:
                    rstPublishers->MoveNext();
                    if (rstPublishers->EndOfFile)
                    {
                        printf("\nCannot move past the last record."
                               " Try again...\n");
                        rstPublishers->MoveLast();
                    }
                    break;

                case 2:
                    rstPublishers->MovePrevious();
                    if (rstPublishers->BOF)
                    {
                        printf("\nCannot move before the first record."
                               " Try again...\n");
                        rstPublishers->MoveFirst();
                    }
                    break;

                // store the bookmark of the current record.
                case 3:
                    VarBookmark = rstPublishers->Bookmark;
                    // Go to the record indicated by the
                    // stored bookmark
                    break;

                case 4:
                    // Check for whether bookmark set for a record
                    if (VarBookmark.vt == VT_EMPTY)
                        printf("No Bookmark set!\n");
                    else
                        rstPublishers->Bookmark = VarBookmark;
                    break;

                default:
                    break;
            }
        }
        // Clean up objects before exit.
        rstPublishers->Close();

        //Release the IADORecordset Interface here
        if (picRs)
            picRs->Release();
    }

    catch (_com_error &e)
    {
        printf("Error in BOFx...\n");
        // Notify the user of errors if any.
        _variant_t vtConnect = rstPublishers->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                printf("Error:\n");
                printf("Code = %08lx\n", e.Error());
                printf("Message = %s\n", e.ErrorMessage());
                printf("Source = %s\n", (LPCSTR) e.Source());
                printf("Description = %s\n", (LPCSTR) e.Description());
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
        printf("Press any key to continue...");
        getch();
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      BookmarkX Function                               //
//                                                       //
///////////////////////////////////////////////////////////

void BookmarkX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr rstAuthors = NULL;

    //Define Other Variables
    IADORecordBinding *picRs = NULL; //Interface Pointer declared.
    CAuthors Authrs;
    HRESULT  hr = S_OK;
    _bstr_t  strCnn("Provider=sqloledb;Data Source=srv;"
              "Initial Catalog=Pubs;User Id=sa;Password=;");
    _variant_t vBookmark;

    // Variable declaration for safe arrays.
    SAFEARRAY FAR* psa;

    // define ARRAY/ VARIANT variant.
    vBookmark.vt = VT_ARRAY|VT_VARIANT;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = 11;
    long ii = 0;

    try
    {
        rstAuthors.CreateInstance(__uuidof(Recordset));
        // Set The Cursor Location
        rstAuthors->CursorLocation  = adUseClient;
        rstAuthors->PutActiveConnection((_variant_t)strCnn);

        // Open Authors table
        TESTHR(rstAuthors->Open("select * from Authors",strCnn,
            adOpenStatic,adLockBatchOptimistic,adCmdText));

        //Open an IADORecordBinding interface pointer
        //which we'll use for binding Recordset to a class
        TESTHR(rstAuthors->QueryInterface(__uuidof(IADORecordBinding),
                (LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&Authrs));

        printf("Number of Records before filtering:  %d\n",
                rstAuthors->RecordCount);

        // Create safearrays to store array of variant
        psa = SafeArrayCreate(VT_VARIANT,1,rgsabound);

        // Store bookmark of every other record into an array.
        while ((!rstAuthors->EndOfFile) && (ii < 11))
        {
            SafeArrayPutElement(psa,&ii,&rstAuthors->Bookmark);
            //ii = ii +1;
            ii++;
            rstAuthors->Move(2);
        }

        vBookmark.parray = psa;

        // Filter the Record with the array of bookmarks.
        rstAuthors->put_Filter(vBookmark);
        printf("Number of Records after filtering:  %d\n",
            rstAuthors->RecordCount);
        rstAuthors->MoveFirst();

        while (!rstAuthors->EndOfFile)
        {
            printf("%d    %s\n",rstAuthors->AbsolutePosition,
                Authrs.lau_lnameStatus == adFldOK ?
                Authrs.m_szau_lname : "<NULL>");
            rstAuthors->MoveNext();
        }

        //Release the IADORecordset Interface.
        if (picRs)
            picRs->Release();

        // Clean up objects before exit.
        rstAuthors->Close();
    }

    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect = rstAuthors->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                printf("Error:\n");
                printf("Code    = %08lx\n", e.Error());
                printf("Message = %s\n", e.ErrorMessage());
                printf("Source  = %s\n", (LPCSTR) e.Source());
                printf("Description = %s\n", (LPCSTR) e.Description());
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr    = NULL;
    long      nCount  = 0;
    long      i       = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

BofEofBookmark.h:

#include "icrsint.h"

//This Class extracts only pubid,lastname and hire_date
class CPublishers : public CADORecordBinding
{
BEGIN_ADO_BINDING(CPublishers)

    //Column title is the 2nd field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szP_pubid,
        sizeof(m_szP_pubid), lP_pubidStatus, FALSE)

    //Column type is the 3rd field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szP_pubname,
        sizeof(m_szP_pubname), lP_pubnameStatus, TRUE)

END_ADO_BINDING()

public:
    CHAR    m_szP_pubid;
    ULONG   lP_pubidStatus;
    CHAR    m_szP_pubname[40];
    ULONG   lP_pubnameStatus;
};

//This Class extracts only authorlastname
class CAuthors : public CADORecordBinding
{
BEGIN_ADO_BINDING(CAuthors)

    //Column authorlname is the 2nd field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar,  m_szau_lname,
         sizeof(m_szau_lname), lau_lnameStatus, FALSE)

END_ADO_BINDING()

public:
    CHAR    m_szau_lname[40];
    ULONG   lau_lnameStatus;
};


CacheSize プロパティの例 (VC++)

この例では、CacheSize プロパティを使って、30 レコードのキャッシュを使用した場合と使用しない場合のパフォーマンスの違いを示します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <winbase.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CacheSizeX();
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CacheSizeX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      CacheSizeX Function                              //
//                                                       //
///////////////////////////////////////////////////////////

void CacheSizeX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
     _RecordsetPtr    pRstRoySched  = NULL;

     //Define Other Variables
    HRESULT  hr = S_OK;
    DWORD sngStart;
    DWORD sngEnd;
    float sngNoCache;
    float sngCache;
    int intLoop = 0;
    _bstr_t strTemp;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
    "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        //Open the RoySched table.
        TESTHR(pRstRoySched.CreateInstance(__uuidof(Recordset)));
        pRstRoySched->Open("roysched", strCnn, adOpenForwardOnly,
            adLockReadOnly, adCmdTable);

        // Enumerate the Recordset object twice and record
        // the elapsed time.
        sngStart = GetTickCount();

        for (intLoop = 1; intLoop < 2; intLoop++)
        {
            pRstRoySched->MoveFirst();

            while(!(pRstRoySched->EndOfFile))
            {
                    // Execute a simple operation for the
                    // performance test.
                    strTemp = pRstRoySched->Fields->
                        Item["title_id"]->Value;
                    pRstRoySched->MoveNext();
            }
        }
        sngEnd = GetTickCount();
        sngNoCache = (float)(sngEnd - sngStart)/(float)1000;

        // Cache records in groups of 30 records.
        pRstRoySched->MoveFirst();
        pRstRoySched->CacheSize = 30;

        sngStart =  GetTickCount();

        // Enumerate the Recordset object twice and record
        // the elapsed time.
        for (intLoop = 1;intLoop < 2; intLoop++)
        {
            pRstRoySched->MoveFirst();
            while(!(pRstRoySched->EndOfFile))
            {
                    // Execute a simple operation for the
                    // performance test.
                    strTemp = pRstRoySched->Fields->
                        Item["title_id"]->Value;
                    pRstRoySched->MoveNext();
            }
        }
        sngEnd =  GetTickCount();
        sngCache = (float)(sngEnd - sngStart)/(float)1000;

        // Display performance results.
        printf("Caching Performance Results:\n");
        printf("No cache: %6.3f  seconds \n", sngNoCache);
        printf("30-record cache: %6.3f  seconds \n", sngCache);

        // Clean up objects before exit.
        pRstRoySched->Close();
    }
    catch(_com_error &e)
    {
         // Notify the user of errors if any.
        _variant_t vtConnect = pRstRoySched->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
               // Pass a connection pointer accessed from the Recordset.
               PrintProviderError(vtConnect);
               break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.

    // pErr is a record object in the Connection's Error collection.
    ErrorPtr pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);

}


Cancel メソッドの例 (VC++)

この例では、Cancel メソッドを使って、接続がビジー状態の場合に、Connection オブジェクトで実行されるコマンドを中止します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x)_com_issue_error(x);};
void CancelX();
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CancelX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      CancelX Function                                 //
//                                                       //
///////////////////////////////////////////////////////////

void CancelX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
     _ConnectionPtr pConnection = NULL;

     //Define Other Variables
    HRESULT  hr = S_OK;
    _bstr_t strCmdChange;
    _bstr_t strCmdRestore;
    BOOL booChanged = FALSE;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
    "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // open a connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open(strCnn,"","",NULL);

        // Define command strings.
        strCmdChange = "UPDATE Titles SET type = 'self_help' "
        "WHERE type = 'psychology'";

        strCmdRestore = "UPDATE Titles SET type = 'psychology' "
        "WHERE type = 'self_help'";

        // Begin a transaction, then execute a command asynchronously.
        pConnection->BeginTrans();
        pConnection->Execute(strCmdChange,NULL,adAsyncExecute);

        // do something else for a little while - this could be changed
        for (int i = 1; i<=10 ;i++)
        {
            i = i + i;
            printf("%d\n", i);
        }

        // If the command has NOT completed, cancel the execute
        // and roll back the transaction. Otherwise, commit the
        // transaction.
        if ((pConnection->GetState()) && (adStateExecuting))
        {
            pConnection->Cancel();
            pConnection->RollbackTrans();
            booChanged = FALSE;
            printf("Update canceled.\n");
        }
        else
        {
            pConnection->CommitTrans();
            booChanged = TRUE;
            printf("Update complete.\n");
        }

        // If the change was made, restore the data
        // because this is a demonstration.
        if (booChanged)
        {
            pConnection->Execute(strCmdRestore,NULL,0);
            printf("Data restored.\n");
        }
        // Cleanup object before exit
        pConnection->Close ();
    }

    catch(_com_error &e)
    {
        // Notify user of any errors that result from
        // executing the query.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Clone メソッドの例 (VC++)

この例では、Clone メソッドを使って Recordset のコピーを作成し、ユーザーがそれぞれのコピーのレコード ポインタを個別に配置できるようにします。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")
#define TESTHR(x) if FAILED(x) _com_issue_error(hr)

#include <stdio.h>
#include <ole2.h>
#include <conio.h>

// Function Declarations.
void CloneX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CloneX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      CloneX Function                                  //
//                                                       //
///////////////////////////////////////////////////////////

void  CloneX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.

    _RecordsetPtr  arstStores[3];

    //Define Other Variables
    HRESULT hr = S_OK;
    int intLoop = 0;
    _bstr_t strSQL;
    _bstr_t strMessage;
    _bstr_t strFind;
    int intLoop1 = 0;
    char *tempStr;
    bool boolFlag = TRUE;
    char m_szS_stor_name[150];

    // Assign SQL statement and connection string to variables.
    strSQL = "SELECT stor_name FROM Stores ORDER BY stor_name";

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Open recordset as a static cursor type recordset.
        arstStores[0].CreateInstance(__uuidof(Recordset));
        arstStores[0]->CursorType = adOpenStatic;
        arstStores[0]->LockType = adLockBatchOptimistic;

        TESTHR(arstStores[0]->Open(strSQL,strCnn, adOpenStatic,
            adLockBatchOptimistic,adCmdText));

        // Create two clones of the original Recordset.
        arstStores[1] = arstStores[0]->Clone(adLockBatchOptimistic);
        arstStores[2] = arstStores[0]->Clone(adLockBatchOptimistic);

        while (boolFlag)
        {
            // Loop through the array so that on each pass,
            // the user is searching a different copy of the
            // same Recordset.
            for (intLoop = 1; intLoop <= 3 ; intLoop++)
            {
                // Ask for search string while showing where
                // the current record pointer is for each Recordset.
                printf("Recordsets from stores table:\n");

                _bstr_t str1 = arstStores[0]->Fields->
                    GetItem("stor_name")->Value;
                printf("\t1 - Original - Record pointer at %s",
                    (LPCSTR)str1);

                _bstr_t str2 = arstStores[1]->Fields->
                    GetItem("stor_name")->Value;
                printf("\n\t2 - Clone - Record pointer at %s",
                    (LPCSTR)str2);

                _bstr_t str3 = arstStores[2]->Fields->
                    GetItem("stor_name")->Value;
                printf("\n\t3 - Clone - Record pointer at %s",
                    (LPCSTR)str3);

                printf("\n\nEnter search string for # %d\n"
                    “, or press Enter to quit.”, intLoop);
                gets(m_szS_stor_name);

                // Trim the string.
                tempStr = strtok(m_szS_stor_name, "  \t");
                strMessage = tempStr;
                if (tempStr == NULL)
                {
                    boolFlag = FALSE;
                    break;
                }

                // Find the search string; if there's no
                // match, jump to the last record.
                intLoop1 = intLoop -1;

                arstStores[intLoop1]->Filter = "stor_name >= '" +
                    strMessage + "'";

                if (arstStores[intLoop1]->EndOfFile)
                {
                    arstStores[intLoop1]->Filter = (long)adFilterNone;
                    arstStores[intLoop1]->MoveLast();
                }
            }
        } // End of While Loop

        // Clean up objects before exit.
        arstStores[0]->Close();
        arstStores[1]->Close();
        arstStores[2]->Close();
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect = arstStores[0]->GetActiveConnection();

        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
};

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr pErr = NULL;
    long     nCount = 0;
    long     i = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

CloneX.h:

#include "icrsint.h"

// This Class extracts only store name
// from "stores" table.
class CStores : public CADORecordBinding
{
BEGIN_ADO_BINDING(CStores)

    //Column stor_name is the 1st field in the recordset

    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szS_stor_name,
         sizeof(m_szS_stor_name), lS_stor_nameStatus, FALSE)

END_ADO_BINDING()

public:
    CHAR    m_szS_stor_name[150];
    ULONG   lS_stor_nameStatus;
};


CompareBookmarks メソッドの例 (VC++)

この例では、CompareBookmarks メソッドの機能を示します。通常、ブックマークの相対的な値は、特別なブックマークでない限り、必要ではありません。

Authors テーブルから取得した Recordset の任意の行を、検索の対象として指定します。次に、その検索対象に対する各行の相対的な位置を表示します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")
#define TESTHR(x) if FAILED(x) _com_issue_error(hr)

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>

// Function declarations
void CompareBookMarksX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//        Main Function                                 //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CompareBookMarksX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//           CompareBookMarksX Function                 //
//                                                      //
//////////////////////////////////////////////////////////

void CompareBookMarksX(void)
{
    HRESULT hr = S_OK;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstAuthors = NULL;
    _variant_t vTarget;
    _bstr_t strAns;
    _bstr_t strTitle;
    strTitle = "CompareBookmarks Example";
    try
    {
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        pRstAuthors->Open("SELECT * FROM Authors ORDER BY au_id", strCnn,
            adOpenStatic, adLockReadOnly, adCmdText);

        long count = pRstAuthors->RecordCount;
        printf("Rows in the Recordset = %d\n", count);
        if (count == 0)
            exit(1);         //Exit if an empty recordset

        srand( (unsigned)time( NULL ) );      //Randomize

        //Get position between 1 and count-1
        count = int(rand() % (count-1));
        if(!count) {count++;};

        printf("Randomly chosen row position = %d\n", count);

        _variant_t vtBookMark = (short)adBookmarkFirst;

        //Move row to random position
        pRstAuthors->Move(count,vtBookMark);

        vTarget = pRstAuthors->Bookmark;      //Remember the mystery row.
        count = 0;
        long intLineCnt = 3;
        pRstAuthors->MoveFirst();

        while (!(pRstAuthors->EndOfFile))     //Loop through recordset
        {
            intLineCnt++;
            if (intLineCnt%20 == 0)
            {
                printf("\nPress any key to continue...\n");
                getch();
            }
            long result = pRstAuthors->CompareBookmarks(
                pRstAuthors->Bookmark, vTarget);

            if (result == adCompareNotEqual)
                printf("Row %d: Bookmarks are not equal. %d\n", count,
                    result);
            else if  (result == adCompareNotComparable)
                printf("Row %d: Bookmarks are not comparable.\n", count);
            else
            {
                switch(result)
                {
                    case adCompareLessThan:
                        strAns = "less than";
                        break;
                    case adCompareEqual:
                        strAns = "equal to";
                        break;
                    case adCompareGreaterThan:
                        strAns = "greater than";
                        break;
                    default:
                        strAns = "in error comparing to";
                        break;
                }
                printf ("Row position  %d  is  %s  the target.\n",
                    count,(LPCSTR)strAns);
            }
            count++;
            pRstAuthors->MoveNext();
        }

        // Clean up objects before exit.
        pRstAuthors->Close();
   }

   catch(_com_error &e)
   {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//            PrintProviderError Function               //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//        PrintComError Function                        //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


ConnectionString、ConnectionTimeout、State プロパティの例 (VC++)

この例では、Connection オブジェクトを開くための、ConnectionString プロパティのさまざまな使い方を示します。また、ConnectionTimeout プロパティを使って接続のタイムアウト時間を設定し、State プロパティを使って接続の状態を確認します。このプロシージャを実行するには、Getstate 関数が必要です。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ConnectionStringX();
_bstr_t GetState(int intState);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ConnectionStringX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      ConnectionStringX Function                       //
//                                                       //
///////////////////////////////////////////////////////////

void ConnectionStringX()
{
    // Define Connection object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
     _ConnectionPtr pConnection1 = NULL;
     _ConnectionPtr pConnection2 = NULL;
     _ConnectionPtr pConnection3 = NULL;
     _ConnectionPtr pConnection4 = NULL;

    //Define Other Variables
    HRESULT  hr = S_OK;

    try
    {
        // Open a connection without using a Data Source Name (DSN).
        TESTHR(pConnection1.CreateInstance(__uuidof(Connection)));
        pConnection1->ConnectionString = "driver={SQL Server};"
            "server=dhale1;uid=sa;pwd=;database=Pubs";
        pConnection1->ConnectionTimeout = 30;
        pConnection1->Open("","","",NULL);

        // Open a connection using a DSN and ODBC tags.
        TESTHR(pConnection2.CreateInstance(__uuidof(Connection)));
        pConnection2->ConnectionString = "DSN=Pubs;UID=sa;PWD=;";
        pConnection2->Open("","","",NULL);

        // Open a connection using a DSN and OLE DB tags.
        TESTHR(pConnection3.CreateInstance(__uuidof(Connection)));
        pConnection3->ConnectionString = "Data Source=Pubs;User ID=sa;"
            "Password=;";
        pConnection3->Open("","","",NULL);

        // Open a connection using a DSN and individual
        // arguments instead of a connection string.
        TESTHR(pConnection4.CreateInstance(__uuidof(Connection)));
        pConnection4->Open("Pubs","sa","",NULL);

        // Display the state of the connections.
        printf("cnn1 state: %s\n",
            (LPCTSTR)GetState(pConnection1->State));
        printf("cnn2 state: %s\n",
            (LPCTSTR)GetState(pConnection2->State));
        printf("cnn3 state: %s\n",
            (LPCTSTR)GetState(pConnection3->State));
        printf("cnn4 state: %s\n",
            (LPCTSTR)GetState(pConnection4->State));

        //Cleanup objects before exit.
        pConnection4->Close();
        pConnection3->Close();
        pConnection2->Close();
        pConnection1->Close();
    }

    catch(_com_error &e)
    {
        // Notify user of any errors.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection1);
        if(pConnection2)
            PrintProviderError(pConnection2);
        if(pConnection3)
            PrintProviderError(pConnection3);
        if(pConnection4)
            PrintProviderError(pConnection4);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      GetState Function                                //
//                                                       //
///////////////////////////////////////////////////////////

_bstr_t GetState(int intState)
{
    _bstr_t strState;
    switch(intState)
    {
        case adStateClosed:
            strState = "adStateClosed";
            break;
        case adStateOpen:
            strState = "adStateOpen";
            break;
        default:
        ;
    }
    return strState;
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR)pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Count プロパティの例 (VC++)

この例では、Employee データベース内の 2 つのコレクションで Count プロパティを使用します。このプロパティで、各コレクション内のオブジェクト数を取得し、これらのコレクションを列挙するループに上限を設定します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CountX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CountX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      CountX Function                                  //
//                                                       //
///////////////////////////////////////////////////////////

void CountX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _RecordsetPtr pRstEmployee = NULL;

    //Define Other Variables
    HRESULT hr = S_OK;
    _variant_t Index;
    Index.vt = VT_I2;
    int j = 0;

    _bstr_t strCnn("Provider=SQLOLEDB;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Open recordset with data from Employee table.
        TESTHR(pRstEmployee.CreateInstance(__uuidof(Recordset)));
        pRstEmployee->Open("Employee", strCnn, adOpenForwardOnly,
            adLockReadOnly, adCmdTable);

        // Print information about Fields collection.
        printf("%d Fields in Employee\n", pRstEmployee->Fields->Count);
        for (int intLoop = 0;
             intLoop <= (pRstEmployee->Fields->Count-1);
             intLoop++)
        {
            Index.iVal = intLoop;
            printf(" %s\n",(LPSTR) pRstEmployee->Fields->
                GetItem(Index)->Name);
        }

        // Print information about Properties collection.
        printf("\n%d Properties in Employee\n", pRstEmployee->
            Properties->Count);
        for (intLoop = 0;
             intLoop <= (pRstEmployee->Properties->Count - 1);
             intLoop++)
        {
            j++;
            Index.iVal = intLoop;
            printf(" %s\n" ,(LPSTR)pRstEmployee->Properties->
                GetItem(Index)->Name);
            if (((j % 23) == 0) || (intLoop == 11))
            {
                printf("\nPress any key to continue...");
                getch();

                //Clear the screen for the next display
                system("cls");
                j = 0;
            }
        }
        // Clean up objects before exit.
        pRstEmployee->Close();
    }

    catch(_com_error &e)
    {
        // Notify user of any errors that result from
        // executing the query.
        // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstEmployee->GetActiveConnection();

        switch(vtConnect.vt)
        {
        case VT_BSTR:
            PrintComError(e);
            break;
        case VT_DISPATCH:
            PrintProviderError(vtConnect);
            break;
        default:
            printf("Errors occured.");
            break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n",pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


CursorType、LockType、EditMode プロパティの例 (VC++)

この例では、Recordset を開く前に CursorType および LockType プロパティを設定します。また、さまざまな条件下での EditMode プロパティの値も示します。このプロシージャを実行するには、EditModeOutput 関数が必要です。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declaration
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void EditModeX(void);
void EditModeOutput(char *, int);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

     EditModeX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      EditModeX Function                               //
//                                                       //
///////////////////////////////////////////////////////////
void EditModeX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr     pRstEmployees = NULL;
    _ConnectionPtr    pConnection  = NULL;

    HRESULT hr = S_OK;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Open a connection
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        hr = pConnection->Open(strCnn,"","",NULL);

        // Open recordset with data from Employee table
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        pRstEmployees->CursorLocation = adUseClient;
        pRstEmployees->CursorType = adOpenStatic;
        pRstEmployees->LockType  = adLockBatchOptimistic;

        pRstEmployees->Open("Employee",
             _variant_t((IDispatch *) pConnection,true),
            adOpenStatic,adLockBatchOptimistic,adCmdTable);

        // Show the EditMode property under different editing states.
        pRstEmployees->AddNew ();
        pRstEmployees->Fields->Item["emp_id"]->Value =
            (_bstr_t)("T-T55555M");
        pRstEmployees->Fields->Item["fname"]->Value =
            (_bstr_t)("temp_fname");
        pRstEmployees->Fields->Item["lname"]->Value =
            (_bstr_t)("temp_lname");
        EditModeOutput("After AddNew: ", pRstEmployees->EditMode);

        pRstEmployees->UpdateBatch(adAffectCurrent);
        EditModeOutput("After Update: ", pRstEmployees->EditMode);

        pRstEmployees->Fields->Item["fname"]->Value = (_bstr_t)("test");
        EditModeOutput("After Edit: ", pRstEmployees->EditMode);

        // Delete new record because this is a demonstration.
        pConnection->Execute("DELETE FROM Employee WHERE emp_id = "
            "'T-T55555M'", NULL, adCmdText);

        // Clean up objects before exit.
        pRstEmployees->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Recordset.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      EditModeOutput() Function                        //
//                                                       //
///////////////////////////////////////////////////////////
void EditModeOutput(char *strTemp, int intEditMode)
{
    // Print report based on the value of the EditMode property.
    printf("\n%s", strTemp);
    printf("\n  EditMode = ");

    switch (intEditMode)
    {
        case adEditNone :
            printf("adEditNone");
            break;
        case adEditInProgress :
            printf("adEditInProgress");
            break;
        case adEditAdd :
            printf("adEditAdd");
            break;
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\n\t Error number: %x\t%s", pErr->Number,
                (LPCSTR)pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Delete メソッドの例 (VC++)

この例では、Delete メソッドを使って、指定されたレコードを Recordset から削除します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include "DeleteX.h"

//Function Declarations.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DeleteX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DeleteX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      DeleteX Function                                 //
//                                                       //
///////////////////////////////////////////////////////////

void DeleteX(void)
{

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstRoySched = NULL;

    // Define Other Variables
    IADORecordBinding   *picRs = NULL;  //Interface Pointer declared.
    CRoySchedRs    royschrs;            //C++ class object
    HRESULT hr = S_OK;

    char  strTitleID[10], strTmpTitleID[10]="";
    long  longHiRange;
    int   intRoyalty, intLoRange, cnt=0;
    bool  blnFound = TRUE;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Open RoySched table
        TESTHR(pRstRoySched.CreateInstance(__uuidof(Recordset)));

        pRstRoySched->CursorLocation = adUseClient;
        pRstRoySched->CursorType = adOpenStatic;
        pRstRoySched->LockType  = adLockBatchOptimistic;

        TESTHR(pRstRoySched->Open("SELECT * FROM roysched WHERE”
            “ royalty = 20",strCnn,adOpenStatic,adLockBatchOptimistic,
            adCmdText));

        // Prompt for a record to delete.
        printf("Before delete there are %d Titles with 20 percent "
            "royalty :\n", pRstRoySched->RecordCount);

        // Open an IADORecordBinding interface pointer which we'll use
        // for Binding Recordset to a class.
        TESTHR(pRstRoySched->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&royschrs));

        while(!(pRstRoySched->EndOfFile))
        {
            printf("%s\n", royschrs.lemp_titleidStatus == adFldOK ?
                royschrs.m_sz_titleid : "<NULL>");
            pRstRoySched->MoveNext();
        }

        printf("\nEnter the ID of a record to delete: ");
        gets(strTitleID);

        // Converting the title_id to upper case
        for( cnt=0; cnt<10; cnt++)
        {
            if(strTitleID[cnt] != NULL)
            {
                if( IsCharAlpha( strTitleID[cnt]) )
                {
                    if( islower( strTitleID[cnt]) )
                        strTmpTitleID[cnt] = _toupper(strTitleID[cnt]);
                    else
                        strTmpTitleID[cnt] = strTitleID[cnt];
                }
                else
                {
                    strTmpTitleID[cnt] = strTitleID[cnt];
                }
            }
        }

        // Move to the record and save data so it can be restored.
        pRstRoySched->PutFilter ("title_id = '" +
            (_bstr_t)(LPCSTR)strTmpTitleID + "'");

        if(pRstRoySched->RecordCount != 0)
        {
            intLoRange = royschrs.m_sz_lorange;
            longHiRange = royschrs.m_sz_hirange;
            intRoyalty = royschrs.m_sz_royalty;

            // Delete the record
            pRstRoySched->Delete(adAffectCurrent);
            pRstRoySched->UpdateBatch(adAffectCurrent);
        }
        else
        {
            blnFound = FALSE;
            printf("This Title ID not available");
        }

        // Show the results.
        VARIANT varFilter;
        varFilter.vt = VT_I2;
        varFilter.iVal = adFilterNone;
        pRstRoySched->PutFilter (varFilter);
        pRstRoySched->Requery(-1);

        // Bind the Recordset to a C++ Class here.
        TESTHR(picRs->BindToRecordset(&royschrs));

        printf("\nAfter delete there are %d Titles with 20 percent"
            " royalty: ", pRstRoySched->RecordCount);

        while(!(pRstRoySched->EndOfFile))
        {
            printf("\n%s", royschrs.lemp_titleidStatus == adFldOK ?
                royschrs.m_sz_titleid : "<NULL>");
            pRstRoySched->MoveNext();
        }

        // Restore the data because this is a demonstration.
        if(blnFound)
        {
            strcpy((char*)royschrs.m_sz_titleid,
                (const char*) strTmpTitleID);
            royschrs.m_sz_lorange = intLoRange;
            royschrs.m_sz_hirange = longHiRange;
            royschrs.m_sz_royalty = intRoyalty;

            TESTHR(picRs->AddNew(&royschrs));

            pRstRoySched->UpdateBatch(adAffectCurrent);
        }

        // Clean up objects before exit.
        pRstRoySched->Close();

        // Release the IADORecordset Interface here
        if (picRs)
            picRs->Release();
}

    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstRoySched->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

DeleteX.h:

#include "icrsint.h"

// This Class extracts titleid, lorange, hirange and royalty
// from the "roysched" table.

class CRoySchedRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CRoySchedRs)

    //Column empid is the 1st field in the recordset

    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_sz_titleid,
         sizeof(m_sz_titleid), lemp_titleidStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(2, adInteger, m_sz_lorange,
         sizeof(m_sz_lorange), lemp_lorangeStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(3, adInteger, m_sz_hirange,
         sizeof(m_sz_hirange), lemp_hirangeStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(4, adInteger, m_sz_royalty,
         sizeof(m_sz_royalty), lemp_royaltyStatus, TRUE)

END_ADO_BINDING()

public:

    CHAR     m_sz_titleid[10];
    ULONG    lemp_titleidStatus;
    ULONG    m_sz_lorange;
    ULONG    lemp_lorangeStatus;
    ULONG    m_sz_hirange;
    ULONG    lemp_hirangeStatus;
    ULONG    m_sz_royalty;
    ULONG    lemp_royaltyStatus;
};


Description、NativeError、Number、Source、SQLState プロパティの例 (VC++)

この例では、エラーを発生させてトラップし、生成された Error オブジェクトの Description、HelpContext、HelpFile、NativeError、Number、Source、および SQLState プロパティを表示します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DescriptionX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DescriptionX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      DescriptionX Function                            //
//                                                       //
///////////////////////////////////////////////////////////

void DescriptionX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _ConnectionPtr pConnection = NULL;
    ErrorPtr errorLoop = NULL;

    //Define Other Variables
    HRESULT hr = S_OK;

    try
    {
        // Intentionally trigger an error.
        // open connection
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        if (FAILED(hr = pConnection->Open("nothing","","",NULL)))
        {
            _com_issue_error(hr);
            exit(1);
        }

        // Cleanup object before exit.
        pConnection->Close();
    }

    catch(_com_error)
    {
        // Pass a connection pointer.
        PrintProviderError(pConnection);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    //Define Other Variables
    HRESULT  hr = S_OK;
    _bstr_t  strError;
    ErrorPtr  pErr = NULL;

    try
    {
        // Enumerate Errors collection and display
        // properties of each Error object.
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount - 1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error #%d\n", pErr->Number);
            printf("\t %s\n",(LPCSTR)pErr->Description);
            printf("\t(Source: %s)\n",(LPCSTR)pErr->Source);
            printf("\t(SQL State: %s)\n",(LPCSTR)pErr->SQLState);
            printf("\t(NativeError: %d)\n",(LPCSTR)pErr->NativeError);
            if ((LPCSTR)pErr->GetHelpFile() == NULL)
            {
                printf("\tNo Help file available\n");
            }
            else
            {
                printf("\t(HelpFile: %s\n)" ,pErr->HelpFile);
                printf("\t(HelpContext: %s\n)" , pErr->HelpContext);
            }
        }
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   // Notify the user of errors if any.
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.

   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Execute、Requery、Clear メソッドの例 (VC++)

この例では、Command オブジェクトの Execute メソッドを実行する場合と Connection オブジェクトの Execute メソッドを実行する場合を示します。また、Requery メソッドを使って Recordset オブジェクト内の最新のデータを取得し、Clear メソッドを使って Errors コレクションの内容をクリアします。この例を実行するには、ExecuteCommand と PrintOutput 関数が必要です。

#include <ole2.h>
#include <stdio.h>

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ExecuteX(void);
void ExecuteCommand(_CommandPtr pCmdTemp, _RecordsetPtr pRstTemp);
void PrintOutput(_RecordsetPtr pRstTemp);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

////////////////////////////////
//      Main Function         //
////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ExecuteX();

    ::CoUninitialize();
}

///////////////////////////////////
//      ExecuteX Function        //
///////////////////////////////////

void ExecuteX(void)
{
   HRESULT    hr = S_OK;

    // Define string variables.
   _bstr_t strSQLChange("UPDATE Titles SET Type = "
            "'self_help' WHERE Type = 'psychology'");
   _bstr_t strSQLRestore("UPDATE Titles SET Type = "
            "'psychology' WHERE Type = 'self_help'");
   _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection = NULL;
    _CommandPtr     pCmdChange  = NULL;
    _RecordsetPtr   pRstTitles  = NULL;

    try
    {
        // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", adConnectUnspecified);

        // Create command object.
        TESTHR(pCmdChange.CreateInstance(__uuidof(Command)));
        pCmdChange->ActiveConnection = pConnection;
        pCmdChange->CommandText = strSQLChange;

        // Open Titles table, casting Connection pointer to an
        // IDispatch type so converted to correct type of variant.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->Open ("Titles", _variant_t((IDispatch *) pConnection,
            true), adOpenStatic, adLockOptimistic, adCmdTable);

        // Print report of original data.
        printf(
            "\n\nData in Titles table before executing the query: \n");

        // Call function to print loop recordset contents.
        PrintOutput(pRstTitles);

        // Clear extraneous errors from the Errors collection.
        pConnection->Errors->Clear();

        // Call ExecuteCommand subroutine to execute pCmdChange command.
        ExecuteCommand(pCmdChange, pRstTitles);

        // Print report of new data.
        printf(
            "\n\n\tData in Titles table after executing the query: \n");
        PrintOutput(pRstTitles);

        // Use the Connection object's Execute method to
        // execute SQL statement to restore data.
        pConnection->Execute(strSQLRestore, NULL, adExecuteNoRecords);

        // Retrieve the current data by requerying the recordset.
        pRstTitles->Requery(adCmdUnknown);

        // Print report of restored data.
        printf(
            "\n\n\tData after exec. query to restore original info: \n");
        PrintOutput(pRstTitles);

        // Clean up objects before exit.
        pRstTitles->Close();
        pConnection->Close();
    }

    catch (_com_error &e)
    {
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

//////////////////////////////////////////
//      ExecuteCommand Function         //
//////////////////////////////////////////

void ExecuteCommand(_CommandPtr pCmdTemp, _RecordsetPtr pRstTemp)
{
    try
    {
        // CommandText property already set before function was called.
        pCmdTemp->Execute(NULL, NULL, adCmdText);

        // Retrieve the current data by requerying the Recordset.
        pRstTemp->Requery(adCmdUnknown);
    }

    catch(_com_error &e)
    {
        // Notify user of any errors that result from
        // executing the query.
        // Pass a connection pointer accessed from the Recordset.
        PrintProviderError(pRstTemp->GetActiveConnection());
        PrintComError(e);
    }
}

/////////////////////////////////////
//      PrintOutput Function       //
/////////////////////////////////////

void PrintOutput(_RecordsetPtr pRstTemp)
{
    // Ensure at top of Recordset.
    pRstTemp->MoveFirst();

    // If EOF is true, then no data and skip print loop.
    if( pRstTemp->EndOfFile )
    {
        printf("\tRecordset empty\n");
    }
    else
    {
        // Define temporary strings for output conversions.
        // Initialize to first record's values.
        _bstr_t bstrTitle;
        _bstr_t bstrType;

        // Enumerate Recordset and print from each.
        while(!(pRstTemp->EndOfFile))
            {
            // Convert variant string to convertable string type.
            bstrTitle = pRstTemp->Fields->GetItem("Title")->Value;
            bstrType  = pRstTemp->Fields->GetItem("Type")->Value;
            printf("\t%s, %s \n",
                (LPCSTR) bstrTitle,
                (LPCSTR) bstrType);

            pRstTemp->MoveNext();
        }
    }
}

///////////////////////////////////////////////
//      PrintProviderError Function          //
///////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////
//      PrintComError Function      //
//////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Filter、RecordCount プロパティの例 (VC++)

この例では、Filter プロパティを使って、既存の Recordset に適用されている特定の条件に基づいて新規 Recordset を開きます。RecordCount プロパティを使って、2 つのレコードセット内のレコードの数を示します。このプロシージャを実行するには、FilterField 関数が必要です。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include "FilterX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void FilterX(void);
_RecordsetPtr FilterField(_RecordsetPtr rstTemp, _bstr_t strField,
    _bstr_t strFilter);
void FilterX2(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

void main()
{
    HRESULT hr = S_OK;

    if(FAILED(::CoInitialize(NULL)))
        return;

    FilterX();

    //Wait here for user to see the output..
    printf("\nPress any key to Continue...");
    getch();

    //Clear the screen for the next display
    system("cls");

    FilterX2();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      FilterX Function                                 //
//                                                       //
///////////////////////////////////////////////////////////

void  FilterX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr rstPublishers = NULL;
    _RecordsetPtr rstPublishersCountry = NULL;

    //Define Other Variables
    HRESULT hr = S_OK;
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");
    int intPublisherCount = 0;
    long recCount = 0;
    _bstr_t strCountry;
    _bstr_t strMessage;
    char *tempStr;
    CHAR sz_CountryName[50];
    bool boolFlag = TRUE;
    try
    {
        // Open recordset with data from Publishers table.
        rstPublishers.CreateInstance(__uuidof(Recordset));
        rstPublishersCountry.CreateInstance(__uuidof(Recordset));

        rstPublishers->CursorType = adOpenStatic;

        TESTHR(hr =  rstPublishers->Open("publishers",strCnn,
             adOpenStatic , adLockReadOnly,adCmdTable));

        // Populate the Recordset.
        intPublisherCount = rstPublishers->RecordCount;

        // Get user input.
        printf("Enter a country to filter on:");
        gets(sz_CountryName);

        // Trim the string
        tempStr = strtok(sz_CountryName, "  \t");
        strCountry = tempStr;
        if (tempStr == NULL)
        {
            boolFlag = FALSE;
        }

        if (boolFlag)
        {
            if (strcmp(sz_CountryName,""))
            {
                // Open a filtered Recordset object.
                rstPublishersCountry = FilterField(rstPublishers,
                    "Country", strCountry);
                recCount = rstPublishersCountry->GetRecordCount();
                if (recCount==0)
                {
                    printf("\nNo publishers from that country.\n");
                }
                else
                {
                    // Print number of records for the original
                    // Recordset object and the filtered Recordset
                    // object.
                    printf("\nOrders in original recordset:\n%d",
                        intPublisherCount);
                    printf("\nOrders in filtered recordset “
                        “(Country = '%s'): \n%d\n\n",(LPCSTR)strCountry,
                        rstPublishersCountry->RecordCount);
                }
                rstPublishersCountry->Close();
            }
        }
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect = rstPublishers->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

_RecordsetPtr FilterField(_RecordsetPtr rstTemp,_bstr_t strField,
    _bstr_t strFilter)
{
        rstTemp->Filter  = strField + " = '" + strFilter + "'";
        return rstTemp;
}

void FilterX2(void)
{
    _RecordsetPtr rstPublishers;
    CPublishers publishers;

    //Define Other Variables
    HRESULT hr = S_OK;
    IADORecordBinding   *picRs = NULL;  //Interface Pointer declared...

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");
    try
    {
        // Open recordset with data from Publishers table.
        rstPublishers.CreateInstance(__uuidof(Recordset));

        rstPublishers->CursorType = adOpenStatic;

        TESTHR(hr = rstPublishers->Open("SELECT * FROM publishers WHERE "
            "Country='USA'",strCnn,adOpenStatic,adLockReadOnly,
            adCmdText));

        //Open an IADORecordBinding interface pointer
        //which we'll use for Binding Recordset to a class
        TESTHR(rstPublishers->QueryInterface(
            __uuidof(IADORecordBinding), (LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&publishers));

        // Print current data in recordset.
        rstPublishers->MoveFirst();

        while (!rstPublishers->EndOfFile)
        {
            printf("%s, %s\n",
                publishers.lP_pubnameStatus == adFldOK ?
                publishers.m_szP_pubname: "<NULL>",
                publishers.lP_countryStatus == adFldOK ?
                publishers.m_szP_country: "<NULL>");

            rstPublishers->MoveNext();
        }
        //Release the IADORecordset Interface.
        if (picRs)
            picRs->Release();

        // Clean up object before exit.
        rstPublishers->Close();
    }

    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect = rstPublishers->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

FilterX.h:

#include "icrsint.h"

//This Class extracts only Pub Name and Country Name.
class CPublishers : public CADORecordBinding
{
BEGIN_ADO_BINDING(CPublishers)

    //Column Pub Name is the 2nd field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szP_pubname,
         sizeof(m_szP_pubname), lP_pubnameStatus, TRUE)

    //Column Country Name is the 5th field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(5, adVarChar, m_szP_country ,
        sizeof(m_szP_country), lP_countryStatus, TRUE)

END_ADO_BINDING()

public:
    CHAR    m_szP_pubname[50];
    ULONG   lP_pubnameStatus;
    CHAR    m_szP_country[50];
    ULONG   lP_countryStatus;
};


Find メソッドの例 (VC++)

この例では、Recordset オブジェクトの Find メソッドを使って、Pubs データベースのビジネス タイトルを検索して位置を定め、その数をカウントします。この例は、基になるプロバイダが類似の機能をサポートしていない場合を想定しています。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "FindX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void FindX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    If(FAILED(::CoInitialize(NULL)))
        return;

    FindX();

    //Wait here for the user to see the output.
    printf("Press any key to continue...");
    getch();
    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//             FindX Function                           //
//                                                      //
//////////////////////////////////////////////////////////

void FindX(void)
{
    HRESULT    hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr    pConnection  = NULL;
    _RecordsetPtr     pRstTitles   = NULL;
    IADORecordBinding   *picRs     = NULL;  //Interface Pointer declared.
    CTitlesRs titlers;                      //C++ class object

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", NULL);

        // Open Titles Table
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));

        pRstTitles->Open("SELECT title_id FROM Titles",
            _variant_t((IDispatch *)pConnection),
            adOpenStatic, adLockReadOnly, adCmdText);

        // The default parameters are sufficient to search forward
        // through a Recordset.

        pRstTitles->Find ("title_id LIKE 'BU%'",0,adSearchForward,"");

        //Open an IADORecordBinding interface pointer which
        //we'll use for Binding Recordset to a class
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&titlers));

        // Skip the current record to avoid finding the same
        // row repeatedly. The bookmark is redundant because Find
        // searches from the current position.
        int count = 0;

        //Continue if last find succeeded.
        while (!(pRstTitles->EndOfFile))
        {
            printf("Title ID: %s\n",titlers.lt_titleidStatus == adFldOK ?
                titlers.m_szt_titleid : "<NULL>");
            count++;                       //Count the last title found.

            _variant_t mark = pRstTitles->Bookmark;  //Note current pos.
            pRstTitles->Find("title_id LIKE 'BU%'", 1, adSearchForward,
                mark);
        }

        //Release IADORecordset Interface
        if (picRs)
            picRs->Release();

        // Clean up objects before exit.
        pRstTitles->Close();
        pConnection->Close();
        printf("The number of business titles is %d\n",count);

   }

   catch(_com_error &e)
   {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
       PrintProviderError(pConnection);
       PrintComError(e);
   }
}

//////////////////////////////////////////////////////////
//                                                      //
//       PrintProviderError Function                    //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//       PrintComError Function                         //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

FindX.h

#include "icrsint.h"

//This Class extracts only titleId from Titles table.
class CTitlesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitlesRs)

    // Column title_id is the 1st field in the recordset
    // from Titles table.
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szt_titleid,
         sizeof(m_szt_titleid), lt_titleidStatus, FALSE)

END_ADO_BINDING()

public:
   CHAR   m_szt_titleid[150];
   ULONG   lt_titleidStatus;
};


GetRows メソッドの例 (VC++)

この例では、GetRows メソッドを使って、指定された数の行を Recordset から取得し、結果のデータを配列に格納します。GetRows メソッドでは、次の 2 つのケースにおいて、要求された行数よりも少ない数が返される場合があります。1 つは EOF に達した場合で、もう 1 つは GetRows が別のユーザーによって削除されたレコードを取得しようとした場合です。関数は、2 番目のケースが発生した場合にのみ、False を返します。このプロシージャを実行するには、GetRowsOK 関数が必要です。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>

// Function Declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void GetRowsX(void);
bool GetRowsOK(_RecordsetPtr pRstTemp,int intNumber,
        _variant_t& avarData);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

     GetRowsX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      GetRowsX Function                                //
//                                                       //
///////////////////////////////////////////////////////////

void GetRowsX(void)
{
    HRESULT hr = S_OK;

    // Define string variables.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstEmployees = NULL;

    try
    {
        // Open recordset with names and hire dates from Employees table.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        pRstEmployees->Open("SELECT fName, lName, hire_date "
            "FROM Employee ORDER BY lName",strCnn,
            adOpenStatic, adLockReadOnly,adCmdText);

         while (true) //continuous loop
        {
            int intLines = 0;

            // Get user input for number of rows.
            printf("\nEnter number of rows to retrieve (0 to exit): ");
            int intRows;
            scanf("%d", &intRows);

            if (intRows <= 0)
                break;

            //Clear the screen for the next display
            system("cls");

            // If GetRowsOK is successful, print the results,
            // noting if the end of the file was reached.
            _variant_t avarRecords;

            if (GetRowsOK(pRstEmployees, intRows, avarRecords))
            {
                long lUbound;
                HRESULT hr = SafeArrayGetUBound(avarRecords.parray,
                    2,&lUbound);

                if (hr == 0)
                {
                    if (intRows > lUbound + 1)
                    {
                        printf("\n(Not enough records in Recordset to "
                            "retrieve %d rows)\n", intRows);
                    }
                }
                printf("%d records found.", lUbound+1);

                // Print the retrieved data.
                for (int intRecords = 0;intRecords < lUbound+1;
                     intRecords++)
                {
                    printf("\n ");

                    long rgIndices[2];
                    rgIndices[0] = 0;
                    rgIndices[1] = intRecords;
                    _variant_t result;
                    result.vt = VT_BSTR;

                    hr= SafeArrayGetElement(avarRecords.parray,
                        rgIndices, &result);

                    if (hr == 0){printf("%s ",(LPCSTR)(_bstr_t)result);}

                    rgIndices[0] = 1;

                    hr= SafeArrayGetElement(avarRecords.parray,
                        rgIndices, &result);

                    if (hr == 0){printf("%s, ",(LPCSTR)(_bstr_t)result);}

                    rgIndices[0] = 2;

                    hr= SafeArrayGetElement(avarRecords.parray,
                        rgIndices, &result);

                    if (hr == 0){printf("%s",(LPCSTR)(_bstr_t)result);}

                    intLines ++;

                    if (intLines % 10 == 0)
                    {
                        printf("\nPress any key to continue...");
                        getch();

                        intLines = 0;

                        //Clear the screen for the next display
                        system("cls");
                    }
                }
            }
            else
            {
                // Assuming the GetRows error was due to data
                // changes by another user, use Requery to
                // refresh the Recordset and start over.
                printf("GetRows failed--retry?\n");
                char chKey;
                do
                {
                    chKey = getch();
                }while(toupper(chKey) != 'Y'  && toupper(chKey) != 'N');

                if(toupper(chKey) == 'Y')
                {
                    pRstEmployees->Requery(adOptionUnspecified);
                }
                else
                {
                    printf("GetRows failed!\n");
                    break;
                }
            }

            // Because using GetRows leaves the current
            // record pointer at the last record accessed,
            // move the pointer back to the beginning of the
            // Recordset before looping back for another search.
            pRstEmployees->MoveFirst();
        }
        //Clean up objects before exit.
        pRstEmployees->Close();
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

bool GetRowsOK(_RecordsetPtr pRstTemp,int intNumber,
        _variant_t& avarData)
{
    // Store results of GetRows method in array.
    avarData = pRstTemp->GetRows(intNumber);

    // Return False only if fewer than the desired
    // number of rows were returned, but not because the
    //end of the Recordset was reached.
    long lUbound;
    HRESULT hr = SafeArrayGetUBound(avarData.parray, 2,&lUbound);
    if (hr == 0)
    {
        if ((intNumber > lUbound + 1) && (!(pRstTemp->EndOfFile)))
            return false;
        else
            return true;
    }
    else
    {
        printf ("\nUnable to Get the Arrays Upper Bound\n");
        return false;
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


GetString メソッドの例 (VC++)

この例では、GetString メソッドの機能を示します。

ユーザーは、データ アクセスの問題をデバッグ中で、小規模な Recordset の現在の内容をすばやく簡単に出力する方法を必要としているとします。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void GetStringX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    GetStringX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//          GetStringX Function                         //
//                                                      //
//////////////////////////////////////////////////////////

void GetStringX(void)
{
    HRESULT  hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
   _ConnectionPtr  pConnection   = NULL;
   _RecordsetPtr   pRstAuthors   = NULL;

    // Define string variables.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");
    _bstr_t varOutput;
    char *strPrompt = "Enter a state (CA, IN, KS, MD, MI, OR, TN, UT): ";
    char strState[2], *pState;

    try
    {
       // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        // Open a command object for a stored procedure,
        // with one parameter.
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        printf("%s",strPrompt);
        gets(strState);

        pState = strtok(strState," \t");

        char strQry[100] = "SELECT au_fname, au_lname, address, city "
            "FROM Authors WHERE state = ";

        strcat(strQry,"'");
        strcat(strQry,pState);
        strcat(strQry,"'");

        _bstr_t strQuery(strQry);

        pConnection->Open (strCnn, "", "", NULL);

        pRstAuthors->Open(strQuery, _variant_t((IDispatch*)pConnection,
            true),
        adOpenStatic, adLockReadOnly, adCmdText);

        if (pRstAuthors->RecordCount > 0)
        {
            // Use all defaults: get all rows, TAB column delimiter,
            // CARRIAGE RETURN row delimiter, empty-string null delimiter
            long lRecCount =  pRstAuthors->RecordCount;
            _bstr_t varTab("\t");
            _bstr_t varRet("\r");
            _bstr_t varNull("");
            varOutput = pRstAuthors->GetString(adClipString,lRecCount,
                varTab,varRet,varNull);
            printf("State = '%s'\n", strState);
            printf ("Name            Address                    City\n");
            printf ("%s\n", (LPCTSTR)varOutput);
        }
        else
        {
            printf("\nNo rows found for state = '%s'\n",pState);
        }
        // Clean up objects before exit.
        pRstAuthors->Close();
        pConnection->Close();
   }

   catch(_com_error &e)
   {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
       PrintProviderError(pConnection);
       PrintComError(e);
   }
}

//////////////////////////////////////////////////////////
//                                                      //
//        PrintProviderError Function                   //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr   pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintComError Function                          //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);

}


Handler プロパティの例 (VC++)

この例では、RDS.DataControl オブジェクトの Handler プロパティの機能を示します。詳細については、「DataFactory のカスタマイズ」を参照してください。

サーバー上のパラメータ ファイル MSDFMAP.INI に、次のセクションがあるとします。

[connect AuthorDataBase]
Access=ReadWrite
Connect="DSN=Pubs"
[sql AuthorById]
SQL="SELECT * FROM Authors WHERE au_id = ?"

コードは次のようになります。SQL プロパティに割り当てられたコマンドは識別子 AuthorById と一致するので、Michael O'Leary という author の行を取得します。コード中の Connect プロパティは Northwind データ ソースを指定していますが、このデータ ソースは、MSDFMAP.INI の connect セクションにより上書きされます。DataControl オブジェクトの Recordset プロパティは、コーディングの便宜上、接続されていない Recordset オブジェクトに割り当てられます。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")
#import "C:\Program Files\Common Files\System\MSADC\msadco.dll"

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void HandlerX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//     Main Function                                    //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    If(FAILED(::CoInitialize(NULL)))
        return;

     HandlerX();

     printf("Press any key to continue...");
     getch();
     ::CoUninitialize();
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//          HandlerX Function                           //
//                                                      //
//////////////////////////////////////////////////////////

void HandlerX(void)
{
   HRESULT  hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRst = NULL;

    //Define RDS object pointers.
    RDS::IBindMgrPtr dc;

    try
    {
        TESTHR(dc.CreateInstance(__uuidof(RDS::DataControl)));
        dc->Handler = "MSDFMAP.Handler";
        dc->Server = "http://srv";
        dc->Connect = "Data Source=AuthorDatabase";
        dc->SQL = "AuthorById(267-41-2394)";

        // Retrieve the record.
        dc->Refresh();

        // Use another Recordset as a convenience.
        pRst = dc->GetRecordset();
        printf("Author is %s %s",(LPSTR) (_bstr_t) pRst->Fields->
            GetItem("au_fname")->Value,
            (LPSTR) (_bstr_t) pRst->Fields->GetItem("au_lname")->Value);
        pRst->Close();
    }

    catch (_com_error &e)
    {
        PrintProviderError(pRst->GetActiveConnection());
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintProviderError Function                     //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//
//      PrintComError Function                          //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


InternetTimeout プロパティの例 (VC++)

この例では、DataControl と DataSpace オブジェクトにある InternetTimeout プロパティの機能を示します。ここでは、DataControl オブジェクトの InternetTimeout プロパティを使って、タイムアウトを 20 秒に設定します。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")
#import "C:\Program Files\Common Files\System\MSADC\msadco.dll"

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void InternetTimeOutX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//    Main Function                                     //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    InternetTimeOutX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//         InternetTimeOutX Function                    //
//                                                      //
//////////////////////////////////////////////////////////

void InternetTimeOutX(void)
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRst = NULL;

    //Define RDS object pointers
    RDS::IBindMgrPtr dc ;

    try
    {
        TESTHR(dc.CreateInstance(__uuidof(RDS::DataControl)));
        dc->Server = "http://srv";
        dc->Connect = "DSN=Pubs";
        dc->SQL = "SELECT * FROM Authors";

        // Wait at least 20 seconds.
        dc->InternetTimeout = 20000;
        dc->Refresh();

        // Use another Recordset as a convenience
        pRst = dc->GetRecordset();
        while(!(pRst->EndOfFile))
        {
            printf("%s %s",(LPSTR) (_bstr_t) pRst->Fields->
                GetItem("au_fname")->Value,
               (LPSTR) (_bstr_t) pRst->Fields->
                GetItem("au_lname")->Value);

            pRst->MoveNext();
        }
        pRst->Close();
    }

    catch (_com_error &e)
    {
        PrintProviderError(pRst->GetActiveConnection());
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//     PrintProviderError Function                      //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//     PrintComError Function                           //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


IsolationLevel、Mode プロパティの例 (VC++)

この例では、Mode プロパティを使って排他的接続を開き、IsolationLevel プロパティを使ってほかのトランザクションから独立したトランザクションを開きます。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll"\
    no_namespace rename("EOF","EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "IsolationLevelX.h"

// Function Declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void IsolationLevelX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

/////////////////////////////////////////////////////////////////
//                                                             //
//                                                             //
//                        Main Function                        //
//                                                             //
//                                                             //
/////////////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    IsolationLevelX();

    ::CoUninitialize();
}

/////////////////////////////////////////////////////////////////
//                                                             //
//      IsolationLevelX()  Function                            //
//                                                             //
/////////////////////////////////////////////////////////////////

void IsolationLevelX(void)
{
    // Define ADO ObjectPointers
    // Initialize Pointers on define
    // These are in the ADODB :: namespace
    _RecordsetPtr pRstTitles = NULL;
    _ConnectionPtr pConnection = NULL;

    // Define other Variables
    HRESULT hr = S_OK;
    IADORecordBinding *picRs  = NULL;  // Interface Pointer Declared
    CTitlesRs titlers;                  // C++ Class Object

    //Assign Connection String to Variable
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
                    "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Open Connection and Titles Table
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Mode = adModeShareExclusive;
        pConnection->IsolationLevel = adXactIsolated;
        pConnection->Open(strCnn,"","",NULL);

        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->CursorType = adOpenDynamic;
        pRstTitles->LockType = adLockPessimistic;

        pRstTitles->Open("Titles",_variant_t((IDispatch*) pConnection,
            true),adOpenDynamic,adLockPessimistic,adCmdTable);

        pConnection->BeginTrans();

        // Display Connection Mode
        if(pConnection->Mode == adModeShareExclusive)
        {
            printf("Connection Mode Is Exclusive");
        }
        else
        {
            printf("Connection Mode Is Not Exclusive");
        }

        // Display Isolation Level
        if(pConnection->IsolationLevel == adXactIsolated)
        {
            printf("\n\nTransaction is Isolated");
            printf("\n\nPress any key to continue...\n\n");
            getch();
        }
        else
        {
            printf("\n\nTransaction is not Isolated");
            printf("\n\nPress any key to continue...\n\n");
            getch();
        }

        // Open an IADORecordBinding interface pointer which
        // we will use for binding Recordset to a class
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Bind the Recordset to a C++ class here
        TESTHR(picRs->BindToRecordset(&titlers));

        // Change the type of psychology titles.
        LPSTR p_TempStr = (LPSTR) malloc(sizeof(titlers.m_szau_Type));

        while (!(pRstTitles->EndOfFile))
        {
            // Remove blank string
            strcpy(p_TempStr,strtok(titlers.m_szau_Type," "));

            // Compare type with psychology
            if (!strcmp(p_TempStr,"psychology"))
            {
                    // Copy "self_help" title field
                    strcpy(titlers.m_szau_Type,"self_help");
                    picRs->Update(&titlers);
            }
            pRstTitles->MoveNext();
        }
        // Print current data in recordset.
        pRstTitles->Requery(adOptionUnspecified);

        // Open again IADORecordBinding interface pointer for Binding
        // Recordset to a class.
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // ReBinding the Recordset to a C++ Class
        TESTHR(picRs->BindToRecordset(&titlers));

        // Move to the first record of the Titles table
        pRstTitles->MoveFirst();

        //Clear the screen for the next display
        system("cls");

        while (!pRstTitles->EndOfFile)
        {
            printf("%s -  %s\n",titlers.lau_TitleStatus == adFldOK ?
                titlers.m_szau_Title :"<NULL>",
                titlers.lau_TypeStatus == adFldOK ?
                titlers.m_szau_Type :"<NULL>");
            pRstTitles->MoveNext();
        }

        // Restore Original Data
        pConnection->RollbackTrans();

        // Deallocate the memory
        free(p_TempStr);
        pRstTitles->Close();

        // Release the IADORecordset Interface here
        if(picRs)
            picRs->Release();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

/////////////////////////////////////////////////////////////////
//                                                             //
//                  PrintProviderError Function                //
//                                                             //
/////////////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    //Print Provider Errors from Connection object
    //pErr is a record object in the Connection's Error collection
    ErrorPtr    pErr = NULL;

    if((pConnection->Errors->Count)>0)
    {
        long nCount = pConnection->Errors->Count;

        //Collection ranges from 0 to nCount-1
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error Number :%x \t %s",pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

IsolationLevelX.h:

// IsolationLevelX.h

#include "icrsint.h"

//This class extracts titles and type from Titles table

class CTitlesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitlesRs)
        // Column title is the 2nd field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_szau_Title,
            sizeof(m_szau_Title),lau_TitleStatus,FALSE)
        // Column type is the 3rd field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(3,adVarChar,m_szau_Type,
            sizeof(m_szau_Type),lau_TypeStatus,TRUE)
END_ADO_BINDING()

public:
    CHAR m_szau_Title[81];
    ULONG lau_TitleStatus;
    CHAR m_szau_Type[13];
    ULONG lau_TypeStatus;
};


Item プロパティの例 (VC++)

この例では、Item プロパティを使ってコレクションのメンバにアクセスする方法を示します。この例では、パラメータ化コマンドを使って Pubs データベースの Authors テーブルを開きます。

データベースに対して発行されるコマンドのパラメータには、Command オブジェクトの Parameters コレクションからインデックスおよび名前によってアクセスします。返される Recordset のフィールドには、そのオブジェクトの Fields コレクションからインデックスおよび名前によってアクセスします。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ItemX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//       Main Function                                  //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ItemX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       ItemX Function                                 //
//                                                      //
//////////////////////////////////////////////////////////

void ItemX(void)
{
    HRESULT  hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
   _ConnectionPtr  pConnection  = NULL;
   _RecordsetPtr   pRst     = NULL;
   _CommandPtr     pCmd     = NULL;
   _ParameterPtr   pPrm     = NULL;
    FieldPtr       pFld     = NULL;

    // Other Variables.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");
    _variant_t    Column[9];
    _variant_t    vIndex;

   try
    {
       // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        TESTHR(pRst.CreateInstance(__uuidof(Recordset)));

        TESTHR(pCmd.CreateInstance(__uuidof(Command)));

        //Set the array with the Authors table field (column) names
        Column[0] = "au_id";
        Column[1] = "au_lname";
        Column[2] = "au_fname";
        Column[3] = "phone";
        Column[4] = "address";
        Column[5] = "city";
        Column[6] = "state";
        Column[7] = "zip";
        Column[8] = "contract";

        _bstr_t strText("SELECT * FROM Authors WHERE state = ?");
        pCmd->CommandText = strText;

        pPrm = pCmd->CreateParameter("ItemXparm", adChar, adParamInput,
            2, "CA");
        pCmd->Parameters->Append(pPrm);

        pConnection->Open(strCnn, "", "", NULL);
        pCmd->ActiveConnection = pConnection;

        // Connection and CommandType are omitted because
        // a Command object is provided.
        _variant_t Conn;
        Conn.vt = VT_ERROR;
        Conn.scode = DISP_E_PARAMNOTFOUND;

        pRst->Open((_variant_t((IDispatch *) pCmd)),Conn,adOpenStatic,
            adLockReadOnly, -1);

        printf("The Parameters collection accessed by index...\n");

        vIndex = (short) 0;
        pPrm = pCmd->Parameters->GetItem(&vIndex);
        printf("Parameter name = '%s', value = '%s'\n",
            (LPCSTR)pPrm->Name, (LPSTR)(_bstr_t)pPrm->Value);

        printf("\nThe Parameters collection accessed by name...\n");
        pPrm = pCmd->Parameters->Item["ItemXparm"];
        printf("Parameter name = '%s', value = '%s'\n",
            (LPCSTR)pPrm->Name, (LPSTR)(_bstr_t)pPrm->Value);

        printf("\nThe Fields collection accessed by index...\n");
        pRst->MoveFirst();
        long limit = 0;
        limit = ((pRst->Fields->Count) - 1);
        int intLineCnt = 8;
        for (short iIndex = 0; iIndex <= limit; iIndex++)
        {
            vIndex = iIndex;
            intLineCnt++;
            if (intLineCnt%15 == 0)
            {
                printf("\nPress any key to continue...\n");
                getch();
            }
            pFld = pRst->Fields->GetItem(&vIndex);
            printf("Field %d : Name =  '%s', ", iIndex,
                (LPCSTR)pFld->GetName());
            _variant_t FldVal = pFld->GetValue();

            // Because Value is the default property of a
            // Property object,the use of the actual keyword
            // here is optional.
            switch(FldVal.vt)
            {
                case (VT_BOOL):
                    if(FldVal.boolVal)
                    {
                        printf("Value = 'True'");
                    }
                    else
                    {
                        printf("Value = 'False'");
                    }
                    printf("\n");
                    break;
                case (VT_BSTR):
                    printf("Value = '%s'",
                        (LPCSTR)(_bstr_t)FldVal.bstrVal);
                    printf("\n");
                    break;
                case (VT_I4):
                    printf("Value = '%s'",(LPCSTR)FldVal.iVal);
                    printf("\n");
                    break;
                case (VT_EMPTY):
                    printf("Value = '%s'",(LPCSTR)FldVal.lVal);
                    printf("\n");
                    break;
                default:
                    break;
            }
        }

        printf("\nThe Fields collection accessed by name...\n");
        pRst->MoveFirst();
        for (iIndex = 0; iIndex <= 8; iIndex++)
        {
            intLineCnt++;
            if (intLineCnt%15 == 0)
            {
                printf("\nPress any key to continue...\n");
                getch();
            }
            pFld = pRst->Fields->GetItem(Column[iIndex]);
            printf("Field name = '%s', ",(LPCSTR)pFld->GetName());
            _variant_t FldVal = pFld->GetValue();

            // Because Value is the default property of a
            // Property object,the use of the actual keyword
            // here is optional.
            switch(FldVal.vt)
            {
                case (VT_BOOL):
                    if(FldVal.boolVal)
                    {
                        printf("Value = 'True'");
                    }
                    else
                    {
                        printf("Value = 'False'");
                    }
                    printf("\n");
                    break;
                case (VT_BSTR):
                    printf("Value = '%s'",
                        (LPCSTR)(_bstr_t)FldVal.bstrVal);
                    printf("\n");
                    break;
                case (VT_I4):
                    printf("Value = '%s'",(LPCSTR)FldVal.iVal);
                    printf("\n");
                    break;
                case (VT_EMPTY):
                    printf("Value = '%s'",(LPCSTR)FldVal.lVal);
                    printf("\n");
                    break;
                default:
                    break;
            }
        }
        // Clean up objects before exit.
        pRst->Close();
        pConnection->Close();
   }

   catch(_com_error &e)
   {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
       PrintProviderError(pConnection);
       PrintComError(e);
   }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintProviderError Function                     //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//       PrintComError Function                         //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


MarshalOptions プロパティの例 (VC++)

この例では、MarshalOptions プロパティを使って、サーバーに送り返される行 (すべての行または修正された行のみ) を特定します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include <malloc.h>
#include "MarshalOptionsX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void MarshalOptionsX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//               Main Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    MarshalOptionsX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      Marshal Options Function                         //
//                                                       //
///////////////////////////////////////////////////////////

void   MarshalOptionsX(void)
{

    // Define string variables
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _RecordsetPtr pRstEmployees = NULL;

    // Define Other Variables
    IADORecordBinding   *picRs  = NULL;  //Interface Pointer declared
    CEmployeesRs emprs;               //C++ Class Object
    HRESULT hr = S_OK;

    try
    {
        // Open recordset with names from Employees table.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->CursorType = adOpenKeyset;
        pRstEmployees->LockType = adLockOptimistic;
        pRstEmployees->CursorLocation = adUseClient;
        pRstEmployees->Open("SELECT fname, lname FROM Employees "
            "ORDER BY lname",strCnn,
            adOpenKeyset, adLockOptimistic,adCmdText);

        // Open an IADORecordBinding interface pointer which
        // we'll use for Binding Recordset to a class.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Bind the Recordset to a C++ Class here.
        TESTHR(picRs->BindToRecordset(&emprs));

        // Store Original Data
        LPSTR strOldFirst = (LPSTR) malloc(sizeof(emprs.m_szemp_fname));
        LPSTR strOldLast  = (LPSTR) malloc(sizeof(emprs.m_szemp_lname));
        strcpy(strOldFirst,strtok(emprs.m_szemp_fname," "));
        strcpy(strOldLast,strtok(emprs.m_szemp_lname," "));

        //Change Data in Edit Buffer
        strcpy(emprs.m_szemp_fname,"Linda");
        strcpy(emprs.m_szemp_lname,"Kobara");

        // Show contents of buffer and get user input
        printf("Edit in Progress:\n");
        printf("Original Data = %s  %s \n",strOldFirst,strOldLast);
        printf("Data in buffer = %s  %s \n", emprs.lemp_fnameStatus ==
            adFldOK ? emprs.m_szemp_fname : "<NULL>",
            emprs.lemp_lnameStatus == adFldOK ?
            emprs.m_szemp_lname : "<NULL>");
        printf("Use Update to replace the original data with the "
            "buffered data in the Recordset?\nEnter (y/n) :?");
        char opt1=getch();

        if(toupper(opt1)=='Y')
        {
                printf("\nWould you like to send all the rows in "
                    "the recordset back to the server?\nEnter (y/n):");
                char opt2 = getch();
                if(toupper(opt2) == 'Y')
                {
                    {
                        pRstEmployees->MarshalOptions = adMarshalAll;
                        picRs->Update(&emprs);
                    }
                }
                else
                {
                    printf("\nWould you like to send only modified "
                        "rows back to the server?\nEnter (y/n):");
                    char opt3=getch();
                    if(toupper(opt3) == 'Y')
                        {
                            pRstEmployees->MarshalOptions =
                                adMarshalModifiedOnly;
                            picRs->Update(&emprs);
                        }
                }
        }
        // Show the resulting data
        printf("\nData In the Recordset = %s  %s\n",
            emprs.lemp_fnameStatus == adFldOK ?
            emprs.m_szemp_fname : "<NULL>",
            emprs.lemp_lnameStatus == adFldOK ?
            emprs.m_szemp_lname : "<NULL>");

        // Restore original data because this is a demonstration
        if((strcmp(strOldFirst,emprs.m_szemp_fname)) &&
           (strcmp(strOldLast,emprs.m_szemp_lname)))
        {
            strcpy(emprs.m_szemp_fname,strOldFirst);
            strcpy(emprs.m_szemp_lname,strOldLast);
            picRs->Update(&emprs);
        }
        // Deallocate memory
        free(strOldFirst);
        free(strOldLast);

        // Release IADORecordset Interface
        if (picRs)
            picRs->Release();

        // Clean up objects before exit.
        pRstEmployees->Close();
    }

    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr     pErr   = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

     // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

MarshalOptionsX.h:

// MarshalOptionsX.h

#include "icrsint.h"

//This Class extracts only fname,lname from employees table
class CEmployeesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeesRs)
    //Column fname is the 1st field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szemp_fname,
         sizeof(m_szemp_fname), lemp_fnameStatus, TRUE)

     //Column lname is the 2nd field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szemp_lname,
         sizeof(m_szemp_lname), lemp_lnameStatus, TRUE)

END_ADO_BINDING()

public:
   CHAR   m_szemp_fname[21];
   ULONG   lemp_fnameStatus;
   CHAR   m_szemp_lname[31];
   ULONG   lemp_lnameStatus;
};


MaxRecords プロパティの例 (VC++)

次の例では、MaxRecords プロパティを使って、Titles テーブル中の最も高価な 10 タイトルを含む Recordset を開きます。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll"\
    no_namespace rename("EOF","EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "MaxRecordsX.h"

// Function Declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void MaxRecordsX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////////
//                                                          //
//                        Main Function                     //
//                                                          //
//////////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    MaxRecordsX();

    ::CoUninitialize();
}

//   MaxRecordsX()  Function
void  MaxRecordsX(void)
{
    // Define ADO ObjectPointers
    // Initialize Pointers on define
    // These are in the ADODB :: namespace
    _RecordsetPtr pRstTemp    = NULL;

    // Define Other Variables
    IADORecordBinding *picRs  = NULL;   // Interface Pointer Declared
    CTitlesRs titlers;            // C++ Class Object
    HRESULT hr = S_OK;

    try
    {
        //Assign Connection String to Variable
        _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
                    "Initial Catalog=Pubs;User Id=sa;Password=;");

        // Open Recordset containing the 10 most expensive titles in the
        // Titles table.
        TESTHR(pRstTemp.CreateInstance(__uuidof(Recordset)));

        pRstTemp->MaxRecords=10;

        pRstTemp->Open("SELECT title,price FROM Titles "
            "ORDER BY Price DESC",strCnn,adOpenForwardOnly,
            adLockReadOnly,adCmdText);

        // Open an IADORecordBinding interface pointer which
        // we will use for binding Recordset to a class
        TESTHR(pRstTemp->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Bind the Recordset to a C++ class here
        TESTHR(picRs->BindToRecordset(&titlers));

        // Display the contents of the Recordset
        printf("Top Ten Titles by Price:\n\n");

        while(!(pRstTemp->EndOfFile))
        {
            printf("%s ---  %6.2lf\n\n",titlers.lau_TitleStatus ==
                adFldOK ? titlers.m_szau_Title : "<NULL>",
                    titlers.lau_PriceStatus == adFldOK ?
                    titlers.m_szau_Price : 0.00);
            pRstTemp->MoveNext();
        }
        // Clean up objects before exit.
        pRstTemp->Close();
        if(picRs)
            picRs->Release();
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstTemp->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
};

//////////////////////////////////////////////////////////////
//                                                          //
//                  PrintProviderError Function             //
//                                                          //
//////////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    //Print Provider Errors from Connection object
    //pErr is a record object in the Connection's Error collection
    ErrorPtr    pErr = NULL;

    if((pConnection->Errors->Count)>0)
    {
        long nCount = pConnection->Errors->Count;

        //Collection ranges from 0 to nCount-1
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error Number :%x \t %s",pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

MaxRecordsX.h:

// MaxRecordsX.h

#include "icrsint.h"

// This class extracts titles and type from the Titles table

class CTitlesRs : public CADORecordBinding
{
    BEGIN_ADO_BINDING(CTitlesRs)
        // Column title is the 1st field in the Recordset
        ADO_VARIABLE_LENGTH_ENTRY2(1,adVarChar,m_szau_Title,
            sizeof(m_szau_Title),lau_TitleStatus,FALSE)
        // Column price is the 2nd field in the Recordset
        ADO_VARIABLE_LENGTH_ENTRY2(2,adDouble,m_szau_Price,
            sizeof(m_szau_Price),lau_PriceStatus,FALSE)
END_ADO_BINDING()

public:
    CHAR m_szau_Title[81];
    ULONG lau_TitleStatus;
    DOUBLE m_szau_Price;
    ULONG lau_PriceStatus;
};


Move メソッドの例 (VC++)

この例では、Move メソッドを使って、ユーザーの入力に基づいてレコード ポインタを配置します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <stdlib.h>
#include <conio.h>
#include "MoveX.h"

// Function Declaration.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void MoveX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    MoveX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////
//                                              //
//      MoveX Function                          //
//                                              //
//////////////////////////////////////////////////

void MoveX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstAuthors    = NULL;

    // Define Other Variables
    IADORecordBinding   *picRs = NULL;  //Interface Pointer declared
    CAuthorsRs    authorsrs;         //C++ class object
    HRESULT hr = S_OK;

    // Open Authors table
    _bstr_t strCnn("Provider=sqloledb;Data Source=SRV;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Open recordset from Authors table.
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        pRstAuthors->CursorType = adOpenStatic;
        // Use client cursor to allow use of AbsolutePosition property.
        pRstAuthors->CursorLocation = adUseClient;

        pRstAuthors->Open("SELECT au_id, au_fname, au_lname, city, "
            "state FROM Authors ORDER BY au_lname", strCnn, adOpenStatic,
            adLockReadOnly, adCmdText);

        // Open an IADORecordBinding interface pointer which we'll use
        // for Binding Recordset to a class.
        TESTHR(pRstAuthors->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Bind the Recordset to a C++ Class here.
        TESTHR(picRs->BindToRecordset(&authorsrs));

        pRstAuthors->MoveFirst();

        while(true)
        {
            // Display information about current record and ask how many
            // records to move.
            printf("Record %ld of %d\n", pRstAuthors->AbsolutePosition,
                pRstAuthors->RecordCount);
            printf("Author: %s %s\n",
                authorsrs.lemp_fnameStatus == adFldOK ?
                authorsrs.m_au_fname : "<NULL>",
                authorsrs.lemp_lnameStatus == adFldOK ?
                authorsrs.m_au_lname : "<NULL>");
            printf("Location: %s, %s\n\n",
                authorsrs.lemp_cityStatus == adFldOK ?
                authorsrs.m_au_city : "<NULL>",
                authorsrs.lemp_stateStatus == adFldOK ?
                authorsrs.m_au_state : "<NULL>");

            char *strMove;
            char strTemp[5];
            printf("Enter number of records to Move "
                "\n(positive or negative, Enter to quit): ");
            gets(strTemp);

            strMove = strtok(strTemp," ");

            if (strMove == NULL)
                break;

            // if the input is not numeric then notify the user.
            if(!atol(strMove))
            {
                printf("Expecting numeric value...\n");
                continue;
            }

            // Store bookmark in case the Move goes too far
            // forward or backward.
            _variant_t varBookmark = pRstAuthors->Bookmark;

            // Move method requires parameter of data type Long.
            long lngMove = atol(strMove);

            pRstAuthors->Move(lngMove);

            // Trap for BOF or EOF.
            if(pRstAuthors->BOF)
            {
                printf("Too far backward! Returning to current"
                    " record.\n");
                pRstAuthors->Bookmark = varBookmark;
            }

            if(pRstAuthors->EndOfFile)
            {
                printf("Too far forward! Returning to current"
                    " record.\n");
                pRstAuthors->Bookmark = varBookmark;
            }
        }
        // Clean up objects before exit.
        pRstAuthors->Close();
        // Release the IADORecordset Interface here.
        if (picRs)
            picRs->Release();
    }

    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                 (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

MoveX.h:

// MoveX.h

#include "icrsint.h"

// This Class extracts fname, lname, city and state
// from the "Authors" table.

class CAuthorsRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CAuthorsRs)

    // Column au_id is the 1st field in the recordset

    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_au_fname,
         sizeof(m_au_fname), lemp_fnameStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_au_lname,
         sizeof(m_au_lname), lemp_lnameStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_au_city,
         sizeof(m_au_city), lemp_cityStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(5, adChar, m_au_state,
         sizeof(m_au_state), lemp_stateStatus, TRUE)

END_ADO_BINDING()

public:
    char     m_au_fname[21];
    ULONG    lemp_fnameStatus;
    char     m_au_lname[41];
    ULONG    lemp_lnameStatus;
    char     m_au_city[21];
    ULONG    lemp_cityStatus;
    char     m_au_state[3];
    ULONG    lemp_stateStatus;
};


MoveFirst、MoveLast、MoveNext、MovePrevious メソッドの例 (VC++)

この例では、与えられたコマンドに基づいて Recordset のレコード ポインタを移動するのに、MoveFirst、MoveLast、MoveNext、および MovePrevious メソッドを使います。この例を実行するには、MoveAny 関数が必要です。

#include <ole2.h>
#include <stdio.h>

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void MoveFirstX();
void MoveAny(int intChoice, _RecordsetPtr pRstTemp);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

/////////////////////////////////
//      Main Function          //
/////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    MoveFirstX();

    ::CoUninitialize();
}

//////////////////////////////////////
//      MoveFirstX Function         //
//////////////////////////////////////

void MoveFirstX()
{
    HRESULT    hr = S_OK;
    _RecordsetPtr    pRstAuthors  = NULL;
    _bstr_t     strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");
    _bstr_t strMessage("UPDATE Titles SET Type = "
            "'psychology' WHERE Type = 'self_help'");
    int intCommand = 0;

    // Temporary string variable for type conversion for printing.
    _bstr_t  bstrFName;
    _bstr_t  bstrLName;

    try
    {
        // Open recordset from Authors table.
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));
        pRstAuthors->CursorType = adOpenStatic;

        // Use client cursor to enable AbsolutePosition property.
        pRstAuthors->CursorLocation = adUseClient;
        pRstAuthors->Open("Authors", strCnn, adOpenStatic,
            adLockBatchOptimistic, adCmdTable);

        // Show current record information and get user's method choice.
        while (true)  // Continuous loop.
        {
            // Convert variant string to convertable string type.
            bstrFName = pRstAuthors->Fields->Item["au_fName"]->Value;
            bstrLName = pRstAuthors->Fields->Item["au_lName"]->Value;

            printf("Name: %s %s\n Record %d of %d\n\n",
                (LPCSTR) bstrFName,
                (LPCSTR) bstrLName,
                pRstAuthors->AbsolutePosition,
                pRstAuthors->RecordCount);
            printf("[1 - MoveFirst, 2 - MoveLast, \n");
            printf(" 3 - MoveNext, 4 – MovePrevious, 5 - Quit]\n");

            scanf("%d", &intCommand);

            if ((intCommand < 1) || (intCommand > 4))
                break;   // Out of range entry exits program loop.

            // Call method based on user's input.
            MoveAny(intCommand, pRstAuthors);
        }

        pRstAuthors->Close();
    }
    catch (_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

/////////////////////////////////
//      MoveAny Function       //
/////////////////////////////////

void MoveAny(int intChoice, _RecordsetPtr pRstTemp)
{
    // Use specified method, trapping for BOF and EOF
    try
    {
        switch(intChoice)
        {
            case 1:
                pRstTemp->MoveFirst();
                break;
            case 2:
                pRstTemp->MoveLast();
                break;
            case 3:
                pRstTemp->MoveNext();
                if (pRstTemp->EndOfFile)
                {
                    printf("\nAlready at end of recordset!\n");
                    pRstTemp->MoveLast();
                }    //End If
                break;
            case 4:
                pRstTemp->MovePrevious();
                if (pRstTemp->BOF)
                {
                    printf("\nAlready at beginning of recordset!\n");
                    pRstTemp->MoveFirst();
                }
                break;
            default:
                ;
        }
    }

    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstTemp->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

////////////////////////////////////////////
//      PrintProviderError Function       //
////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.

    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount - 1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////
//      PrintComError Function      //
//////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


NextRecordset メソッドの例 (VC++)

この例では、NextRecordset メソッドを使って、3 つに分割された SELECT ステートメントからなる複合コマンド ステートメントを使用する、レコードセット内のデータを参照します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include <stdlib.h>

//Function Declaration.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void NextRecordsetX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    NextRecordsetX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////
//                                              //
//      NextRecordsetX Function                 //
//                                              //
//////////////////////////////////////////////////

void NextRecordsetX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr    pRstCompound = NULL;

    // Define Other Variables
    HRESULT hr = S_OK;
    _variant_t index;
    index.vt = VT_I2;

    // Assign connection string to a variable.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Open recordset from Authors table.
        TESTHR(pRstCompound.CreateInstance(__uuidof(Recordset)));

        // Pass the Cursor type and Lock type to the Recordset.
        pRstCompound->Open("SELECT * FROM Authors;SELECT * FROM stores;"
            "SELECT * FROM jobs", strCnn, adOpenForwardOnly,
            adLockReadOnly, adCmdText);

        // Display results from each SELECT statement.
        int intCount = 1;
        while(!(pRstCompound==NULL))
        {
            printf("\n\nContents of recordset #%d\n", intCount);

            while(!pRstCompound->EndOfFile)
            {
                index.iVal = 0;
                printf("%s\t", (LPCSTR)(_bstr_t)pRstCompound->\
                            GetFields()->GetItem(& index)->Value);
                index.iVal = 1;
                printf("%s\n", (LPCSTR)(_bstr_t)pRstCompound->\
                                Fields->GetItem(& index)->Value);

                pRstCompound->MoveNext();

                int intLine = intLine + 1;
                if (intLine % 22 == 0)
                {
                    printf("\nPress any key to continue...");
                    getch();

                    //Clear the screen for the next display.
                    system("cls");
                }
            }
            long    lngRec = 0;
            pRstCompound = pRstCompound->
                NextRecordset((VARIANT *)lngRec);

            printf("\nPress any key to continue...");
            getch();
            intCount = intCount + 1;
        }
    }

    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstCompound->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


NumericScale、Precision プロパティの例 (VC++)

この例では、NumericScale プロパティおよび Precision プロパティを使って、Pubs データベースの Discounts テーブル内にあるフィールドの小数点の桁数と精度を表示します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void NumericScaleX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    NumericScaleX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      NumericScaleX Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void NumericScaleX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _RecordsetPtr  pRstDiscounts  = NULL;
     FieldsPtr  fldTemp  = NULL;

    //Define Other Variables
    HRESULT  hr = S_OK;
    _variant_t Index;
    Index.vt = VT_I2;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
         "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Open recordset.
        TESTHR(pRstDiscounts.CreateInstance(__uuidof(Recordset)));
        pRstDiscounts->Open("Discounts", strCnn, adOpenForwardOnly,
            adLockReadOnly, adCmdTable);

        // Display numeric scale and precision of
        // numeric and small integer fields.
        fldTemp = pRstDiscounts->GetFields();

        for (int intLoop=0;intLoop < (int)fldTemp->GetCount();intLoop++)
        {
            Index.iVal = intLoop;

            if ((fldTemp->GetItem(Index)->Type == adNumeric)
                || (fldTemp->GetItem(Index)->Type == adSmallInt))
            {
                printf("Field: %s\n" ,(LPCSTR)fldTemp->
                    GetItem(Index)->GetName());
                printf("Numeric scale: %d\n", fldTemp->
                    GetItem(Index)->GetNumericScale());
                printf("Precision: %d\n", fldTemp->
                    GetItem(Index)->GetPrecision());
            }
        }
      // Clean up objects before exit.
      pRstDiscounts->Close();
    }

    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstDiscounts->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Open、Close メソッドの例 (VC++)

この例では、開かれている Recordset と Connection オブジェクトの両方に、Open メソッドと Close メソッドを使用します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <oledb.h>
#include <stdio.h>
#include <conio.h>
#include "OpenX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OpenX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OpenX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//               OpenX Function                          //
//                                                       //
///////////////////////////////////////////////////////////

void OpenX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
     _RecordsetPtr    pRstEmployees  = NULL;
     _ConnectionPtr pConnection    = NULL;

    // Define string variables.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Define Other Variables.
    HRESULT  hr = S_OK;
    IADORecordBinding   *picRs  = NULL;  // Interface Pointer declared.
    CEmployeesRs emprs;       // C++ Class object
    DBDATE varDate;

    try
    {
        // open connection and record set
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open(strCnn,"","",NULL);

        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->Open("Employees",
            _variant_t((IDispatch *)pConnection,true), adOpenKeyset,
            adLockOptimistic, adCmdTable);

        // Open an IADORecordBinding interface pointer which we'll
        // use for Binding Recordset to a class.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here.
        TESTHR(picRs->BindToRecordset(&emprs));

        // Assign the first employee record's hire date
        // to a variable, then change the hire date.
        varDate = emprs.m_sze_hiredate;
        printf("\nOriginal data\n");
        printf("\tName - Hire Date\n");
        printf("  %s  %s - %d/%d/%d\n\n",
            emprs.le_fnameStatus == adFldOK ?
            emprs.m_sze_fname : "<NULL>",
            emprs.le_lnameStatus == adFldOK ?
            emprs.m_sze_lname : "<NULL>",
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.month : 0,
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.day : 0,
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.year : 0);

        emprs.m_sze_hiredate.year=1900;
        emprs.m_sze_hiredate.month=1;
        emprs.m_sze_hiredate.day=1;
        picRs->Update(&emprs);

        printf("\nChanged data\n");
        printf("\tName - Hire Date\n");
        printf("  %s %s - %d/%d/%d\n\n",
            emprs.le_fnameStatus == adFldOK ?
            emprs.m_sze_fname : "<NULL>",
            emprs.le_lnameStatus == adFldOK ?
            emprs.m_sze_lname : "<NULL>",
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.month : 0,
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.day : 0,
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.year : 0);

        // Requery Recordset and reset the hire date.
        pRstEmployees->Requery(adOptionUnspecified);
        // Open an IADORecordBinding interface pointer which we'll
        // use for Binding Recordset to a class.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Rebind the Recordset to a C++ Class here.
        TESTHR(picRs->BindToRecordset(&emprs));
        emprs.m_sze_hiredate = varDate;
        picRs->Update(&emprs);
        printf("\nData after reset\n");
        printf("\tName - Hire Date\n");
        printf("  %s %s - %d/%d/%d",emprs.le_fnameStatus == adFldOK ?
            emprs.m_sze_fname : "<NULL>",
            emprs.le_lnameStatus == adFldOK ?
            emprs.m_sze_lname : "<NULL>",
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.month : 0,
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.day : 0,
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.year : 0);

        // Clean up objects before exit.
        pRstEmployees->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

OpenX.h:

#include "icrsint.h"

// This Class extracts only fname,lastname and
// hire_date from employee table
class CEmployeesRs : public CADORecordBinding
{

BEGIN_ADO_BINDING(CEmployeesRs)

    // Column fname is the 2nd field in the table
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sze_fname,
         sizeof(m_sze_fname), le_fnameStatus, FALSE)

    // Column lname is the 4th field in the table.
   ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_sze_lname,
         sizeof(m_sze_lname), le_lnameStatus, FALSE)

    // Column hiredate is the 8th field in the table.
   ADO_VARIABLE_LENGTH_ENTRY2(8, adDBDate,m_sze_hiredate,
         sizeof(m_sze_hiredate), le_hiredateStatus, TRUE)

END_ADO_BINDING()

public:
   CHAR        m_sze_fname[21];
   ULONG    le_fnameStatus;
   CHAR        m_sze_lname[31];
   ULONG    le_lnameStatus;
   DBDATE    m_sze_hiredate;
   ULONG    le_hiredateStatus;
};


OpenSchema メソッドの例 (VC++)

この例では、OpenSchema メソッドを使って、Pubs データベース内の、それぞれのテーブルの名前と種類を表示します。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <oleauto.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OpenSchemaX(void);
void OpenSchemaX2(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OpenSchemaX();

    printf("Press any key to see the results of 2nd function...\n\n");
    getch();

    OpenSchemaX2();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      OpenSchemaX Function                             //
//                                                       //
///////////////////////////////////////////////////////////

void OpenSchemaX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection    = NULL;
    _RecordsetPtr  pRstSchema  = NULL;

    //Other Variables
    HRESULT  hr = S_OK;

//   _bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;Data //Source=C:\\Program Files\\Microsoft //Office\\Office\\Samples\\Northwind.mdb;"
//            "User Id=admin;Password=;");
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

   try
    {
        // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", NULL);

        pRstSchema = pConnection->OpenSchema(adSchemaTables);

        while(!(pRstSchema->EndOfFile))
        {
            _bstr_t table_name = pRstSchema->Fields->
                GetItem("TABLE_NAME")->Value;
            printf("Table Name: %s\n\n",(LPCSTR) table_name);
            _bstr_t table_type = pRstSchema->Fields->
                GetItem("TABLE_TYPE")->Value;
            printf("Table type: %s\n\n",(LPCSTR) table_type);
            pRstSchema->MoveNext();
            int intLine = intLine + 1;
                if (intLine % 5 == 0)
                {
                    printf("\nPress any key to continue...");
                    getch();
                    //Clear the screen for the next display
                    system("cls");
                }
        }
        // Clean up objects before exit.
        pRstSchema->Close();
        pConnection->Close();

    }

    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      OpenSchemaX2 Function                            //
//                                                       //
///////////////////////////////////////////////////////////
void OpenSchemaX2()
{
    HRESULT  hr = S_OK;
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection2    = NULL;
    _RecordsetPtr  pRstSchema  = NULL;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

   try
    {
        // Open connection.
        TESTHR(pConnection2.CreateInstance(__uuidof(Connection)));
        pConnection2->Open (strCnn, "", "", NULL);

        // Create a safearray which takes four elements,and pass it as
        // 2nd parameter in OpenSchema method.
        SAFEARRAY FAR* psa = NULL;
        SAFEARRAYBOUND rgsabound;
        _variant_t  var;
        _variant_t Array;
        rgsabound.lLbound = 0;
        rgsabound.cElements = 4;
        psa = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);
        var.vt = VT_EMPTY;
        long ix;
        ix = 0;
        SafeArrayPutElement(psa, &ix, &var);
        ix= 1;
        SafeArrayPutElement(psa, &ix, &var);
        ix = 2;
        SafeArrayPutElement(psa, &ix, &var);
        var.vt = VT_BSTR;
        char * s1 = "VIEW";
        _bstr_t str = s1;
        var.bstrVal=str;
        ix= 3;
        SafeArrayPutElement(psa, &ix, &var);
        Array.vt = VT_ARRAY|VT_VARIANT;
        Array.parray = psa;
        pRstSchema = pConnection2->OpenSchema(adSchemaTables,&Array);
        while(!(pRstSchema->EndOfFile))
        {
            printf("Table Name: %s\n\n",(LPCSTR) (_bstr_t) pRstSchema->
                Fields->GetItem("TABLE_NAME")->Value);
            printf("Table type: %s\n\n",(LPCSTR) (_bstr_t) pRstSchema->
                Fields->GetItem("TABLE_TYPE")->Value);
            pRstSchema->MoveNext();
            int intLine = intLine + 1;
                if (intLine % 5 == 0)
                {
                    printf("\nPress any key to continue...");
                    getch();
                    //Clear the screen for the next display
                    system("cls");
                }
        }
        // Clean up objects before exit.
        pRstSchema->Close();
        pConnection2->Close();
    }    // End Try statement.

    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection2);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Optimize プロパティの例 (VC++)

この例では、Field オブジェクトのダイナミック Optimize プロパティの機能を示します。Pubs データベース内の Authors テーブルの zip フィールドには、インデックスが作成されていません。zip フィールドの Optimize プロパティを True に設定すると、ADO によってインデックスが作成され、Find メソッドのパフォーマンスが向上します。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OptimizeX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//    Main Function                                     //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OptimizeX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//           OptimizeX Function                         //
//                                                      //
//////////////////////////////////////////////////////////
void OptimizeX(void)
{
    HRESULT   hr = S_OK;

    // Define string variables.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr   pRst = NULL;

    try
    {
        TESTHR(pRst.CreateInstance(__uuidof(Recordset)));

        // Enable Index creation.
        pRst->CursorLocation = adUseClient;
        pRst->Open ("SELECT * FROM Authors", strCnn,
            adOpenStatic, adLockReadOnly, adCmdText);

        // Create the index
        pRst->Fields->GetItem("zip")->Properties->
            GetItem("Optimize")->PutValue("True");

        // Find Akiko Yokomoto
        pRst->Find("zip = '94595'",1,adSearchForward);
        printf("\n%s %s    %s %s %s\n",
            (LPSTR) (_bstr_t) pRst->Fields->GetItem("au_fname")->Value,
            (LPSTR) (_bstr_t) pRst->Fields->GetItem("au_lname")->Value,
            (LPSTR) (_bstr_t) pRst->Fields->GetItem("address")->Value,
            (LPSTR) (_bstr_t) pRst->Fields->GetItem("city")->Value,
            (LPSTR) (_bstr_t) pRst->Fields->GetItem("state")->Value);

        // Delete the index
        pRst->Fields->GetItem("zip")->Properties->
            GetItem("Optimize")->PutValue("False");
        pRst->Close();
    }

    catch (_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRst->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


OriginalValue、UnderlyingValue プロパティの例 (VC++)

この例では、OriginalValue および UnderlyingValue プロパティを使って、Recordset のバッチ更新中にレコードの基になるデータが変更された場合に、メッセージを表示します。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "OriginalValueX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OriginalValueX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OriginalValueX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//            OriginalValueX Function                    //
//                                                       //
///////////////////////////////////////////////////////////

void OriginalValueX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr   pConnection    = NULL;
     FieldPtr      pFldType   = NULL;
    _RecordsetPtr   pRstTitles   = NULL;

    // Define string variables.
    _bstr_t strSQLChange("UPDATE Titles SET Type = "
            "'sociology' WHERE Type = 'psychology'");
    _bstr_t strSQLRestore("UPDATE Titles SET Type = "
            "'psychology' WHERE Type = 'sociology'");

    // Define Other Variables
    HRESULT    hr = S_OK;
    IADORecordBinding   *picRs  = NULL;  //Interface Pointer declared
    CTitlesRs titlers;        // C++ Class object

    try
    {
        _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

        // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", NULL);

        // Open Recordset for batch update.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->PutActiveConnection(
            _variant_t((IDispatch *)pConnection,true));
        pRstTitles->CursorType = adOpenKeyset;
        pRstTitles->LockType = adLockBatchOptimistic;

        // Cast Connection pointer to an IDispatch type so converted
        // to correct type of variant.
        pRstTitles->Open("Titles",
            _variant_t((IDispatch *)pConnection,true),
            adOpenKeyset, adLockBatchOptimistic, adCmdTable);

        //Open an IADORecordBinding interface pointer which
        //we'll use for Binding Recordset to a class.
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&titlers));

        // Set field object variable for Type field.
        pFldType = pRstTitles->Fields->GetItem("type");

        // Change the type of psychology titles.
        while(!(pRstTitles->EndOfFile))
        {
            if (!strcmp(strtok((char *)titlers.m_szau_Type," "),
                "psychology"))
            {
                pFldType->Value = "self_help";
            }
            pRstTitles->MoveNext();
        }

        // Simulate a change by another user by updating data
        // using a command string.
        pConnection->Execute(strSQLChange,NULL,0);

        // Check for changes.
        pRstTitles->MoveFirst();
        while(!(pRstTitles->EndOfFile))
        {
            if (strcmp(pFldType->OriginalValue.pcVal,
                pFldType->UnderlyingValue.pcVal))
            {
                printf("\n\nData has changed!");

                printf("\n\nTitle ID: %s",titlers.lau_Title_idStatus ==
                    adFldOK ? titlers.m_szau_Title_id : "<NULL>");

                printf("\n\nCurrent Value: %s",
                    (LPCSTR) (_bstr_t) pFldType->Value);
                printf("\n\nOriginal Value: %s",
                    (LPCSTR) (_bstr_t) pFldType->OriginalValue);

                printf("\n\nUnderlying Value: %s\n\n",
                    (LPCSTR) (_bstr_t) pFldType->UnderlyingValue);

                printf("Press any key to continue...");
                getch();

                system("cls");
            }
            pRstTitles->MoveNext();
        }

        // Cancel the update because this is a demonstration.
        pRstTitles->CancelBatch(adAffectAll);

        // Restore Original Values.
        pConnection->Execute(strSQLRestore,NULL,0);

        // Clean up objects before exit.
        pRstTitles->Close();
        pConnection->Close();

        //Release IADORecordset Interface
        if (picRs)
            picRs->Release();
    }

    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
};

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

OriginalValueX.h:

#include "icrsint.h"

//This class extracts title_id and type from Titles table
class CTitlesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitlesRs)
        // Column title_id is the 1st field in the Recordset
        ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szau_Title_id,
            sizeof(m_szau_Title_id), lau_Title_idStatus, FALSE)

        // Column type is the 3rd field in the Recordset
        ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_Type,
            sizeof(m_szau_Type), lau_TypeStatus, TRUE)
END_ADO_BINDING()

public:
    CHAR m_szau_Title_id[7];
    ULONG lau_Title_idStatus;
    CHAR m_szau_Type[13];
    ULONG lau_TypeStatus;
};


Prepared プロパティの例 (VC++)

この例では、一方はステートメントが準備され (またはコンパイルされて)、もう一方はステートメントが準備されていない、2 つの Command オブジェクトを開いて、Prepared プロパティの機能を示します。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <winbase.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void PreparedX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    PreparedX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PreparedX Function                               //
//                                                       //
///////////////////////////////////////////////////////////

void PreparedX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr   pConnection    =NULL;
    _CommandPtr      pCmd1    =NULL;
    _CommandPtr      pCmd2    =NULL;

    // Define string variables.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    //Define Other Variables
    HRESULT   hr = S_OK;

   try
    {
        // Open a connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", NULL);

        _bstr_t strCmd ("SELECT title,type FROM Titles ORDER BY type");

        // Create two command objects for the same
        // command - one prepared and one not prepared.
        TESTHR(pCmd1.CreateInstance(__uuidof(Command)));
        pCmd1->ActiveConnection = pConnection;
        pCmd1->CommandText = strCmd;

        TESTHR(pCmd2.CreateInstance(__uuidof(Command)));
        pCmd2->ActiveConnection = pConnection;
        pCmd2->CommandText = strCmd;
        pCmd2->PutPrepared(true);

        // Set a timer,then execute the unprepared command 20 times.
        DWORD sngStart=GetTickCount();
        for(int intLoop=1;intLoop<=20;intLoop++)
        {
            pCmd1->Execute(NULL,NULL,adCmdText);
        }
        DWORD sngEnd=GetTickCount();

        float sngNotPrepared = (float)(sngEnd - sngStart)/(float)1000;

        // Reset the timer,then execute the prepared command 20 times
        sngStart=GetTickCount();
        for(intLoop=1;intLoop<=20;intLoop++)
        {
            pCmd2->Execute(NULL,NULL,adCmdText);
        }
        sngEnd=GetTickCount();

        float sngPrepared = (float)(sngEnd - sngStart)/(float)1000;

        // Display performance results
        printf("\n\nPerformance Results:");
        printf("\n\nNot Prepared: %6.3f seconds",sngNotPrepared);
        printf("\n\nPrepared:     %6.3f seconds\n\n",sngPrepared);

        pConnection->Close();
    }

    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Provider、DefaultDatabase プロパティの例 (VC++)

この例では、異なるプロバイダを使用する 3 つの Connection オブジェクトを開くことによって、Provider プロパティの機能を示します。この例ではまた、DefaultDatabase プロパティを使って Microsoft ODBC Provider の既定のデータベースを設定します。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ProviderX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////
//                           //
//    Main Function          //
//                           //
///////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ProviderX();

    ::CoUninitialize();
}

/////////////////////////////////
//                             //
//    ProviderX Function       //
//                             //
/////////////////////////////////

void ProviderX(void)
{
    HRESULT    hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr    pConnection1    = NULL;
    _ConnectionPtr    pConnection2     = NULL;
    _ConnectionPtr    pConnection3     = NULL;

    try
    {
        // Open a Connection using the Microsoft ODBC provider.
        TESTHR(pConnection1.CreateInstance(__uuidof(Connection)));
        pConnection1->ConnectionString = "driver={SQL Server};"
            "server=dhale1;uid=sa;pwd=;";
        pConnection1->Open("","","",NULL);
        pConnection1->DefaultDatabase = "Pubs";

        // Display the provider
        printf("\n\nConnection1 provider: %s \n\n",
            (LPCSTR)pConnection1->Provider);

        // Open a connection using the OLE DB Provider for Microsoft Jet.
        TESTHR(pConnection2.CreateInstance(__uuidof(Connection)));
        pConnection2->Provider = "Microsoft.Jet.OLEDB.4.0";

        char *sConn = "c:\\Program Files\\Microsoft Office\\Office\\"
            "Samples\\Northwind.mdb";

        pConnection2->Open(sConn,"admin","",NULL);

        // Display the provider
        printf("Connection2 provider: %s \n\n",(LPCSTR)pConnection2->
            Provider);

        // Open a Connection using the Microsoft SQL Server provider.
        TESTHR(pConnection3.CreateInstance(__uuidof(Connection)));
        pConnection3->Provider = "sqloledb";
        pConnection3->Open("Data Source=dhale1;Initial Catalog=Pubs;",
            "sa","",NULL);

        // Display the provider.
        printf("Connection3 provider: %s\n\n",(LPCSTR)pConnection3->
            Provider);

        pConnection1->Close();
        pConnection2->Close();
        pConnection3->Close();
    }

    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        PrintProviderError(pConnection1);
        if(pConnection2) PrintProviderError(pConnection2);
        if(pConnection3) PrintProviderError(pConnection3);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Refresh メソッドの例 (VC++)

この例では、Refresh メソッドを使って、ストアド プロシージャ Command オブジェクトの Parameters コレクションを更新します。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "RefreshX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void RefreshX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////
//                          //
//    Main Function         //
//                          //
//////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    RefreshX();

    ::CoUninitialize();
}

////////////////////////////////////////////
//                                        //
//             RefreshX Function          //
//                                        //
////////////////////////////////////////////

void RefreshX(void)
{
    HRESULT  hr = S_OK;

    // Define string variables.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr    pConnection      = NULL;
    _CommandPtr     pCmdByRoyalty  = NULL;
    _RecordsetPtr  pRstByRoyalty  = NULL;
    _RecordsetPtr  pRstAuthors    = NULL;
    IADORecordBinding   *picRs    = NULL;  //Interface Pointer declared.
    CAuthorsRs Authorsrs;            //C++ class object
    try
    {
        // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", NULL);

        // Open a command object for a stored procedure,
        // with one parameter.
        TESTHR(pCmdByRoyalty.CreateInstance(__uuidof(Command)));
        pCmdByRoyalty->ActiveConnection = pConnection;
        pCmdByRoyalty->CommandText = "byroyalty";
        pCmdByRoyalty->CommandType = adCmdStoredProc;
        pCmdByRoyalty->Parameters->Refresh();

        // Get parameter value and execute the command,
        // storing the results in a recordset.
        char *strRoyalty;
        char strTemp[5];
        do
        {
            printf("\n\nEnter royalty : ");
            gets(strTemp);
            strRoyalty = strtok(strTemp," ");
            if(strRoyalty == NULL)
            {
                exit(1);
            }

            // if the input is not numeric then notify the user.
            if(!atoi(strRoyalty))
            {
                printf("\nExpecting numeric value...");
                continue;
            }
        }while(!atoi(strRoyalty));

        _variant_t vtroyal;
        vtroyal.vt = VT_I2;
        vtroyal.iVal = atoi(strRoyalty);
        _variant_t Index;
        Index.vt = VT_I2;
        Index.iVal = 1;
        pCmdByRoyalty->GetParameters()->GetItem(Index)->
            PutValue(vtroyal);
        pRstByRoyalty = pCmdByRoyalty->
            Execute(NULL,NULL,adCmdStoredProc);

        // Open the Authors table to get author names for display.
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));
        pRstAuthors->Open ("Authors",
            _variant_t((IDispatch *) pConnection, true),
            adOpenForwardOnly, adLockReadOnly, adCmdTable);

        //Open an IADORecordBinding interface pointer which we'll use for
        //Binding Recordset to a class.
        TESTHR(pRstAuthors->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here.
        TESTHR(picRs->BindToRecordset(&Authorsrs));

        // Print current data in the recordset,adding
        // author names from Authors table.
        printf("\n\nAuthors with %s percent royalty\n\n",strRoyalty);
        while(!(pRstByRoyalty->EndOfFile))
        {
            _bstr_t strAuthorID = pRstByRoyalty->Fields->GetItem(
                "au_id")->Value;

            printf("  %s",(LPCSTR) (_bstr_t) pRstByRoyalty->Fields->
                GetItem("au_id")->Value);

            pRstAuthors->Filter = "au_id ='"+strAuthorID+"'";
            printf(", %s %s\n\n",Authorsrs.lau_fnameStatus == adFldOK ?
                Authorsrs.m_szau_fname : "<NULL>",
                Authorsrs.lau_lnameStatus == adFldOK ?
                Authorsrs.m_szau_lname : "<NULL>");
            pRstByRoyalty->MoveNext();
        }
        pRstByRoyalty->Close();
        pRstAuthors->Close();
        pConnection->Close();
    }

    catch (_com_error &e)
    {
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

RefreshX.h

#include "icrsint.h"

//This Class extracts  lname,fname from Authors table.
class CAuthorsRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CAuthorsRs)
    // Column lname is the 2nd field in the recordset
     ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_lname,
         sizeof(m_szau_lname), lau_lnameStatus, TRUE)
    // Column fname is the 3rd field in the recordset.
   ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_fname,
         sizeof(m_szau_fname), lau_fnameStatus, TRUE)

END_ADO_BINDING()

public:
    CHAR m_szau_fname[21];
    ULONG lau_fnameStatus;
    CHAR   m_szau_lname[41];
    ULONG  lau_lnameStatus;
};


Resync メソッドの例 (VC++)

この例では、Resync メソッドを使って、静的レコードセット内のデータを更新します。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ResyncX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

/////////////////////////////
//                         //
//    Main Function        //
//                         //
/////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ResyncX();

    ::CoUninitialize();
}

/////////////////////////////////
//                             //
//     ResyncX Function        //
//                             //
/////////////////////////////////

void ResyncX(void)
{
    HRESULT  hr = S_OK;

    // Define string variables.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstTitles  = NULL;

     try
    {
        // Open recordset for Titles table.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->CursorLocation = adUseClient;
        pRstTitles->CursorType = adOpenStatic;
        pRstTitles->LockType = adLockBatchOptimistic;
        pRstTitles->Open ("Titles",strCnn,
            adOpenStatic, adLockBatchOptimistic, adCmdTable);

        // Change the type of the first title in the recordset.
        pRstTitles->Fields->GetItem("type")->Value =
            (_bstr_t) ("database");

        // Display the results of the change.
        printf("\nBefore resync: \n\n");

        printf("Title - %s\n\n",(LPSTR) (_bstr_t) pRstTitles->
            Fields->GetItem("title")->Value);

        printf("Type - %s\n\n",(LPSTR) (_bstr_t) pRstTitles->
            Fields->GetItem("type")->Value);

        // Resync with database.
        pRstTitles->Resync(adAffectAll,adResyncAllValues);

        // Display the results of the resynch.
        printf("\n\nAfter resync: \n\n");

        printf("Title - %s\n\n",(LPSTR) (_bstr_t) pRstTitles->
            Fields->GetItem("title")->Value);

        printf("Type - %s\n\n",(LPSTR) (_bstr_t) pRstTitles->
            Fields->GetItem("type")->Value);

        pRstTitles->CancelBatch(adAffectAll);
        pRstTitles->Close();
    }

    catch (_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstTitles->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Save、Open メソッドの例 (VC++)

次の 3 つの例では、Save メソッドと Open メソッドを組み合わせて使用する方法を示します。

出張先に、データベースに含まれるテーブルを持っていく必要があるとします。出かける前に Recordset としてデータにアクセスし、持ち出し可能な形式で保存します。出張先では、接続されていないローカルな Recordset としてアクセスします。Recordset への変更を加え、それを再度保存します。最終的に会社に戻ったときに、再度データベースに接続し、出張中に行った変更に関する更新を、データベースに対して行います。

#import "c:\Program Files\Common Files\system\ado\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <io.h>

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
bool FileExists(void);
void SaveX1(void);
void SaveX2(void);
void SaveX3(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//        Main Function                                 //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL))
        return;

    //If File exists in the specified directory, then display error
    if (!FileExists())
    {
        SaveX1();
        SaveX2();
        SaveX3();
    }

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//     SaveX1 Function                                  //
//                                                      //
//////////////////////////////////////////////////////////

//First, access and save the Authors table.
void SaveX1()
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstAuthors = NULL;

    //Definitions of other variables
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");
    try
    {
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        pRstAuthors->Open("SELECT * FROM Authors",strCnn,
            adOpenDynamic,adLockOptimistic,adCmdText);

        // For sake of illustration, save the Recordset to a diskette
        // in XML format.
        pRstAuthors->Save("a:\\Pubs.xml",adPersistXML);

        pRstAuthors->Close();
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//       SaveX2 Function                                //
//                                                      //
//////////////////////////////////////////////////////////
//At this point, you have arrived at your destination.
//You will access the Authors table as a local, disconnected Recordset.
//Don't forget you must have the MSPersist provider on the machine you
//are using in order to access the saved file, a:\Pubs.xml.
void SaveX2()
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstAuthors = NULL;

    try
    {
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        //For sake of illustration, we specify all parameters.
        pRstAuthors->Open("a:\\Pubs.xml","Provider=MSPersist;",
            adOpenForwardOnly,adLockOptimistic,adCmdFile);

        //Now you have a local, disconnected Recordset.
        //Edit it as you desire.
        //(In this example, the change makes no difference).
        pRstAuthors->Find("au_lname = 'Carson'",NULL,adSearchForward);
        if (pRstAuthors->EndOfFile)
        {
            printf("Name not found ...\n");
            pRstAuthors->Close();
            return;
        }
        pRstAuthors->GetFields()->GetItem("City")->PutValue("Berkeley");
        pRstAuthors->Update();

        // Save changes in ADTG format this time, purely for sake of
        // illustration. Note that the previous version is still on the
        // diskette as a:\Pubs.xml.
        pRstAuthors->Save("a:\\Pubs.adtg",adPersistADTG);

        pRstAuthors->Close();
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//   SaveX3 Function                                    //
//                                                      //
//////////////////////////////////////////////////////////
//Finally, you return home. Now update the database with
//your changes.
void SaveX3()
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstAuthors = NULL;
    _ConnectionPtr pCnn = NULL;

    //Definitions of other variables
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        TESTHR(pCnn.CreateInstance(__uuidof(Connection)));

        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        //If there is no ActiveConnection, you can open with defaults.
        pRstAuthors->Open("a:\\Pubs.adtg","Provider=MSPersist;",
            adOpenForwardOnly,adLockOptimistic,adCmdFile);

        //Connect to the database, associate the Recordset with
        //the connection, then update the database table with the
        //changed Recordset.
        pCnn->Open(strCnn,"","",NULL);

        pRstAuthors->PutActiveConnection(_variant_t((IDispatch *) pCnn));
        pRstAuthors->UpdateBatch(adAffectAll);

        pRstAuthors->Close();
        pCnn->Close();
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

bool FileExists()
{
    struct _finddata_t xml_file;
    long hFile;

    if( (hFile = _findfirst("a:\\Pubs.xml", &xml_file )) != -1L)
    {
       printf( "File already exists!\n" );
       return(true);
    }
    else
        return (false);
}


Seek メソッド、Index プロパティの例 (VC++)

この例では、Recordset オブジェクトの Seek メソッドと Index プロパティを、指定された Employee ID と連動して使って、Nwind.mdb データベースの Employees テーブル内の社員の名前を検索します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include <string.h>
#include "SeekX.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void SeekX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//       Main Function                                  //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    SeekX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//     SeekX Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void SeekX()
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.

    _RecordsetPtr pRstEmp = NULL;

    IADORecordBinding    *picRs = NULL;  // Interface Pointer declared
    CEmployeesRs EmpRs; //C++ class object

    //Definitions of other variables
    _bstr_t strPrompt("Enter an EmployeeID (e.g., 1 to 9)");
    char strEmpId[1];

    try
    {
        TESTHR(pRstEmp.CreateInstance(__uuidof(Recordset)));
        pRstEmp->CursorLocation = adUseServer;
        pRstEmp->Open("employees", "Provider=Microsoft.Jet.OLEDB.4.0;"
            "Data Source=C:\\Program Files\\Microsoft Office\\Office\\"
            "Samples\\Northwind.mdb;user id=admin;password=;",
            adOpenKeyset,adLockReadOnly,adCmdTableDirect);

        //Open an IADORecordBinding interface pointer which
        //we'll use for binding Recordset to a Class
        TESTHR(pRstEmp->QueryInterface(
            __uuidof(IADORecordBinding), (LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class
        TESTHR(picRs->BindToRecordset(&EmpRs));

        //Does this provider support Seek and Index?
        if (pRstEmp->Supports(adIndex) && pRstEmp->Supports(adSeek))
        {
            pRstEmp->Index = "EmployeeId";

            //Display all the employees.
            pRstEmp->MoveFirst();
            while (!pRstEmp->EndOfFile)
            {
                  printf("%d : %s %s\n",
                      EmpRs.le_empidStatus == adFldOK ?
                      EmpRs.m_ie_empid : 0,
                      EmpRs.le_fnameStatus == adFldOK ?
                      EmpRs.m_sze_fname : "<NULL>",
                      EmpRs.le_lnameStatus == adFldOK ?
                      EmpRs.m_sze_lname : "<NULL>");

                  pRstEmp->MoveNext();
            }
            //Prompt the user for an EmployeeID between 1 and 9.
            do
            {
                pRstEmp->MoveFirst();
                printf("\n\n%s\t",(LPCSTR) strPrompt);
                gets(strEmpId);

                //Quit if strEmpID is a zero-length string
                //(CANCEL, null, etc.)
                char *strTemp = strtok(strEmpId," \t");
                if (strTemp == NULL) break;
                if (strlen(strTemp) == 1 && atoi(strTemp) >= 1 &&
                    atoi(strTemp) <= 9)
                {
                    _variant_t strEmployeeId(strTemp);
                    pRstEmp->Seek(strEmployeeId, adSeekAfterEQ);
                    if (pRstEmp->EndOfFile)
                    {
                        printf("Employee not found.\n");
                    }
                    else
                    {
                        printf("%d : Employee='%s %s'\n",
                            EmpRs.le_empidStatus == adFldOK ?
                            EmpRs.m_ie_empid : 0,
                            EmpRs.le_fnameStatus == adFldOK ?
                            EmpRs.m_sze_fname : "<NULL>",
                            EmpRs.le_lnameStatus == adFldOK ?
                            EmpRs.m_sze_lname : "<NULL>");
                    }
                }
            }
            while(true);
        }

        //Release IADORecordset Interface
        if (picRs)
            picRs->Release();

        // Clean up objects before exit.
        pRstEmp->Close();
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstEmp->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

SeekX.h

#include "icrsint.h"

// This Class extracts only EmployeeId,FirstName and LastName
// from Employees table
class CEmployeesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeesRs)

   // Column hiredate is the 1st field in the table.
   ADO_VARIABLE_LENGTH_ENTRY2(1, adInteger,m_ie_empid,
        sizeof(m_ie_empid), le_empidStatus, FALSE)

    // Column LastName is the 2nd field in the table.
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sze_lname,
         sizeof(m_sze_lname), le_lnameStatus, FALSE)

    // Column FirstName is the 3rd field in the table.
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sze_fname,
         sizeof(m_sze_fname), le_fnameStatus, FALSE)
END_ADO_BINDING()

public:
   INT    m_ie_empid;
   ULONG  le_empidStatus;
   CHAR    m_sze_fname[11];
   ULONG  le_fnameStatus;
   CHAR    m_sze_lname[21];
   ULONG  le_lnameStatus;
};


Sort プロパティの例 (VC++)

この例では、Recordset オブジェクトの Sort プロパティを使って、Pubs データベースの Authors テーブルから派生した Recordset の行を並べ替えます。二次ユーティリティ ルーチンで各行を出力します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void SortX(void);
void SortXprint(_bstr_t title, _RecordsetPtr rstp);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//    Main Function                                     //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    SortX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        SortX Function                                //
//                                                      //
//////////////////////////////////////////////////////////
void SortX(void)
{
    HRESULT  hr = S_OK;

    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection      = NULL;
    _RecordsetPtr  pRstAuthors    = NULL;

    // Define string variables.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        pRstAuthors->CursorLocation = adUseClient;
        pConnection->Open (strCnn, "", "", NULL);
        pRstAuthors->Open("SELECT * FROM Authors",
            _variant_t((IDispatch *) pConnection),
            adOpenStatic, adLockReadOnly, adCmdText);

        SortXprint("    Initial Order    ", pRstAuthors);

        //Clear the screen for the next display.
        printf("\nPress any key to continue...");
        getch();
        system("cls");

        pRstAuthors->Sort = "au_lname ASC, au_fname ASC";
        SortXprint("Last Name Ascending", pRstAuthors);

        //Clear the screen for the next display.
        printf("\nPress any key to continue...");
        getch();
        system("cls");

        pRstAuthors->Sort = "au_lname DESC, au_fname ASC";
        SortXprint("Last Name Descending", pRstAuthors);

        // Clean up objects before exit.
        pRstAuthors->Close();
        pConnection->Close();
    }
    catch(_com_error &e)
    {
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//        SortXprint Function                           //
//                                                      //
//////////////////////////////////////////////////////////
//This is the secondary utility routine that prints
//the given title, and the contents of the specified Recordset.
void SortXprint(_bstr_t title, _RecordsetPtr rstp)
{
    printf("---------------%s---------------\n", (LPCSTR)title);
    printf("First Name  Last Name\n"
        "---------------------------------------------------\n");
    rstp->MoveFirst();
    int intLineCnt = 4;
    while (!(rstp->EndOfFile))
    {
        _bstr_t aufname;
        _bstr_t aulname;
        aufname = rstp->GetFields()->GetItem("au_fname")->Value;
        aulname = rstp->GetFields()->GetItem("au_lname")->Value,
        printf("%s    %s\n",(LPCSTR) aufname, (LPCSTR) aulname);
        rstp->MoveNext();
        intLineCnt++;
        if (intLineCnt % 20 ==0)
            {
                printf("\nPress any key to continue...\n");
                getch();
            }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//     PrintProviderError Function                      //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Errors collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//  PrintComError Function                              //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);

}


Source プロパティの例 (VC++)

この例では、異なるデータ ソースに基づく 3 つの Recordset オブジェクトを開いて、Source プロパティの機能を示します。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void SourceX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////
//                       //
//    Main Function      //
//                       //
///////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    SourceX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//    SourceX Function                       //
//                                           //
///////////////////////////////////////////////
void SourceX(void)
{
   HRESULT  hr = S_OK;

   // Define string variables.
   _bstr_t strCmdSQL("Select title,type,pubdate "
            "FROM Titles ORDER BY title");
   _bstr_t strSQL("SELECT title_ID AS TitleID, title AS Title, "
            "publishers.pub_id AS PubID, pub_name AS PubName "
            "FROM publishers INNER JOIN titles "
            "ON publishers.pub_id = Titles.pub_id "
            "ORDER BY Title");
   _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
   _ConnectionPtr  pConnection          = NULL;
   _RecordsetPtr  pRstTitles        = NULL;
   _RecordsetPtr  pRstPublishers      = NULL;
   _RecordsetPtr  pRstPublishersDirect    = NULL;
   _RecordsetPtr  pRstTitlesPublishers    = NULL;
   _CommandPtr     pCmdSQL          = NULL;

     try
    {
        // Open a connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", NULL);

        // Open a recordset based on a command object.
        TESTHR(pCmdSQL.CreateInstance(__uuidof(Command)));
        pCmdSQL->ActiveConnection = pConnection;
        pCmdSQL->CommandText = strCmdSQL;
        pRstTitles = pCmdSQL->Execute(NULL,NULL,adCmdText);

        // Open a recordset based on a a table.
        TESTHR(pRstPublishers.CreateInstance(__uuidof(Recordset)));
        pRstPublishers->Open ("publishers",
            _variant_t((IDispatch *) pConnection, true),
            adOpenForwardOnly, adLockReadOnly, adCmdTable);

        // Open a recordset based on a table.
        TESTHR(pRstPublishersDirect.CreateInstance(
            __uuidof(Recordset)));
        pRstPublishersDirect->Open ("publishers",
            _variant_t((IDispatch *) pConnection, true),
            adOpenForwardOnly, adLockReadOnly, adCmdTableDirect);

        // Open a recordset based on an SQL string.
        TESTHR(pRstTitlesPublishers.CreateInstance(
            __uuidof(Recordset)));
        pRstTitlesPublishers->Open(strSQL,
            _variant_t((IDispatch *) pConnection, true),
            adOpenForwardOnly, adLockReadOnly, adCmdText);

        // Use the Source property to display the source of
        // each recordset.
        printf("rstTitles source: \n%s\n\n",
            (LPCSTR)(_bstr_t) pRstTitles->GetSource().bstrVal);
        printf("rstPublishers source: \n%s\n\n",
            (LPCSTR)(_bstr_t) pRstPublishers->GetSource().bstrVal);
        printf("rstPublishersDirect source: \n%s\n\n",
            (LPCSTR)(_bstr_t) pRstPublishersDirect->GetSource().bstrVal);
        printf("rstTitlesPublishers source: \n%s\n\n",
            (LPCSTR)(_bstr_t) pRstTitlesPublishers->GetSource().bstrVal);

        pRstTitles->Close();
        pRstPublishers->Close();
        pRstPublishersDirect->Close();
        pRstTitlesPublishers->Close();
        pConnection->Close();
    }
    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintProviderError Function            //
//                                           //
///////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Errors collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintComError Function                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);

}


State プロパティの例 (VC++)

この例では、State プロパティを使って、非同期接続が開かれ非同期コマンドが実行している間、メッセージを表示します。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void StateX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////
//                                           //
//    Main Function                          //
//                                           //
///////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    StateX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//        StateX Function                    //
//                                           //
///////////////////////////////////////////////
void StateX(void)
{
    HRESULT  hr = S_OK;

    // Define string variables.
    _bstr_t strSQLChange("UPDATE Titles SET Type = "
            "'self_help' WHERE Type = 'psychology'");
    _bstr_t strSQLRestore("UPDATE Titles SET Type = "
            "'psychology' WHERE Type = 'self_help'");
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr    pConnection        = NULL;
    _ConnectionPtr    pConnection2        = NULL;
    _CommandPtr         pCmdChange    = NULL;
    _CommandPtr         pCmdRestore    = NULL;

    try
    {
        // Open two asynchronous connections,displaying
        // a message while connecting.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        TESTHR(pConnection2.CreateInstance(__uuidof(Connection)));

        pConnection->Open (strCnn, "", "", adAsyncConnect);
        while(pConnection->State == adStateConnecting)
        {
            printf("Opening first connection....\n\n");
        }

        pConnection2->Open (strCnn, "", "", adAsyncConnect);
        while(pConnection2->State == adStateConnecting)
        {
            printf("Opening second connection....\n\n");
        }

        // Create two command objects.
        TESTHR(pCmdChange.CreateInstance(__uuidof(Command)));
        pCmdChange->ActiveConnection = pConnection;
        pCmdChange->CommandText = strSQLChange;

        TESTHR(pCmdRestore.CreateInstance(__uuidof(Command)));
        pCmdRestore->ActiveConnection = pConnection2;
        pCmdRestore->CommandText = strSQLRestore;

        // Executing the commands,displaying a message
        // while they are executing.
        pCmdChange->Execute(NULL,NULL,adAsyncExecute);
        while(pCmdChange->State == adStateExecuting)
        {
            printf("Change command executing...\n\n");
        }

        pCmdRestore->Execute(NULL,NULL,adAsyncExecute);
        while(pCmdRestore->State == adStateExecuting)
        {
            printf("Restore command executing...\n\n");
        }

        pConnection->Close();
        pConnection2->Close();
    }
    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintProviderError Function            //
//                                           //
///////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Errors collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintComError Function                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Status プロパティの例 (VC++)

この例では、Status プロパティを使って、バッチ更新の前にバッチ操作で修正されたレコードを表示します。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "StatusX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void StatusX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////
//                                           //
//    Main Function                          //
//                                           //
///////////////////////////////////////////////

void main()
{
    if(FAILED(CoInitialize(NULL)))
        return;

    StatusX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//    StatusX Function                       //
//                                           //
///////////////////////////////////////////////
void StatusX(void)
{
    HRESULT  hr = S_OK;

    // Define string variables.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
     IADORecordBinding *picRs    = NULL;  // Interface Pointer Declared
     CTitleRs titlers;           // C++ Class Object
    _RecordsetPtr  pRstTitles    = NULL;
    LPSTR p_TempStr        = NULL;

       try
    {
        // Open recordset for batch update
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->CursorType = adOpenKeyset;
        pRstTitles->LockType = adLockBatchOptimistic;
        pRstTitles->Open ("Titles", strCnn,
            adOpenKeyset, adLockBatchOptimistic, adCmdTable);

        // Open an IADORecordBinding interface pointer which
        // we will use for binding Recordset to a class.
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Bind the Recordset to a C++ class here
        TESTHR(picRs->BindToRecordset(&titlers));

        p_TempStr = (LPSTR) malloc(sizeof(titlers.m_szt_Type));

        // Change the type of psychology titles.
        while(!(pRstTitles->EndOfFile))
        {
            // Remove blank string(trim)
            strcpy(p_TempStr,strtok(titlers.m_szt_Type," "));

            // Compare the type of psychology titles
            if (!strcmp(p_TempStr,"psychology"))
            {
                    // Copy "self_help" title field
                    pRstTitles->Fields->GetItem("type")->Value =
                        (_bstr_t) ("self_help");
            }
            pRstTitles->MoveNext();
        }

        // Display Title ID and status
        pRstTitles->MoveFirst();
        while(!(pRstTitles->EndOfFile))
        {
            if(pRstTitles->Status == adRecModified)
            {
                printf("%s - Modified\n",titlers.lt_Title_idStatus ==
                    adFldOK ? titlers.m_szt_Title_id : "<NULL>");
            }
            else
            {
                printf("%s\n",titlers.lt_Title_idStatus == adFldOK ?
                    titlers.m_szt_Title_id : "<NULL>");
            }
            pRstTitles->MoveNext();
        }

        // Deallocate the memory
        free(p_TempStr);

        // Cancel the update because this is a demonstration.
        pRstTitles->CancelBatch(adAffectAll);
        pRstTitles->Close();
    }
    catch (_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstTitles->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintProviderError Function            //
//                                           //
///////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection’s Errors collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintComError Function                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

StatusX.h

#include "icrsint.h"

//This class extracts title_id and type from Titles table.
class CTitleRs : public CADORecordBinding
{
    BEGIN_ADO_BINDING(CTitleRs)
        // Column title_id is the 1st field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(1,adVarChar,m_szt_Title_id,
            sizeof(m_szt_Title_id),lt_Title_idStatus,FALSE)
        // Column type is the 3rd field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(3,adVarChar,m_szt_Type,
            sizeof(m_szt_Type),lt_TypeStatus,TRUE)
END_ADO_BINDING()

public:
    CHAR m_szt_Title_id[7];
    ULONG lt_Title_idStatus;
    CHAR m_szt_Type[13];
    ULONG lt_TypeStatus;
};


StayInSync プロパティの例 (VC++)

この例では、階層 Recordset 内の行へのアクセスを簡単にする StayInSync プロパティの機能を示します。

外側のループで、各 author の姓名、州、および ID が表示されます。各行に追加された Recordset が Fields コレクションから取得され、StayInSync プロパティによって、親のRecordset が新しい行に移動するたびに、自動的に rstTitleAuthor に割り当てられます。内側のループで、追加されたレコードセットの各行から 4 つのフィールドが表示されます。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void StayInSyncX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//        Main Function                                 //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    StayInSyncX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       StayInSyncX Function                           //
//                                                      //
//////////////////////////////////////////////////////////
void StayInSyncX(void)
{
    HRESULT  hr = S_OK;

    // Define string variables.
    _bstr_t strCnn("Provider=MSDataShape;Data Provider=sqloledb;"
        "Data Source=dhale1;Initial Catalog=Pubs;User Id=sa;Password=;");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection      = NULL;
    _RecordsetPtr  pRst      = NULL;
    _RecordsetPtr  pRstTitleAuthors    = NULL;

    try
    {
        TESTHR(pRstTitleAuthors.CreateInstance(__uuidof(Recordset)));

        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        TESTHR(pRst.CreateInstance(__uuidof(Recordset)));

        // Open connection.
        pConnection->Open (strCnn, "", "", NULL);
        pRst->PutStayInSync(true);

        // Open recordset with names from Authors & titleauthor table.
        pRst->Open("SHAPE  {select * from Authors} "
              "APPEND ({select * from titleauthor}"
              "RELATE au_id TO au_id) AS chapTitleAuthor",
              _variant_t((IDispatch*)pConnection,true),
            adOpenStatic, adLockReadOnly, adCmdText);

        pRstTitleAuthors = pRst->GetFields()->GetItem("chapTitleAuthor")->
            Value;
        int intLineCnt=0;
        while(!(pRst->EndOfFile))
        {
            printf("\n%s  %s  %s    %s\n", (LPCSTR)(_bstr_t)pRst->
               Fields->GetItem("au_fname")->Value,
               (LPCSTR)(_bstr_t)pRst->Fields->GetItem("au_lname")->Value,
               (LPCSTR)(_bstr_t)pRst->Fields->GetItem("state")->Value,
               (LPCSTR)(_bstr_t)pRst->Fields->GetItem("au_id")->Value);
            intLineCnt++;

            if (intLineCnt%15 == 0)
            {
                printf("\nPress any key to continue...\n");
                getch();
            }

            _variant_t vIndex;
            while(!(pRstTitleAuthors->EndOfFile))
            {
                vIndex = (short) 0;
                printf("%s    ",(LPCSTR)(_bstr_t)pRstTitleAuthors->
                    Fields->Item[&vIndex]->Value);
                vIndex = (short) 1;
                printf("%s    ",(LPCSTR)(_bstr_t)pRstTitleAuthors->
                    Fields->Item[&vIndex]->Value);
                vIndex = (short) 2;
                printf("%s    ",(LPCSTR)(_bstr_t)pRstTitleAuthors->
                    Fields->Item[&vIndex]->Value);
                vIndex = (short) 3;
                printf("%s\n",(LPCSTR)(_bstr_t)pRstTitleAuthors->
                    Fields->Item[&vIndex]->Value);
                intLineCnt++;

                if (intLineCnt%15 == 0)
                {
                    printf("\nPress any key to continue...\n");
                    getch();
                }
                pRstTitleAuthors->MoveNext();
            }
            pRst->MoveNext();
        }
        // Clean up objects before exit.
        pRst->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Recordset.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//        PrintProviderError Function                   //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection’s Errors collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//     PrintComError Function                           //
//                                                      //
//////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{

    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);

}


Supports メソッドの例 (VC++)

この例では、Supports メソッドを使って、異なるカーソル タイプで開かれたレコードセットによってサポートされるオプションを表示します。この例を実行するには、DisplaySupport 関数が必要です。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
        no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>

//Function Declarations.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void SupportsX(void);
void DisplaySupport(_RecordsetPtr pRstTemp);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////
//                                           //
//    Main Function                          //
//                                           //
///////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    SupportsX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//    SupportsX Function                     //
//                                           //
///////////////////////////////////////////////
void SupportsX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstTitles  = NULL;

    // Define Other Variables
    HRESULT hr = S_OK;

    // Assign connection string to a variable
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Open a recordset from Titles table
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));

        // Fill array with CursorType constants.
        int  aintCursorType[4];
        aintCursorType[0] = adOpenForwardOnly;
        aintCursorType[1] = adOpenKeyset;
        aintCursorType[2] = adOpenDynamic;
        aintCursorType[3] = adOpenStatic;

        // Open recordset using each CursorType and optimistic locking.
        // Then call the DisplaySupport procedure to display the
        // supported options.
        for (int intIndex=0; intIndex <= 3; intIndex++)
        {
            pRstTitles->CursorType =
               (enum CursorTypeEnum)aintCursorType[intIndex];
            pRstTitles->LockType = adLockOptimistic;

            // Pass the Cursor type and LockType to the Recordset.
            pRstTitles->Open ("Titles", strCnn,
                (enum CursorTypeEnum)aintCursorType[intIndex],
                adLockOptimistic, adCmdTable);

            switch(aintCursorType[intIndex])
            {
                case adOpenForwardOnly:
                    printf("\nForwardOnly cursor supports:\n");
                    break;

                case adOpenKeyset:
                    printf("\nKeyset cursor supports:\n");
                    break;

                case adOpenDynamic:
                    printf("\nDynamic cursor supports:\n");
                    break;

                case adOpenStatic:
                    printf("\nStatic cursor supports:\n");
                    break;

                default :
                    break;
            }

            DisplaySupport(pRstTitles);

            printf("\n\nPress any key to continue...");
            getch();

            //Clear the screen for the next display.
            system("cls");

            // Clean up objects before exit.
            pRstTitles->Close();
        }
    }

    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstTitles->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    DisplaySupport Function                //
//                                           //
///////////////////////////////////////////////
void DisplaySupport (_RecordsetPtr  pRstTemp)
{
    // Fill array with cursor option constants.
    long  alngConstants[11];
    alngConstants[0] = adAddNew;
    alngConstants[1] = adApproxPosition;
    alngConstants[2] = adBookmark;
    alngConstants[3] = adDelete;
    alngConstants[4] = adFind;
    alngConstants[5] = adHoldRecords;
    alngConstants[6] = adMovePrevious;
    alngConstants[7] = adNotify;
    alngConstants[8] = adResync;
    alngConstants[9] = adUpdate;
    alngConstants[10] = adUpdateBatch;

    for(int intIndex=0; intIndex <= 10; intIndex++)
    {
        bool booSupports = pRstTemp->
            Supports( (enum CursorOptionEnum)alngConstants[intIndex] );

        if(booSupports)
        {
            switch(alngConstants[intIndex])
            {
                case adAddNew :
                    printf("\n  AddNew");
                    break;

                case adApproxPosition :
                    printf("\n  AbsolutePosition and AbsolutePage");
                    break;

                case adBookmark :
                    printf("\n  Bookmark");
                    break;

                case adDelete :
                    printf("\n  Delete");
                    break;

                case adFind :
                    printf("\n  Find");
                    break;

                case adHoldRecords :
                    printf("\n  Holding Records");
                    break;

                case adMovePrevious :
                    printf("\n  MovePrevious and Move");
                    break;

                case adNotify :
                    printf("\n  Notifications");
                    break;

                case adResync :
                    printf("\n  Resyncing data");
                    break;

                case adUpdate :
                    printf("\n  Update");
                    break;

                case adUpdateBatch :
                    printf("\n  Batch updating");
                    break;

                default :
                    break;
            }
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintProviderError Function            //
//                                           //
///////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection’s Errors collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintComError Function                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Type プロパティの例 (Field) (VC++)

この例では、Employees テーブル内のすべての Field オブジェクトの Type プロパティの値に対応する定数名を表示して、Type プロパティの機能を示します。このプロシージャを実行するには、FieldType 関数が必要です。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void TypeX(void);
_bstr_t FieldType(int intType);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////
//                                           //
//    Main Function                          //
//                                           //
///////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    TypeX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//             TypeX Function                //
//                                           //
///////////////////////////////////////////////
void TypeX(void)
{
   HRESULT  hr = S_OK;

    // Define string variables.
   _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
  _RecordsetPtr  pRstEmployees  = NULL;
   FieldsPtr  pFldLoop      = NULL;

     try
    {
        // Open recordset with data from Employees table.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->Open ("Employees",strCnn,
            adOpenForwardOnly, adLockReadOnly, adCmdTable);

        printf("Fields in Employees Table:\n\n");

        // Enumerate the Fields collection of the Employees table.
        pFldLoop = pRstEmployees->GetFields();
        int intLine = 0;
        for (int intFields = 0; intFields < (int)pFldLoop->
            GetCount(); intFields++)
        {
            _variant_t Index;
            Index.vt = VT_I2;
            Index.iVal = intFields;
            printf("  Name: %s\n" ,
                (LPCSTR) pFldLoop->GetItem(Index)->GetName());
            printf("  Type: %s\n\n",
                (LPCTSTR)FieldType(pFldLoop->GetItem(Index)->Type));
            intLine++;
            if(intLine % 5 == 0)
            {
                printf("Press any key to continue...");
                getch();
                system("cls");
            }
        }
        pRstEmployees->Close();
    }

    catch (_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////
//                                           //
//             FieldType Function            //
//                                           //
///////////////////////////////////////////////
_bstr_t FieldType(int intType)
{
        _bstr_t strType;
        switch(intType)
        {
            case adChar:
                 strType = "adChar";
                break;
            case adVarChar:
                strType = "adVarChar";
                break;
            case adSmallInt:
                strType = "adSmallInt";
                break;
            case adUnsignedTinyInt:
                strType = "adUnsignedTinyInt";
                break;
            case adDBTimeStamp:
                strType = "adDBTimeStamp";
                break;
            default:
                break;
        }
        return strType;
}

///////////////////////////////////////////////
//                                           //
//    PrintProviderError Function            //
//                                           //
///////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection’s Errors collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintComError Function                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Type プロパティの例 (Property) (VC++)

この例では、Type プロパティの機能を示します。これは、Properties や Fields などのコレクションの名前および種類を一覧表示するユーティリティのモデルです。

Properties コレクションにアクセスするために Recordset を開く必要はありません。Properties コレクションは、Recordset オブジェクトのインスタンスが作成されると使用可能になります。ただし、CursorLocation プロパティを adUseClient に設定すると、Recordset オブジェクトの Properties コレクションにいくつかのダイナミック プロパティが追加されるため、この例は多少興味深いものになっています。例をわかりやすくするために、ここでは明示的に Item プロパティを使用して、各 Property オブジェクトにアクセスします。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void TypeX();
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//     Main Function                                    //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    TypeX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        TypeX Function                                //
//                                                      //
//////////////////////////////////////////////////////////
void TypeX()
{
    HRESULT  hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _RecordsetPtr  pRst  = NULL;
    PropertyPtr pProperty = NULL;

    //Define Other Variables
    _bstr_t strMsg;
    _variant_t vIndex;
    int intLineCnt = 0;

      try
    {
        TESTHR(pRst.CreateInstance (__uuidof(Recordset)));

        // Set the Recordset Cursor Location
        pRst->CursorLocation = adUseClient;

        for (short iIndex = 0; iIndex <= (pRst->Properties->
            GetCount() - 1);iIndex++)
        {
            vIndex = iIndex;
            pProperty = pRst->Properties->GetItem(vIndex);

            int propType = (int)pProperty->GetType();
            switch(propType)
            {
                case adBigInt:
                    strMsg = "adBigInt";
                    break;
                case adBinary:
                    strMsg = "adBinary";
                    break;
                case adBoolean:
                    strMsg = "adBoolean";
                    break;
                case adBSTR:
                    strMsg = "adBSTR";
                    break;
                case adChapter:
                    strMsg = "adChapter";
                    break;
                case adChar:
                    strMsg = "adChar";
                    break;
                case adCurrency:
                    strMsg = "adCurrency";
                    break;
                case adDate:
                    strMsg = "adDate";
                    break;
                case adDBDate:
                    strMsg = "adDBDate";
                    break;
                case adDBTime:
                    strMsg = "adDBTime";
                    break;
                case adDBTimeStamp:
                    strMsg = "adDBTimeStamp";
                    break;
                case adDecimal:
                    strMsg = "adDecimal";
                    break;
                case adDouble:
                    strMsg = "adDouble";
                    break;
                case adEmpty:
                    strMsg = "adEmpty";
                    break;
                case adError:
                    strMsg = "adError";
                    break;
                case adFileTime:
                    strMsg = "adFileTime";
                    break;
                case adGUID:
                    strMsg = "adGUID";
                    break;
                case adIDispatch:
                    strMsg = "adIDispatch";
                    break;
                case adInteger:
                    strMsg = "adInteger";
                    break;
                case adIUnknown:
                    strMsg = "adIUnknown";
                    break;
                case adLongVarBinary:
                    strMsg = "adLongVarBinary";
                    break;
                case adLongVarChar:
                    strMsg = "adLongVarChar";
                    break;
                case adLongVarWChar:
                    strMsg = "adLongVarWChar";
                    break;
                case adNumeric:
                    strMsg = "adNumeric";
                    break;
                case adPropVariant:
                    strMsg = "adPropVariant";
                    break;
                case adSingle:
                    strMsg = "adSingle";
                    break;
                case adSmallInt:
                    strMsg = "adSmallInt";
                    break;
                case adTinyInt:
                    strMsg = "adTinyInt";
                    break;
                case adUnsignedBigInt:
                    strMsg = "adUnsignedBigInt";
                    break;
                case adUnsignedInt:
                    strMsg = "adUnsignedInt";
                    break;
                case adUnsignedSmallInt:
                    strMsg = "adUnsignedSmallInt";
                    break;
                case adUnsignedTinyInt:
                    strMsg = "adUnsignedTinyInt";
                    break;
                case adUserDefined:
                    strMsg = "adUserDefined";
                    break;
                case adVarBinary:
                    strMsg = "adVarBinary";
                    break;
                case adVarChar:
                    strMsg = "adVarChar";
                    break;
                case adVariant:
                    strMsg = "adVariant";
                    break;
                case adVarNumeric:
                    strMsg = "adVarNumeric";
                    break;
                case adVarWChar:
                    strMsg = "adVarWChar";
                    break;
                case adWChar:
                    strMsg = "adWChar";
                    break;
                default:
                    strMsg = "*UNKNOWN*";
                    break;
            }

            intLineCnt++;
            if (intLineCnt%20 == 0)
            {
                printf("\nPress any key to continue...\n");
                getch();
            }
            printf ("Property %d : %s,Type = %s\n",iIndex,
                (LPCSTR)pProperty->GetName(),(LPCSTR)strMsg);
        }
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintComError Function                          //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{

    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Update、CancelUpdate メソッドの例 (VC++)

この例では、Update メソッドの機能を、関連する CancelUpdate メソッドと共に示します。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <malloc.h>
#include <conio.h>
#include "UpdateX.h"

// Function Declartion.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void UpdateX(void);
void UpdateX2(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

     UpdateX();

     //Wait here for user to see the output..
     printf("\nPress any key to continue...");
     getch();
     //Clear the screen for the next display
     system("cls");

     UpdateX2();

     ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      UpdateX Function                                //
//                                                      //
//////////////////////////////////////////////////////////
void UpdateX(void)
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstEmployees  = NULL;

    // Define string variables.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    IADORecordBinding   *picRs   = NULL;  // Interface Pointer declared
    CEmployeeRs emprs;             // C++ Class object.

    try
    {
        // Open recordset with names from Employees table.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->CursorType = adOpenKeyset;
        pRstEmployees->LockType = adLockOptimistic;
        pRstEmployees->Open("SELECT fname, lname FROM Employee "
            "ORDER BY lname",strCnn,adOpenKeyset,adLockOptimistic,
            adCmdText);

        // Store original data.
        _bstr_t strOldFirst = pRstEmployees->Fields->
            GetItem("fname")->Value;
        _bstr_t strOldLast  = pRstEmployees->Fields->
            GetItem("lname")->Value;

        //Change data in edit buffer.
        pRstEmployees->Fields->GetItem("fname")->Value =
            (_bstr_t)("Linda");
        pRstEmployees->Fields->GetItem("lname")->Value =
            (_bstr_t)("Kobara");

        // Show contents of buffer and get user input.
        printf("\n\nEdit in progress:\n\n");

        printf("Original data =  %s %s \n",
            (LPSTR)strOldFirst,(LPSTR)strOldLast);

        printf("Data in buffer =  %s %s",
            (LPSTR)(_bstr_t) pRstEmployees->Fields->
            GetItem("fname")->Value,\
            (LPSTR) (_bstr_t) pRstEmployees->Fields->
            GetItem("lname")->Value);

        // Ask if the User wants to Update
        printf("\n\nUse Update to replace the original data with the"
               " buffered data in the Recordset? (y/n): ");
        char chKey = getch();

        if(toupper(chKey) == 'Y')
            pRstEmployees->Update();
        else
            pRstEmployees->CancelUpdate();

        //Open an IADORecordBinding interface pointer which
        //we'll use for binding Recordset to a class.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here.
        TESTHR(picRs->BindToRecordset(&emprs));

        pRstEmployees->MoveFirst();

        // Show the resulting data.
        printf("\nData in recordset =  %s %s", emprs.le_fnameStatus ==
            adFldOK ? emprs.m_sze_fname : "<NULL>",
            emprs.le_lnameStatus == adFldOK ?
            emprs.m_sze_lname : "<NULL>");

        // Restore original data because this is a demonstration.
        if ((strcmp((char *)strOldFirst,emprs.m_sze_fname) &&
             strcmp((char *)strOldLast,emprs.m_sze_lname)))
        {
            pRstEmployees->Fields->GetItem("fname")->Value = strOldFirst;
            pRstEmployees->Fields->GetItem("lname")->Value = strOldLast;
            pRstEmployees->Update();
        }

        //Release IADORecordset Interface
        if (picRs)
            picRs->Release();

        // Clean up objects before exit.
        pRstEmployees->Close();
    }

    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

// The next example demonstrates the Update method
// in conjunction with the AddNew method.

//////////////////////////////////////////////////////////
//                                                      //
//           UpdateX2 Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void UpdateX2(void)
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr pConnection        = NULL;
    _RecordsetPtr pRstEmployees = NULL;

    // Define string variables.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    IADORecordBinding   *picRs  = NULL;  // Interface Pointer declared
    CEmployeeRs1 emprs;            // C++ Class object.

    try
    {
        // Open a connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
         pConnection->Open(strCnn,"","",NULL);

        // Open recordset with data from Employees table.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->CursorType = adOpenKeyset;
        pRstEmployees->LockType = adLockOptimistic;
        pRstEmployees->Open("Employees",
            _variant_t((IDispatch*)pConnection,true),
            adOpenKeyset, adLockOptimistic,adCmdTable);

        pRstEmployees->AddNew();
        _bstr_t strEmpID = "B-S55555M";
        pRstEmployees->Fields->GetItem("emp_id")->Value = strEmpID;
        pRstEmployees->Fields->GetItem("fname")->Value =
            (_bstr_t) ("Bill");
        pRstEmployees->Fields->GetItem("lname")->Value =
            (_bstr_t) ("Sornsin");

        // Show contents of buffer and get user input.
        printf("\n\nAddNew in progress:\n\n");

        printf("Data in buffer = %s ,  %s %s",
            (LPSTR) (_bstr_t) pRstEmployees->Fields->
            GetItem("emp_id")->Value,
            (LPSTR) (_bstr_t) pRstEmployees->Fields->
            GetItem("fname")->Value,
            (LPSTR) (_bstr_t) pRstEmployees->Fields->
            GetItem("lname")->Value);

        printf("\n\nUse Update to save buffer to recordset?(y/n):");
        char chKey = getch();

        if(toupper(chKey) == 'Y')
        {
            pRstEmployees->Update();

            //Open an IADORecordBinding interface pointer which
            //we'll use for binding Recordset to a class.
            TESTHR(pRstEmployees->QueryInterface(
                __uuidof(IADORecordBinding),(LPVOID*)&picRs));

            //Bind the Recordset to a C++ Class here
            TESTHR(picRs->BindToRecordset(&emprs));

            // Go to the new record and show the resulting data.
            printf ("\n\nData in recordset =  %s ,  %s %s",
                emprs.le_empidStatus == adFldOK ?
                emprs.m_sze_empid : "<NULL>",
                emprs.le_fnameStatus == adFldOK ?
                emprs.m_sze_fname : "<NULL>",
                emprs.le_lnameStatus == adFldOK ?
                emprs.m_sze_lname : "<NULL>");
        }
        else
        {
            pRstEmployees->CancelUpdate();
            printf("\n\nNo new record added.\n");
        }
        // Delete new data because this is a demonstration.
        _bstr_t strSQLDelete("DELETE FROM Employees WHERE emp_id = '" +
            strEmpID + "'");
         pConnection->Execute(strSQLDelete ,NULL,adExecuteNoRecords);

        //Release IADORecordset Interface
        if (picRs)
            picRs->Release();

        // Clean up objects before exit.
        pRstEmployees->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//       PrintProviderError Function                    //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection’s Errors collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintComError Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{

    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

UpdateX.h

#include "icrsint.h"

//This Class extracts only fname,lname from Employees table.
class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)
    // fname is the 1st field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_sze_fname,
         sizeof(m_sze_fname), le_fnameStatus, FALSE)
    // lname is the 2nd field in the recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sze_lname,
         sizeof(m_sze_lname), le_lnameStatus, FALSE)

END_ADO_BINDING()

public:
   CHAR   m_sze_lname[31];
   ULONG  le_lnameStatus;
   CHAR   m_sze_fname[21];
   ULONG  le_fnameStatus;
};

//This Class extracts only empid,fname,lname,from Employees table.
class CEmployeeRs1 : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs1)
    // emp_id is the 1st field in the table.
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_sze_empid,
        sizeof(m_sze_empid), le_empidStatus, FALSE)
    // fname is the 2nd field in the table.
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sze_fname,
         sizeof(m_sze_fname), le_fnameStatus, FALSE)
    // lname is the 4rt field in the table.
   ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_sze_lname,
         sizeof(m_sze_lname), le_lnameStatus, FALSE)

END_ADO_BINDING()

public:
   CHAR   m_sze_empid[10];
   ULONG  le_empidStatus;
   CHAR   m_sze_lname[31];
   ULONG  le_lnameStatus;
   CHAR   m_sze_fname[21];
   ULONG  le_fnameStatus;
};


UpdateBatch、CancelBatch メソッドの例 (VC++)

この例では、UpdateBatch メソッドの機能を、関連する CancelBatch メソッドと共に示します。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "UpdateBatchX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void UpdateBatchX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//       Main Function                                  //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    UpdateBatchX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      UpdateBatchX Function                           //
//                                                      //
//////////////////////////////////////////////////////////
void UpdateBatchX(void)
{
   HRESULT  hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstTitles   = NULL;

    // Define string variables.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    IADORecordBinding *picRs    = NULL;    // Interface Pointer Declared
    CTitleRs titlers;             // C++ Class Object

     try
    {
        // Open Titles table.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->CursorType = adOpenKeyset;
        pRstTitles->LockType = adLockBatchOptimistic;
        pRstTitles->Open ("Titles", strCnn,
            adOpenKeyset, adLockBatchOptimistic, adCmdTable);

        // Open IADORecordBinding interface pointer for binding
        // Recordset to a class
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binding the Recordset to a C++ Class
        TESTHR(picRs->BindToRecordset(&titlers));
        pRstTitles->MoveFirst();

        // Loop through recordset and ask user if she wants,
        // to change the type for a specified title.
        while (!(pRstTitles->EndOfFile))
        {
            // Compare type with psychology
            if (!strcmp( (char *)strtok(titlers.m_szt_Type," "),
                "psychology" ))
            {
                printf("\n\nTitle: %s \nChange type to self_help?(y/n):",
                    titlers.m_szt_Title);
                char chKey;
                chKey = getch();
                if(toupper(chKey) == 'Y')
                {
                    // Change type to self_help.
                    pRstTitles->Fields->GetItem("type")->Value =
                        (_bstr_t)("self_help");
                }
            }
            pRstTitles->MoveNext();
        }

        // Ask the user if she wants to commit to all the
        // changes made above.
        printf("\n\nSave all changes?");
        char chKey;
        chKey = getch();
        if(toupper(chKey) == 'Y')
        {
            pRstTitles->UpdateBatch(adAffectAll);
        }
        else
        {
            pRstTitles->CancelBatch(adAffectAll);
        }

        // Print current data in recordset.
        pRstTitles->Requery(adOptionUnspecified);

        // Open IADORecordBinding interface pointer for Binding Recordset to a class
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // ReBinding the Recordset to a C++ Class.
        TESTHR(picRs->BindToRecordset(&titlers));

        // Move to the first record of the Titles table
        pRstTitles->MoveFirst();

        //Clear the screen for the next display.
        system("cls");

        while (!pRstTitles->EndOfFile)
        {
            printf("%s -  %s\n",
                titlers.lt_TitleStatus == adFldOK ?
                titlers.m_szt_Title :"<NULL>",
                titlers.lt_TypeStatus == adFldOK ?
                titlers.m_szt_Type :"<NULL>");
            pRstTitles->MoveNext();
        }

        pRstTitles->MoveFirst();

        // Restore original data because this is demonstration.
        while (!(pRstTitles->EndOfFile))
        {
            // Compare type with psychology
            if(!strcmp( (char *)strtok(titlers.m_szt_Type," "),
                "self_help" ))
            {
                // Change type to psychology.
                pRstTitles->Fields->GetItem("type")->Value =
                    (_bstr_t)("psychology");
            }
            pRstTitles->MoveNext();
        }

        pRstTitles->UpdateBatch(adAffectAll);
        pRstTitles->Close();
    }

    catch (_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstTitles->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//    PrintProviderError Function                       //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection’s Errors collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintComError Function                          //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

UpdateBatchX.h

#include "icrsint.h"

//This class extracts titles and type from Titles table
class CTitleRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitleRs)
        // Column title is the 2nd field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_szt_Title,
            sizeof(m_szt_Title),lt_TitleStatus,FALSE)
        // Column type is the 3rd field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(3,adVarChar,m_szt_Type,
            sizeof(m_szt_Type),lt_TypeStatus,TRUE)
END_ADO_BINDING()

public:
    CHAR m_szt_Title[81];
    ULONG lt_TitleStatus;
    CHAR m_szt_Type[13];
    ULONG lt_TypeStatus;
};


Value プロパティの例 (VC++)

この例では、Field および Property オブジェクトを使って、Employees テーブルのフィールドとプロパティの値を表示することによって、Value プロパティの機能を示します。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ValueX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//    Main Function                                     //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ValueX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//              ValueX Function                         //
//                                                      //
//////////////////////////////////////////////////////////
void ValueX(void)
{
   HRESULT  hr = S_OK;

    // Define string variables.
   _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstEmployees  = NULL;
    FieldsPtr    pFldLoop    = NULL;
    PropertiesPtr  pPrpLoop    = NULL;
    _variant_t vtIndex;
    vtIndex.vt = VT_I2;

       try
    {
        // Open recordset with data from Employees table.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->Open ("Employees",strCnn ,
            adOpenForwardOnly, adLockReadOnly, adCmdTable);

        printf("Field values in rstEmployees\n\n");

        // Enumerate the Fields collection of the Employees table.
        pFldLoop = pRstEmployees->GetFields();

        for (int intFields = 0; intFields < (int)pFldLoop->
    GetCount(); intFields++)
        {
            vtIndex.iVal = intFields;

            // Because Value is the default property of a
            // Field object,the use of the actual keyword
            // here is optional.
            printf(" %s = %s\n\n" ,
                (LPCSTR) pFldLoop->GetItem(vtIndex)->GetName(),
                (LPCSTR) (_bstr_t) pFldLoop->GetItem(vtIndex)->Value);
        }

        printf("Press any key to continue...\n\n");
        getch();
        printf("Property values in rstEmployees\n\n");

        // Enumerate the Properties collection of the Recordset object.
        pPrpLoop = pRstEmployees->GetProperties();
        int intLine = 0;

        for (int intProperties = 0; intProperties < (int)pPrpLoop->
            GetCount(); intProperties++)
        {
            vtIndex.iVal = intProperties;

            // Because Value is the default property of a
            // Property object,the use of the actual keyword
            // here is optional.
            _variant_t propValue = pPrpLoop->GetItem(vtIndex)->Value;
            switch(propValue.vt)
            {

            case (VT_BOOL):
                     if(propValue.boolVal)
                     {
                        printf(" %s = True\n\n",(LPCSTR) pPrpLoop->
                            GetItem(vtIndex)->GetName());
                     }
                     else
                     {
                         printf(" %s = False\n\n",(LPCSTR) pPrpLoop->
                            GetItem(vtIndex)->GetName());
                     }
                break;

            case (VT_I4):
                printf(" %s = %d\n\n",(LPCSTR) pPrpLoop->
                    GetItem(vtIndex)->GetName(),
                    pPrpLoop->GetItem(vtIndex)->Value.lVal);
                break;

            case (VT_EMPTY):
                printf(" %s = \n\n",(LPCSTR) pPrpLoop->
                    GetItem(vtIndex)->GetName());
                break;

            default:
                break;
            }

            intLine++;
                if (intLine % 10 == 0)
                {
                    printf("\nPress any key to continue...");
                     getch();

                    //Clear the screen for the next display
                    system("cls");
                }
        }

        pRstEmployees->Close();
    }

    catch (_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//    PrintProviderError Function                       //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection’s Errors collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintComError Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Version プロパティの例 (VC++)

この例では、Connection オブジェクトの Version プロパティを使って、現在の ADO のバージョンを表示します。また、いくつかのダイナミック プロパティを使用して、次の項目を表示します。

  • 現在の DBMS の名前およびバージョン

  • OLE DB のバージョン

  • プロバイダの名前およびバージョン

  • ODBC のバージョン

  • ODBC ドライバの名前およびバージョン
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void VersionX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//       Main Function                                  //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    VersionX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//         VersionX Function                            //
//                                                      //
//////////////////////////////////////////////////////////
void VersionX(void)
{
   HRESULT   hr = S_OK;

    // Define string variables.
   _bstr_t strCnn("driver={SQL Server};server=srv;"
            "user id=sa;password=;database=Pubs;");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr    pConnection     = NULL;

       try
    {
        // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", NULL);

        printf("ADO Version   : %s\n\n",(LPCSTR) pConnection->Version);

        printf("DBMS Name   : %s\n\n",(LPCSTR) (_bstr_t)
            pConnection->Properties->GetItem("DBMS Name")->Value);

        printf("DBMS Version   : %s\n\n",(LPCSTR) (_bstr_t) pConnection->
            Properties->GetItem("DBMS Version")->Value);

        printf("OLE DB Version   : %s\n\n",(LPCSTR) (_bstr_t)
            pConnection->Properties->GetItem("OLE DB Version")->Value);

        printf("Provider Name   : %s\n\n",(LPCSTR) (_bstr_t)
            pConnection->Properties->GetItem("Provider Name")->Value);

        printf("Provider Version   : %s\n\n",(LPCSTR) (_bstr_t)
            pConnection->Properties->GetItem("Provider Version")->Value);

        printf("Driver Name   : %s\n\n",(LPCSTR) (_bstr_t)
            pConnection->Properties->GetItem("Driver Name")->Value);

        printf("Driver Version   : %s\n\n",(LPCSTR) (_bstr_t)
            pConnection->Properties->GetItem("Driver Version")->Value);

        printf("Driver ODBC Version   : %s\n\n",(LPCSTR) (_bstr_t)
         pConnection->Properties->GetItem("Driver ODBC Version")->Value);

        pConnection->Close();
    }

    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//     PrintProviderError Function                      //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection’s Errors collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintComError Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Microsoft Visual J++ での ADO コードの例

Microsoft Visual J++ で記述するときの ADO のメソッド、プロパティ、イベントの使用方法については、次のコード例を参照してください。

注意 コード例は、最初から最後までの全体をコード エディタに貼り付けてください。このコード例は、一部分だけを使ったり、改行の情報が失われると、正常に動作しない場合があります。

メソッド

  • AddNew メソッドの例

  • Append、CreateParameter メソッドの例

  • AppendChunk、GetChunk メソッドの例

  • BeginTrans、CommitTrans、RollbackTrans メソッドの例

  • Cancel メソッドの例

  • Clone メソッドの例

  • CompareBookmarks メソッドの例

  • Delete メソッドの例

  • Execute、Requery、Clear メソッドの例

  • Find メソッドの例

  • GetRows メソッドの例

  • GetString メソッドの例

  • MoveFirst、MoveLast、MoveNext、MovePrevious メソッドの例

  • NextRecordset メソッドの例

  • Open、Close メソッドの例

  • OpenSchema メソッドの例

  • Refresh メソッドの例

  • Resync メソッドの例

  • Save、Open メソッドの例

  • Supports メソッドの例

  • Update、CancelUpdate メソッドの例

  • UpdateBatch、CancelBatch メソッドの例

プロパティ

  • AbsolutePage、PageCount、PageSize プロパティの例

  • AbsolutePosition、CursorLocation プロパティの例

  • ActiveCommand プロパティの例

  • ActiveConnection、CommandText、CommandTimeout、CommandType、Size、Direction プロパティの例

  • ActualSize、DefinedSize プロパティの例

  • Attributes、Name プロパティの例

  • BOF、EOF、Bookmark プロパティの例

  • CacheSize プロパティの例

  • ConnectionString、ConnectionTimeout、State プロパティの例

  • Count プロパティの例

  • CursorType、LockType、EditMode プロパティの例

  • Description、NativeError、Number、Source、SQLState プロパティの例

  • Filter、RecordCount プロパティの例

  • Handler プロパティの例

  • IsolationLevel、Mode プロパティの例

  • Item プロパティの例

  • MarshalOptions プロパティの例

  • MaxRecords プロパティの例

  • NumericScale、Precision プロパティの例

  • Optimize プロパティの例

  • OriginalValue、UnderlyingValue プロパティの例

  • Prepared プロパティの例

  • Provider、DefaultDatabase プロパティの例

  • Sort プロパティの例

  • Source プロパティの例

  • State プロパティの例

  • Status プロパティの例

  • StayInSync プロパティの例

  • Type プロパティの例 (Field)

  • Type プロパティの例 (Property)

  • Value プロパティの例

  • Version プロパティの例


AbsolutePage、PageCount、PageSize プロパティの例 (VJ++)

この例では、AbsolutePage、PageCount、および PageSize プロパティを使って、Employees テーブルから名前と雇用日のデータを、一度に 5 レコードずつ表示します。

// The WFC class includes the ADO objects.

import com.ms.wfc.data.*;
import java.io.* ;

public class AbsolutePageX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        AbsolutePageX();
        System.exit(0);
    }

    // AbsolutePageX function

    static void AbsolutePageX()
    {

        // Define ADO Objects.
        Recordset rstEmployees = null;

        // Declarations.
        BufferedReader in = new BufferedReader (new
            InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=pubs;User Id=sa;Password=;";

        String strName;
        String strFName;
        String strLName;
        String strHDate;
        int intPage;
        int intRecord;

        try
        {
            rstEmployees = new Recordset();

            // Use client cursor to enable AbsolutePosition property.
            rstEmployees.setCursorLocation( AdoEnums.CursorLocation.CLIENT);

            // Open a recordset using client cursor for the Employees table.
            rstEmployees.open("employee", strCnn,
                AdoEnums.CursorType.FORWARDONLY,
                AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE);

            // Display names and hire dates, five records at a time.

            rstEmployees.setPageSize(5);
            int intPageCount = rstEmployees.getPageCount();
            for ( intPage = 1; intPage <= intPageCount; intPage++)
            {
                strName = "";
                rstEmployees.setAbsolutePage(intPage);
                for ( intRecord = 1; intRecord <= rstEmployees.getPageSize();
                    intRecord++)
                {
                    strFName = rstEmployees.getField("fname").getString();
                    strLName = rstEmployees.getField("lname").getString();
                    strHDate = rstEmployees.getField("hire_date").getString();

                    strHDate = strHDate.substring(5,7) + "/" +
                        strHDate.substring(8,10) +
                        "/" + strHDate.substring(2,4);

                    strName = strName + "\n" + strFName + " " + strLName +
                        "  " + strHDate;
                    rstEmployees.moveNext();
                    if ( rstEmployees.getEOF())
                        break;
                }
                System.out.println(strName);
                // Get user input to display next records.

                System.out.println("\n\nPress <Enter> key to Continue.");
                line = in.readLine();
            }

            // Cleanup objects before exit.
            rstEmployees.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // Check for null pointer for connection object.
            if (rstEmployees.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());

            // As passing a Recordset, check for null pointer first.
            if (rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    //.PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


AbsolutePosition、CursorLocation プロパティの例 (VJ++)

この例では、AbsolutePosition プロパティを使って、Recordset のすべてのレコードを列挙するループ処理の進行状況をトレースします。ここでは、CursorLocation プロパティを使ってカーソルをクライアント カーソルに設定することにより、AbsolutePosition プロパティを使用可能にしています。

import com.ms.wfc.data.*;
import java.io.*;

public class AbsolutePositionX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        AbsolutePositionX();
        System.exit(0);
    }

    //.AbsolutePositionX function

    static void AbsolutePositionX()
    {

        // define ADO Objects.
        Recordset rstEmployees = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;" +
            "Initial Catalog=pubs;User Id=sa;Password=;";

        String strLName;
        String strMessage;
        String strAbsolutePosition,strRecordCount;
        int intAbsolutePosition;
        int intRecordCount;
        int intChoice;

        try
        {

            rstEmployees = new Recordset();

            // Use client cursor to enable AbsolutePosition property.
            rstEmployees.setCursorLocation( AdoEnums.CursorLocation.CLIENT);

            // Open a recordset for Employees table using a client cursor.
            rstEmployees.open("employee", strCnn,
                AdoEnums.CursorType.FORWARDONLY ,
                AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE);

            // Enumerate Recordset.
            while ( !rstEmployees.getEOF()) // continuous loop
            {
                intRecordCount = rstEmployees.getRecordCount();
                strRecordCount = Integer.toString(intRecordCount);

                // Read data field in the variables.
                strLName = rstEmployees.getField("lname").getString();
                intAbsolutePosition = rstEmployees.getAbsolutePosition();
                strAbsolutePosition = Integer.toString(intAbsolutePosition);

                // Display current record information.
                strMessage = "\nEmployee: " + strLName + "\n" + "(Record " +
                    strAbsolutePosition + " of " +strRecordCount + " )";
                System.out.println(strMessage);
                System.out.println(
                    "\nDo you want to continue (1 -> Yes / 2 -> No)?");
                //user types a number followed by enter (cr-lf).
                line = in.readLine().trim();
                intChoice = Integer.parseInt(line);
                if ( intChoice != 1)
                    break;
                rstEmployees.moveNext();
            }

            //Cleanup objects before exit.
            rstEmployees.close();
        }

        catch( NumberFormatException ne)
        {
            System.out.println("\nException : Integer Input required.");
            System.exit(0);
        }

        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // Check for null pointer for connection object.
            if (rstEmployees.getActiveConnection()== null)
                System.out.println("Exception: " + ae.getMessage());
            // As passing a Recordset, check for null pointer first.
            if (rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    //.PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


ActiveCommand プロパティ の例 (VJ++)

この例では、ActiveCommand プロパティの機能を示します。

サブルーチンに Recordset オブジェクトを渡し、その Recordset オブジェクトの ActiveCommand プロパティを使って、その Recordset を作成したコマンド テキストとパラメータを表示します。

import com.ms.wfc.data.*;
import java.io.* ;

public class ActiveCommandX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        ActiveCommandX();
        System.exit(0);
    }

    // ActiveCommandX function

    static void ActiveCommandX()
    {
        // Define ADO Objects.
        Connection cnConn1 = null;
        Command cmd = null;
        Recordset rstAuthors = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=pubs;Provider=MSDASQL;uid=sa;pwd=;";
        String strName;

        try
        {
            System.out.println("Enter an author's name (e.g., Ringer): ");
            strName = in.readLine().trim();
            cmd = new Command();
            cmd.setCommandText("SELECT * FROM authors WHERE au_lname = ?");
            cmd.getParameters().append(cmd.createParameter("LastName",
                AdoEnums.DataType.CHAR,
                AdoEnums.ParameterDirection.INPUT, 20, strName));
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            cmd.setActiveConnection(cnConn1);
            rstAuthors = cmd.execute(null,AdoEnums.CommandType.TEXT);
            ActiveCommandXprint(rstAuthors);

            // Cleanup objects before exit.
            rstAuthors.close();
            cnConn1.close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // ActiveCommandXprint function
    static void ActiveCommandXprint(Recordset rstp)
    {
        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strName;

        try
        {
            strName = rstp.getActiveCommand().getParameters().
                getItem("LastName").getValue().toString();
            System.out.println("\nCommand text = '" +
                rstp.getActiveCommand().getCommandText() + "'");
            System.out.println("Parameter = '" + strName + "'");
            if(rstp.getBOF())
            {
                System.out.println("Name = '" + strName + "', not found.");
            }
            else
            {
                System.out.println("Name = '" +
                    rstp.getField("au_fname").getString() + " " +
                    rstp.getField("au_lname").getString() +
                    "', author ID = '" +
                    rstp.getField("au_id").getString() + "'");
            }
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstp != null)
            {
                PrintProviderError(rstp.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    //.PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


ActiveConnection、CommandText、CommandTimeout、CommandType、Size、Direction プロパティの例 (VJ++)

この例では、ActiveConnection、CommandText、CommandTimeout、CommandType、Size、および Direction の各プロパティを使って、ストアド プロシージャを実行します。

import com.ms.wfc.data.*;
import java.io.*;

public class ActiveConnectionX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        ActiveConnectionX();
        System.exit(0);
    }

    //.ActiveConnectionX function

    static void ActiveConnectionX()
    {
        // Define ADO Objects.
        Connection cnConn1 = null;
        Command cmdByRoyalty = null;
        Parameter prmByRoyalty = null;
        Recordset rstByRoyalty = null;
        Recordset rstAuthors = null;

        //Declarations.
        String strCnn;
        String strAuthorID;
        String strFName;
        String strLName;
        int intRoyalty ;
        BufferedReader in = new BufferedReader
            (new InputStreamReader (System.in));
        String line = null;

        try
        {
            // Open a connection.

            strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=pubs;User Id=sa;Password=;";
            cnConn1 = new Connection();
            cnConn1.open(strCnn,"","",AdoEnums.CommandType.UNSPECIFIED);

            // Define a command object for stored procedure.
            cmdByRoyalty = new Command();
            cmdByRoyalty.setActiveConnection(cnConn1);
            cmdByRoyalty.setCommandText("byRoyalty");
            cmdByRoyalty.setCommandType(AdoEnums.CommandType.STOREDPROC);
            cmdByRoyalty.setCommandTimeout(15);

            //Define the stored procedure's input parameter.
            System.out.println ("\nEnter Royalty : ");
            line = in.readLine().trim();
            intRoyalty = Integer.parseInt(line);
            prmByRoyalty = new Parameter ();
            prmByRoyalty.setType(AdoEnums.DataType.INTEGER);
            prmByRoyalty.setSize(3);
            prmByRoyalty.setDirection(AdoEnums.ParameterDirection.INPUT);
            prmByRoyalty.setValue(new Integer(intRoyalty));
            cmdByRoyalty.getParameters().append(prmByRoyalty);

            // Create a recordset by executing the command.

            rstByRoyalty = cmdByRoyalty.execute();

            // Open the Authors table to get author names for display.
            rstAuthors = new Recordset ();
            rstAuthors.open("authors",strCnn,
                AdoEnums.CursorType.FORWARDONLY,
                AdoEnums.LockType.READONLY ,AdoEnums.CommandType.TABLE );

            // Print current data in the recordset,
            // adding author names from Authors table.
            System.out.println("\nAuthors with " + intRoyalty +
                " percent royalty");
            while (!rstByRoyalty.getEOF())
            {
                strAuthorID =  rstByRoyalty.getField("au_id").getString();
                rstAuthors.setFilter("au_id ='" +  strAuthorID + "'");
                strFName = rstAuthors.getField("au_fname").getString();
                strLName = rstAuthors.getField("au_lname").getString();
                System.out.println("\t" + strAuthorID + ", " + strFName
                    + " " + strLName);
                rstByRoyalty.moveNext();
            }
            System.out.println("\n\nPress <Enter> key to continue.");
            line = in.readLine();

            //Cleanup objects before exit.
            rstByRoyalty.close();
            rstAuthors.close();
            cnConn1.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // Check for null pointer for connection object
            if(rstByRoyalty.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());
            if(rstAuthors.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());
            // As passing a Recordset, check for null pointer first.
            if (rstByRoyalty != null)
            {
                PrintProviderError(rstByRoyalty.getActiveConnection());
            }
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // This catch is required if input string cannot be converted to
        // Integer data type.
        catch ( java.lang.NumberFormatException ne)
        {
            System.out.println("\nException: Integer Input required.");
        }
        // System Read requires this catch.
        catch( java.io.IOException je )
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    //.PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


ActualSize、DefinedSize プロパティの例 (VJ++)

この例では、ActualSize プロパティおよび DefinedSize プロパティを使って、定義されているフィールド サイズと実際のフィールド サイズを表示します。

import com.ms.wfc.data.*;
import java.io.*;

public class ActualSizeX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        ActualSizeX();
        System.exit(0);
    }

    // ActualSizeX function

    static void ActualSizeX()
    {

        // Define ADO Objects.
        Recordset rstStores = null;

        // Declarations.
        BufferedReader in = new
            BufferedReader(new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=pubs;User Id=sa;Password=;";

        String strStoreName;
        String strMessage;
        String strDSize,strASize;
        int intDefinedSize;
        int intActualSize;
        int intChoice = 0;

        try
        {
            // Open recordset with Stores table.
            rstStores = new Recordset();
            rstStores.open("stores", strCnn,
                AdoEnums.CursorType.FORWARDONLY ,
                AdoEnums.LockType.READONLY ,
                AdoEnums.CommandType.TABLE);

            // Loop through the Recordset displaying the contents
            // of the stor_name field, the field's defined size
            // and it's actual size.

            while ( !(rstStores.getEOF( ))) // continuous loop
            {
                // Read data field in the variables.
                strStoreName = rstStores.getField("stor_name").getString();
                intDefinedSize =
                    rstStores.getField("stor_name").getDefinedSize();
                strDSize = Integer.toString(intDefinedSize);
                intActualSize = rstStores.getField
                    ("stor_name").getActualSize ();
                strASize = Integer.toString(intActualSize);

                // Display current record information.
                strMessage = "\nStore name: " + strStoreName + "\n"
                     + "Defined Size : " + strDSize + "\n"
                     + "Actual Size : " + strASize;

                System.out.println(strMessage);
                System.out.println("\nPress <Enter> key to continue.");
                in.readLine();
                rstStores.moveNext();
            }

            // Cleanup objects before exit.
            rstStores.close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // Check for null pointer for connection object.
            if (rstStores.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());
            // As passing a Recordset, check for null pointer first.
            if (rstStores != null)
            {
                PrintProviderError(rstStores.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    //.PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


AddNew メソッドの例 (VJ++)

この例では、AddNew メソッドを使って、ユーザーによって指定された名前で新規のレコードを作成します。

import com.ms.wfc.data.*;
import java.io.*;

public class AddNewX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        AddNewX();
        System.exit(0);
    }

    // AddNewX function

    static void AddNewX()
    {
        // Define ADO Objects.
        Connection cnConn1 = null;
        Recordset rstEmployees = null;

        //Declarations.
        String strCnn;
        String strID;
        String strFirstName;
        String strLastName;
        boolean booRecordAdded ;
        BufferedReader in =
new BufferedReader (new InputStreamReader (System.in));
        String line = null;

        try
        {
            // Open a connection.
            strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=pubs;User Id=sa;Password=;";
            cnConn1 = new Connection();
            cnConn1.open(strCnn);//,"","",AdoEnums.CommandType.UNSPECIFIED);

            // Open Employees table.
            rstEmployees = new Recordset ();
            rstEmployees.open("employee", cnConn1,
                AdoEnums.CursorType.KEYSET , AdoEnums.LockType.OPTIMISTIC ,
                AdoEnums.CommandType.TABLE );

            /* Get data from the user. The employee ID must be formatted as
            first,middle, and last initial, five numbers, then M or F to
            signify the gender. For example, the employee id for Bill
            Sornsin would be "B-S55555M". */
            System.out.println("\nEnter employee ID :");
            strID = in.readLine().trim();
            System.out.println("\nEnter first name :");
            strFirstName = in.readLine().trim();
            System.out.println("\nEnter last name :");
            strLastName = in.readLine().trim();

            // Proceed only if the user actually entered something
            // for both the first and last names.

            if ( !(strID.compareTo("") == 0) &
                !(strFirstName.compareTo("") == 0) &
                !(strLastName.compareTo("")== 0))
            {
                // Add new record.
                rstEmployees.addNew();
                rstEmployees.getField("emp_id").setString(strID);
                rstEmployees.getField("fname").setString(strFirstName);
                rstEmployees.getField("lname").setString(strLastName);

                // update the record with the new data.
                rstEmployees.update();
                booRecordAdded = true;

                // Show the newly added data.
                System.out.println("\nNew record : "
                    + rstEmployees.getField("emp_id").getString()+ " "
                    + rstEmployees.getField("fname").getString()+ " "
                    + rstEmployees.getField("lname").getString());
            }
            else
            {
                System.out.println("\nPlease enter an employee ID," +
                    "first name, and last name.");
            }

            System.out.println("\n\nPress <Enter> key to continue.");
            line = in.readLine();

            // Delete the new record because this is a demonstration.
            cnConn1.execute("DELETE FROM employee WHERE "
                + "emp_id = '" + strID + "'");

            //Cleanup objects before exit.
            rstEmployees.close();
            cnConn1.close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            //Check for null pointer for connection object.
            if(rstEmployees.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());
            // As passing a Recordset, check for null pointer first.
            if (rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
            System.exit(0);
        }
        // System Read requires this catch.
        catch( java.io.IOException je )
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    //.PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Append、CreateParameter メソッドの例 (VJ++)

この例では、Append メソッドおよび CreateParameter メソッドを使って、入力パラメータでストアド プロシージャを実行します。

import com.ms.wfc.data.*;
import java.io.*;
import com.ms.com.*;

public class AppendX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        AppendX();
    }

    // AppendX function

    static void AppendX()
    {
        // Define ADO Objects.
        Connection cnConn1 = null;
        Command cmdByRoyalty = null;
        Parameter prmByRoyalty = null;
        Recordset rstByRoyalty = null;
        Recordset rstAuthors = null;

        //Declarations.
        String strCnn;
        String strAuthorID;
        String strFName;
        String strLName;
        int intRoyalty ;
        BufferedReader in =
            new BufferedReader (new InputStreamReader (System.in));
        String line = null;
        Variant varRoyalty;

        try
        {
            // Open a connection.

            strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=pubs;User Id=sa;Password=;";
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            cnConn1.setCursorLocation(AdoEnums.CursorLocation.CLIENT);

            // Open command object with one parameter.
            cmdByRoyalty = new Command();
            cmdByRoyalty.setCommandText("byRoyalty");
            cmdByRoyalty.setCommandType(AdoEnums.CommandType.STOREDPROC);

            //Get parameter value and append parameter.
            System.out.println ("\nEnter Royalty : ");
            line = in.readLine().trim();
            intRoyalty = Integer.parseInt(line);
            varRoyalty = new Variant(intRoyalty);
            prmByRoyalty = cmdByRoyalty.createParameter ("percentage",
                AdoEnums.DataType.INTEGER,
                AdoEnums.ParameterDirection.INPUT,4,varRoyalty);

            cmdByRoyalty.getParameters().append(prmByRoyalty);
            prmByRoyalty.setValue(varRoyalty);

            // Create a recordset by executing the command.
            cmdByRoyalty.setActiveConnection(cnConn1);
            rstByRoyalty = cmdByRoyalty.execute();

            // Open the Authors table to get author names for display.
            rstAuthors = new Recordset ();
            rstAuthors.open("authors", cnConn1,
                AdoEnums.CursorType.FORWARDONLY,
                AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE );

            // Print current data in the recordset,
            // adding author names from Authors table.
            System.out.println("\nAuthors with " + intRoyalty +
                " percent royalty");
            while (!rstByRoyalty.getEOF())
            {
                strAuthorID =  rstByRoyalty.getField("au_id").getString();
                rstAuthors.setFilter("au_id ='" +  strAuthorID + "'");
                strFName = rstAuthors.getField("au_fname").getString();
                strLName = rstAuthors.getField("au_lname").getString();
                System.out.println("\t" + strAuthorID + ", " + strFName
                    + " " + strLName);
                rstByRoyalty.moveNext();
            }
            System.out.println("\n\nPress <Enter> key to continue.");
            line = in.readLine();

            //Cleanup objects before exit.
            rstByRoyalty.close();
            rstAuthors.close();
            cnConn1.close();
            System.exit(0);//required here only.

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // Check for null pointer for connection object.
            if(rstByRoyalty.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());
            // As passing a Recordset, check for null pointer first.
            if (rstByRoyalty != null)
            {
                PrintProviderError(rstByRoyalty.getActiveConnection());
            }
            if (rstAuthors != null)
            {
                if (rstAuthors.getActiveConnection()==null)
                    System.out.println("Exception: " + ae.getMessage());
                else
                    PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // This catch is required if input string cannot be converted to
        // Integer data type.
        catch( java.lang.NumberFormatException ne)
        {
            System.out.println("\nException: Integer Number required.");
            System.exit(0);
        }
        // System Read requires this catch.
        catch( java.io.IOException je )
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    //.PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


AppendChunk、GetChunk メソッドの例 (VJ++)

この例では、AppendChunk メソッドおよび GetChunk メソッドを使って、別のレコードのデータを画像フィールドに格納します。

import com.ms.wfc.data.*;
import java.io.*;
import com.ms.com.*;
import java.util.*;

public class AppendChunkX
{

    // The main entry point for the application.

    public static void main (String[] args)
    {
        AppendChunkX();
        System.exit(0);
    }

    // AppendChunkX function

    static void AppendChunkX()
    {
        // Define ADO Objects.
        Connection cnConn1 = null;
        Recordset rstPubInfo = null;

        //Declarations.
        String strCnn;
        String strPubID;
        String strPRInfo;
        String strMessage = "";
        long lngOffset = 0;
        long lngLogoSize;
        final  int conChunkSize = 100;
        byte[] varChunk = new byte[conChunkSize];
        int intCommand = 0 ;
        int intMulChunkSize,intLastChunkSize;
        Vector varLogo = new Vector();
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        int noOfRecords;
        int noOfRecordesDisplayed = 5;
        int recordCount = 0;
        String info;
        int indexOfComma ;

        try
        {
            // Open a connection.
            strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=pubs;User Id=sa;Password=;";
            cnConn1 = new Connection();
            cnConn1.open(strCnn,"","",AdoEnums.CommandType.UNSPECIFIED);

            // Open the pub_info Table.
            rstPubInfo = new Recordset();
            rstPubInfo.setCursorType(AdoEnums.CursorType.KEYSET );
            rstPubInfo.setLockType(AdoEnums.LockType.OPTIMISTIC );

            rstPubInfo.open("pub_info", cnConn1,AdoEnums.CursorType.KEYSET ,
                AdoEnums.LockType.OPTIMISTIC, AdoEnums.CommandType.TABLE );
            System.out.println ("Available logos are : \n");

            noOfRecords = rstPubInfo.getRecordCount();

            // Prompt for the Logo to copy.
            for ( int i = 0; i < noOfRecords; i++)
            {
                recordCount++;
                strMessage = strMessage +
                    rstPubInfo.getField("pub_id").getString() + "\n";
                indexOfComma =
                    rstPubInfo.getField("pr_info").getString().indexOf(",");
                info =
                    rstPubInfo.getField("pr_info").getString().substring(0,
                    indexOfComma );
                strMessage = strMessage + info + "\n\n";
                // Display five records at a time.
                if ( recordCount == noOfRecordesDisplayed)
                {
                    System.out.println(strMessage);
                    System.out.println("\n\nPress <Enter> to continue..");
                    line = in.readLine();
                    strMessage = "";
                    recordCount = 0;
                }
                rstPubInfo.moveNext();
                // Display last records and exit if last record.
                if(rstPubInfo.getEOF())
                {
                    System.out.println(strMessage);
                    break;
                }
            }
            System.out.println ("\nEnter the ID of a logo to copy :\n"  );
            strPubID = in.readLine();

            // Copy the logo to a variable in chunks.
            rstPubInfo.setFilter("pub_id = '" + strPubID + "'");
            lngLogoSize = rstPubInfo.getField("logo").getActualSize();
            while (lngOffset < lngLogoSize)
            {
                varChunk = rstPubInfo.getField("logo")
                    .getByteChunk(conChunkSize);
                int i = 0;
                while (i < conChunkSize && varLogo.size() < (int)lngLogoSize)
                {
                    varLogo.addElement(new Byte(varChunk[i]));
                    i++;
                }
                lngOffset =  lngOffset + conChunkSize ;
            }
                //Get the data for New ID from the user.
                System.out.println
                    ("\nEnter a new pub ID [must be > 9899 & < 9999]:");
                strPubID =  in.readLine().trim();

                System.out.println ("\nEnter descriptive text :");
                strPRInfo =  in.readLine().trim();

                //Temporarily add new publisher to publishers table to
                //avoid getting error foreign key constraint.
                cnConn1.execute("INSERT publishers(pub_id) VALUES('" +
                    strPubID + "')");

                //Add a new record.
                rstPubInfo.addNew();
                rstPubInfo.getField("pub_id").setString(strPubID);
                rstPubInfo.getField("pr_info").setString(strPRInfo);

                //Copy the selected logo to the new logo in chunks.
                lngOffset = 0;

                //Divide logosize in multiples of constant chunk size.
                intMulChunkSize =
                    (varLogo.size()/conChunkSize) * conChunkSize;
                intLastChunkSize = varLogo.size()- intMulChunkSize ;
                byte[] arrChunk  = new byte[conChunkSize];
                byte[] lastChunk = new byte[intLastChunkSize];

                while ( lngOffset < varLogo.size () )
                {
                    int ii = 0 ;
                    // Copy the logo in constant chunk size.
                    if ( (int)lngOffset < intMulChunkSize)
                    {
                        while (ii < conChunkSize &&
                            (int)lngOffset < varLogo.size () )
                        {
                            arrChunk[ii] =
                                ((Byte)varLogo.elementAt
                                ((int)lngOffset)).byteValue();
                            ii++;
                            lngOffset++;
                        }
                        rstPubInfo.getField("logo").appendChunk(arrChunk);
                    }
                    // Copy the last remaining chunk.
                    else
                    {
                        while (ii < intLastChunkSize &&
                            (int)lngOffset < varLogo.size () )
                        {
                            lastChunk[ii] =
                                ((Byte)varLogo.elementAt
                                ((int)lngOffset)).byteValue();
                            ii++;
                            lngOffset++;

                        }
                        rstPubInfo.getField("logo").appendChunk(lastChunk);
                    }

                }

                // Update the new recordset with new logo.

                rstPubInfo.update();

                //Show the newly added data.
                System.out.println ("\nNew Record : " +
                    rstPubInfo.getField("pub_id").getString() + "\n");
                System.out.println ("Description : " +
                    rstPubInfo.getField("pr_info").getString() + "\n");
                System.out.println ("Logo Size : " +
                    rstPubInfo.getField("logo").getActualSize() );

                System.out.println ("\n\nPress <Enter> key to continue.");
                in.readLine();

                //Delete new records because this is a demonstration.
                rstPubInfo.requery();
                cnConn1.execute("DELETE FROM pub_info WHERE  pub_id = '" +
                    strPubID + "'");
                cnConn1.execute("DELETE FROM publishers WHERE  pub_id = '" +
                    strPubID + "'");

                //Cleanup objects before exit.
                rstPubInfo.close();
                cnConn1.close();
        }
        catch( AdoException ae )
            {
                // Notify user of any errors that result from ADO.

                // Check for null pointer for connection object.
                if(rstPubInfo.getActiveConnection()==null)
                        System.out.println("Exception: " + ae.getMessage());
                // As passing a Recordset, check for null pointer first.
                if (rstPubInfo != null)
                {
                    PrintProviderError(rstPubInfo.getActiveConnection());
                    PrintADOError(ae);
                }
                else
                {
                    System.out.println("Exception: " + ae.getMessage());
                }
        }
        // System Read requires this catch.
        catch( java.io.IOException je )
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }

    // PrintADOError Function

    static void PrintADOError(AdoException ae)
    {
        System.out.println("\t Error Source = " + ae.getSource() + "\n");
        System.out.println("\t Description = " + ae.getMessage() + "\n");
    }
}


Attributes、Name プロパティの例 (VJ++)

この例では、Connection、Field、および Property オブジェクトの Attributes プロパティの値を表示します。Name プロパティを使って、Field オブジェクトと Property オブジェクトの名前を表示します。

import com.ms.wfc.data.*;
import java.io.*;

public class AttributesX
{
    // The main entry point for the application
    public static void main (String[] args)
    {
        AttributesX();
        System.exit(0);
    }

    // AttributeX Function

    static void AttributesX()
    {
        // Define ADO Objects.
        Connection cnConn1 = null;
        Recordset rstEmployees = null;
        Fields listOfFields = null;
        AdoProperties listOfProperties = null;

        //Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=pubs;User Id=sa;Password=;";
        int recordDisplaySize = 15;
        int propertyCount = 0;
        try
        {
            // Open connection and recordset.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);

            rstEmployees = new Recordset ();
            rstEmployees.open("employee",
                cnConn1,AdoEnums.CursorType.FORWARDONLY,
                AdoEnums.LockType.READONLY, AdoEnums.CommandType.TABLE);

            // Display the attributes of the connection.
            System.out.println("Connection attributes = "
                + cnConn1.getAttributes());
            // Display the attributes of the Employees table's fields.
            System.out.println("\n\nField attributes : " + "\n");

            listOfFields = rstEmployees.getFields();

            for ( int i=0; i < listOfFields.getCount();i++)
            {
                System.out.println("\t\t" + listOfFields.getItem(i).getName()
                    + " = " + listOfFields.getItem(i).getAttributes());
            }

            // Display fields of the Employees table which are NULLABLE.
            System.out.println("\n\nNULLABLE Fields : " + "\n");
            for ( int i=0; i < listOfFields.getCount();i++)
            {
                if ((listOfFields.getItem(i).getAttributes() &
                    AdoEnums.FieldAttribute.ISNULLABLE) > 0)
                    System.out.println("\t\t" +
                    listOfFields.getItem(i).getName());

            }

            System.out.println ("\n\nPress <Enter> key to continue..");
            line = in.readLine();

            // Display the attributes of the Employees table's properties.
            System.out.println("\n\nProperty attributes : " );
            listOfProperties = rstEmployees.getProperties();
            for ( int i=0; i < listOfProperties.getCount() ;i++)
            {
                System.out.println("\t\t" +
                    listOfProperties.getItem(i).getName()
                    + " = " + listOfProperties.getItem(i).getAttributes());

                if (propertyCount == recordDisplaySize)
                {
                    System.out.println ("\n\nPress <Enter> key to continue.");
                    line = in.readLine();
                    propertyCount = 0;
                }
                propertyCount++;
            }

            System.out.println ("\n\nPress <Enter> key to continue.");
            line = in.readLine();

            //Cleanup objects before exit.
            rstEmployees.close();
            cnConn1.close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // Check for null pointer for connection object.
            if (rstEmployees.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());

            // As passing a Recordset, check for null pointer first.

            if (rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    //.PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


BeginTrans、CommitTrans、RollbackTrans メソッドの例 (VJ++)

この例では、データベースの Titles テーブル内のすべての心理学書の書籍種別を変更します。BeginTrans メソッドで、Titles テーブルへのすべての変更を独立させるトランザクションを開始した後、CommitTrans メソッドで、変更を保存します。RollbackTrans メソッドを使うと、Update メソッドで保存した変更を変更前の状態に戻せます。

import com.ms.wfc.data.*;
import java.io.*;

public class BeginTransX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        BeginTransX();
        System.exit(0);
    }

    // BeginTransX function
    static void BeginTransX()
    {
        // Define ADO Objects.
        Connection cnConn1 = null;
        Recordset rstTitles = null;

        //Declarations.
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=pubs;User Id=sa;Password=;";
        String strTitle;
        String strType;
        BufferedReader in =
            new BufferedReader (new InputStreamReader (System.in));
        String line = null;
        String strMessage="";
        int intChoice = 0;
        int recordDisplaySize = 15;
        int recordCount = 0;

        try
        {
            // Open a connection.

            cnConn1 = new Connection();
            cnConn1.open(strCnn,"","",AdoEnums.CommandType.UNSPECIFIED);

            // Open the Titles table.
            rstTitles = new Recordset ();
            rstTitles.setCursorType(AdoEnums.CursorType.DYNAMIC);
            rstTitles.setLockType(AdoEnums.LockType.PESSIMISTIC);
            rstTitles.open("titles",cnConn1,AdoEnums.CursorType.DYNAMIC ,
                AdoEnums.LockType.PESSIMISTIC ,AdoEnums.CommandType.TABLE );

            rstTitles.moveFirst();
            cnConn1.beginTrans();

            // Loop through recordset and ask user if he/she wants
            // to change the type for a specified title.

            while (!rstTitles.getEOF())
            {
                strType = rstTitles.getField("type").getString().trim();
                if ((rstTitles.getField("type").getString().
                    trim()).compareTo("psychology")== 0)
                {
                    strTitle = rstTitles.getField("title").getString().trim();
                    System.out.println("\nTitle : " + strTitle + "\n\n"
                        +  "Change type to self help (1 -> Yes / 2 -> No) ?");
                    // Change the title for the specified book.
                    line = in.readLine().trim();
                    intChoice = Integer.parseInt(line);
                    if ( intChoice == 1)
                    {
                        rstTitles.getField("type").setString("self_help");
                        rstTitles.update();
                    }
                }
                rstTitles.moveNext();
            }

            // Ask if the user wants to commit to all the
            // changes made above.
            System.out.println
                ("\n\nSave all changes (1 -> Yes / 2 -> No) ?");
            line = in.readLine().trim();
            intChoice = Integer.parseInt(line);
            if ( intChoice == 1)
                cnConn1.commitTrans();
            else
                cnConn1.rollbackTrans();

            // Print current data in recordset.
            rstTitles.requery();
            rstTitles.moveFirst();

            while(true)
            {
                strMessage = strMessage +"\n " +
                    rstTitles.getField("title").getString()+" - "
                    + rstTitles.getField("type").getString() ;

                if ( recordCount == recordDisplaySize)
                {
                    System.out.println(strMessage);
                    System.out.println("\n\nPress <Enter> key to continue..");
                    line = in.readLine();
                    strMessage = "";
                    recordCount = 0;
                }
                recordCount++;
                rstTitles.moveNext();
                if(rstTitles.getEOF())
                {
                    System.out.println(strMessage);
                    break;
                }
            }
            System.out.println("\n\nPress <Enter> key to continue..");
            line = in.readLine();

            // Restore original data because this
            // is a demonstration.
            rstTitles.moveFirst();
            while (!rstTitles.getEOF())
            {
                if ((rstTitles.getField("type").getString().
                    trim().compareTo("self_help"))== 0)
                {
                    rstTitles.getField("type").setString("psychology");
                    rstTitles.update();
                }
                rstTitles.moveNext();
            }
            //Cleanup objects before exit.
            rstTitles.close();
            cnConn1.close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // Check for null pointer for connection object.
            if(rstTitles.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());

            // As passing a Recordset, check for null pointer first.
            if (rstTitles != null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // System Read requires this catch.
        catch( java.io.IOException je )
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    //.PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


BOF、EOF、Bookmark プロパティの例 (VJ++)

この例では、BOF および EOF プロパティを使って、ユーザーが Recordset の先頭または最後のレコードを越えて移動しようとしたときに、メッセージが表示されるようにします。また、ユーザーが Recordset 内のレコードにフラグを付けるときのために、Bookmark プロパティを使って、後でそのレコードに戻れるようにします。

import com.ms.wfc.data.*;
import java.io.*;
import com.ms.com.*;

public class BOFEOFBookmark
{
    Variant varBookmark;
    BufferedReader in =
        new BufferedReader(new InputStreamReader(System.in));
    String line = null;

    // The main entry point for the application.

    public static void main (String[] args)
    {
        BOFEOFBookmark b1 = new BOFEOFBookmark ();
        b1.BOFX();
        b1.BOFX2();
        System.exit(0);
        try
        {
            b1.finalize();
        }
        catch(Throwable te)
        {
        }
    }

    // The main entry point for the application.

    public void BOFX()
    {
        // Declarations.
        Recordset rstPublishers = null;
        String strCnn;
        String strMessage;
        int intCommand = 0;

        strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=pubs;User Id=sa;Password=;";
        try
        {
            // Open a recordset with data from Publishers table.
            rstPublishers = new Recordset();
            rstPublishers.setCursorType(AdoEnums.CursorType.STATIC );
            rstPublishers.setCursorLocation(
                AdoEnums.CursorLocation.CLIENT);

            // Use client cursor to enable AbsolutePosition property.

            rstPublishers.open(new String(
                "SELECT pub_id,pub_name FROM Publishers ORDER BY pub_name"),
                strCnn, AdoEnums.CursorType.STATIC ,
                AdoEnums.LockType.BATCHOPTIMISTIC,
                AdoEnums.CommandType.TEXT );
            rstPublishers.moveFirst();

            //Display information about current record and get user input.
            while ( true)
            {
                strMessage = "\nPublisher :" +
                    rstPublishers.getField("pub_name").getString() + "\n"
                    + " (Record " + rstPublishers.getAbsolutePosition()
                    + " of " + rstPublishers.getRecordCount() + ")" + "\n\n"
                    + "Enter command : " + "\n"
                    + "[1 - next / 2 - previous /" + "\n"
                    + "3 - set bookmark / 4 - go to bookmark]" ;
                System.out.println (strMessage);
                line = in.readLine();
                //No entry exits loop.
                if (line.length() == 0)
                    break;
                //convert string entry to int.
                intCommand = Integer.parseInt(line);
                //out of range entry exits loop.
                if ((intCommand < 1) || (intCommand > 4)) break ;

                //Call method based on user's validated selection.
                MoveAny(intCommand, rstPublishers);
            }
            rstPublishers.close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstPublishers != null)
            {
                PrintProviderError(rstPublishers.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // This catch is required if input string cannot be converted to
        // Integer data type. "TCS[VSD]"

        catch ( java.lang.NumberFormatException ne)
        {
            System.out.println("\nException: Integer Input required." );
        }

        // System Read requires this catch.
        catch( java.io.IOException je )
        {
            PrintIOError(je);
        }
    }

    // MoveAny Function

    public void MoveAny(int intChoice, Recordset rsTemp)
    {
        // Move Forward or backword per selection from user,
        // trapping for BOF and EOF.
        try
        {
            switch(intChoice)
            {
                case 1:   // Equals char of 1.
                    rsTemp.moveNext();
                    if (rsTemp.getEOF())
                    {
                        System.out.println (
                            "\nMoving past the last record \nTry again." );
                        rsTemp.moveLast();
                    }
                    break;
                case 2:   // Equals char of 2.
                    rsTemp.movePrevious();
                    if (rsTemp.getBOF())
                    {
                        System.out.println (
                            "\nMoving past the first record \nTry again." );
                        rsTemp.moveFirst();
                    }
                    break;
                case 3:   // Equals char of 3.
                    // Store the bookmark of the current record.
                    varBookmark = (Variant)rsTemp.getBookmark();
                    break;
                case 4:    // Equals char of 4.
                    // Go to the record indicated by the stored bookmark.
                    if (varBookmark == null)
                        System.out.println ("\nNo bookmark set!");
                    else
                        rsTemp.setBookmark((Object)varBookmark);
                    break;
                default:
                    break;
            }
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rsTemp != null)
            {
                PrintProviderError(rsTemp.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    //.PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }

         ////////////////////////////////////////////
        //            BOFX2() Function.           //
      ////////////////////////////////////////////

        public void BOFX2()
        {
            Recordset rs = null ;

        try
            {
                // Declarations.
                rs = new Recordset();
                Variant[] arrbmk = new Variant[11];
                rs.setCursorLocation( AdoEnums.CursorLocation.CLIENT);
                String strCnn = "Provider=MSDASQL;Data Source=Pubs DSN;"
                        + "Initial Catalog=pubs;User Id=sa;Password=;";
                rs.setActiveConnection (strCnn);
                // Open recorset with data from authors table.
                rs.open((new  String("SELECT * FROM authors")),strCnn,AdoEnums.CursorType.STATIC ,AdoEnums.LockType.BATCHOPTIMISTIC,AdoEnums.CommandType.TEXT );
                System.out.println ("\nNumber of records before filtering : " + rs.getRecordCount() );
                int ii = 0;

                // Create array of bookmarks.
                while (rs.getEOF() != true && ii < 11)
                {
                    arrbmk[ii] = (Variant)rs.getBookmark();
                    ii++;
                    rs.move (2);
                }

                // set Filter to recordset.
                Variant bmk=new Variant();
                bmk.putVariantArray(arrbmk);
                rs.setFilter(bmk);
                System.out.println ("\nNumber of records after filtering : " + rs.getRecordCount() );

                // Dislay the records after filtering.
                rs.moveFirst();
                while (!rs.getEOF())
                {
                    System.out.println ("\t" +rs.getAbsolutePosition() + "  " +rs.getField("au_lname").getString());
                    rs.moveNext();
                }
                rs.close();
                System.out.println ("\n\nPress <Enter> key to continue.");
                in.readLine();

            }
            catch( AdoException ae )
            {
                // Notify user of any errors that result from ADO.

                // As passing a Recordset, check for null pointer first.
                if (rs != null)
                {
                    PrintProviderError(rs.getActiveConnection());
                    System.out.println("Exception: " + ae.getMessage());
                }
                else
                {
                    System.out.println("Exception: " + ae.getMessage());
                }
            }
            // System Read requires this catch.
            catch( java.io.IOException je )
            {
                PrintIOError(je);
            }
        }
    }


CacheSize プロパティの例 (VJ++)

この例では、CacheSize プロパティを使って、30 レコードのキャッシュを使用した場合と使用しない場合のパフォーマンスの違いを示します。

import com.ms.wfc.data.*;
import java.io.* ;

public class CacheSizeX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        CacheSizeX();
        System.exit(0);
    }

    // CacheSizeX function

    static void CacheSizeX()
    {

        // Define ADO Objects.
        Recordset rstRoySched = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=Pubs;User Id=sa;Password=;";

        long timeStart;
        long timeEnd;
        float timeNoCache;
        float timeCache;
        int   intLoop;
        String strTemp;

        try
        {
            // Open the RoySched table.
            rstRoySched = new Recordset();
            rstRoySched.open("roysched", strCnn,
                AdoEnums.CursorType.FORWARDONLY,
                AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE);

            // Enumerate the Recordset object twice and record
            // the elapsed time.

            timeStart = System.currentTimeMillis();
            for ( intLoop = 0; intLoop < 2; intLoop++)
            {
                rstRoySched.moveFirst();
                while (!rstRoySched.getEOF())
                {
                    // Execute a simple operation for the
                    // performance test.
                    strTemp = rstRoySched.getField("title_id").getString();
                    rstRoySched.moveNext();
                }

            }

            timeEnd = System.currentTimeMillis();
            timeNoCache =(float)(timeEnd - timeStart)/1000f;

            // Cache records in groups of 30 records.
            rstRoySched.moveFirst();
            rstRoySched.setCacheSize(30);
            timeStart = System.currentTimeMillis();

            // Enumerate the Recordset object twice and record
            // the elapsed time.
            for ( intLoop = 0; intLoop < 2; intLoop++)
            {
                rstRoySched.moveFirst();
                while (!rstRoySched.getEOF())
                {
                    // Execute a simple operation for the
                    // performance test.

                    strTemp = rstRoySched.getField("title_id").getString();
                    rstRoySched.moveNext();
                }

            }

            timeEnd = System.currentTimeMillis();
            timeCache = (float)(timeEnd - timeStart)/1000f;

            // Display performance results.
            System.out.println("\nCaching Performance Results:");
            System.out.println("\n\tNo Cache: " + timeNoCache + " seconds");
            System.out.println("\n\t30-record cache: " + timeCache +
                " seconds");
            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup objects before exit.
            rstRoySched.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // Check for null pointer for connection object.
            if (rstRoySched.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());

            // As passing a Recordset, check for null pointer first.
            if (rstRoySched != null)
            {
                PrintProviderError(rstRoySched.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Cancel メソッドの例 (VJ++)

この例では、Cancel メソッドを使って、接続がビジー状態の場合に、Connection オブジェクトで実行されるコマンドを中止します。

import com.ms.wfc.data.*;
import java.io.* ;

public class CancelX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        CancelX();
        System.exit(0);
    }

    // CancelX function

    static void CancelX()
    {
        // Define command strings.
        String strCmdChange = "UPDATE titles SET type = 'self_help' "
            + "WHERE type = 'psychology'";
        String strCmdRestore = "UPDATE titles SET type = 'psychology' "
            + "WHERE type = 'self_help'";
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=Pubs;User Id=sa;Password=;";

        // Define ADO Objects.
        Connection cnConn1 = null;

        //Declarations.
        boolean booChanged = false;
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;

        try
        {
            // Open a connection.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);

            // Begin a transaction, then execute a command asynchronously.
            cnConn1.beginTrans();
            cnConn1.execute(strCmdChange,
                AdoEnums.ExecuteOption.ASYNCEXECUTE);

            // do something else for a little while - this could be changed.

            for (int intLoop = 0; intLoop < 10; intLoop++)
            {
                System.out.println(intLoop);
            }

            // If the command has NOT completed, cancel the execute
            // and roll back the transaction. Otherwise, commit the
            // transaction.

            if ((cnConn1.getState() & AdoEnums.ObjectState.EXECUTING) > 0)
            {
                cnConn1.cancel();
                cnConn1.rollbackTrans();
                booChanged = false;
                System.out.println("\nUpdate canceled.");
            }
            else
            {
                cnConn1.commitTrans();
                booChanged = true;
                System.out.println("\nUpdate complete.");
            }

            //If the change was made, restore the data
            // because this is a demonstration.

            if(booChanged )
            {
                cnConn1.execute(strCmdRestore);
                System.out.println("\nData restored.");
            }

            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup objects before exit.
            cnConn1.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a connection, check for null pointer first.
            if (cnConn1 != null)
            {
                PrintProviderError(cnConn1);
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Clone メソッドの例 (VJ++)

この例では、Clone メソッドを使って Recordset のコピーを作成し、ユーザーがそれぞれのコピーのレコード ポインタを個別に配置できるようにします。

import com.ms.wfc.data.*;
import java.io.* ;

public class CloneX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        CloneX();
        System.exit(0);
    }

    // CloneX function

    static void CloneX()
    {
        // Assign SQL statement and connection string to variables.
        String strSQL = "SELECT stor_name FROM Stores "
            + "ORDER BY stor_name";

        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=Pubs;User Id=sa;Password=;";

        // Define ADO Objects.
        Recordset[] arstStores = null;

        //Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strMessage;
        String strFind;
        int  intLoop;
        boolean booExit = true;

        try
        {
            // Open recordset as a static cursor type recordset.
            arstStores = new Recordset[3];
            arstStores[0] = new Recordset();
            arstStores[0].setCursorType(AdoEnums.CursorType.STATIC);
            arstStores[0].setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
            arstStores[0].open(strSQL,strCnn,AdoEnums.CursorType.STATIC,
                AdoEnums.LockType.BATCHOPTIMISTIC,AdoEnums.CommandType.TEXT);

            // Create two clones of the original Recordset.
            arstStores[1] = (Recordset)arstStores[0].clone
                (AdoEnums.LockType.BATCHOPTIMISTIC);
            arstStores[2] = (Recordset)arstStores[0].clone
                (AdoEnums.LockType.BATCHOPTIMISTIC);

            while(booExit)
            {
                // Loop through the array so that on each pass,
                // the user is searching a different copy of the
                // same Recordset.
                for (intLoop = 0; intLoop < 3; intLoop++)
                {
                    // Ask for search string while showing where
                    // the current record pointer is for each Recordset
                    strMessage = "\nRecordsets from stores table:" + "\n"
                        +  "  1 - Original - Record pointer at "
                        + arstStores[0].getField("stor_name").getString()
                        + "\n" + "  2 - Clone - Record pointer at "
                        + arstStores[1].getField("stor_name").getString()
                        + "\n" + "  3 - Clone - Record pointer at "
                        + arstStores[2].getField("stor_name").getString()
                        + "\n";
                    System.out.println(strMessage);
                    System.out.println("Enter search string for #"
                        + (intLoop+1) + "(Press <Enter> to Exit.)");

                    strFind = in.readLine().trim();
                    if (strFind.length() == 0)
                    {
                        booExit = false;
                        break;
                    }

                    // Find the search string; if there's no
                    // match, jump to the last record.
                    arstStores[intLoop].setFilter("stor_name >= '" +
                        strFind + "'");
                    if (arstStores[intLoop].getEOF())
                    {
                        arstStores[intLoop].setFilter
                            (new Integer(AdoEnums.FilterGroup.NONE));
                        arstStores[intLoop].moveLast();
                    }
                }
            }
            // Cleanup objects before exit.
            arstStores[0].close();
            arstStores[1].close();
            arstStores[2].close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a connection, check for null pointer first.
            if (arstStores[0] != null)
            {
                PrintProviderError(arstStores[0].getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


CompareBookmarks メソッドの例 (VJ++)

この例では、CompareBookmarks メソッドの機能を示します。通常、ブックマークの相対的な値は、特別なブックマークでない限り、必要ではありません。

Authors テーブルから取得した Recordset の任意の行を、検索の対象として指定します。次に、その検索対象に対する各行の相対的な位置を表示します。

import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class CompareBookmarksX //
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        CompareBookmarksX();
        System.exit(0);
    }

    // CompareBookmarksX function

    static void CompareBookmarksX()
    {
        // Define ADO Objects.
        Recordset rstAuthors = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";
        int intCount;
        Variant varTarget = null;
        int intResult;
        String strAns;
        int intDisplaySize = 15;

        try
        {
            rstAuthors = new Recordset();
            rstAuthors.open("SELECT * FROM authors",
                strCnn,
                AdoEnums.CursorType.STATIC,
                AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TEXT);
            intCount = rstAuthors.getRecordCount();
            System.out.println("Rows in the Recordset = " +
                Integer.toString(intCount));

            // Exit if an empty recordset.
            if(intCount == 0)
                System.exit(0);

            // Randomize.
            intCount = (int)(intCount * Math.random());
            // Get position between 0 and count-1.
            System.out.println("\nRandomly chosen row position = " +
                Integer.toString(intCount)+ "\n");
            rstAuthors.move(intCount,new Integer(AdoEnums.Bookmark.FIRST));             // Move row to random position.
            varTarget = (Variant)rstAuthors.getBookmark();
            // Remember the mystery row.
            intCount = 0;
            rstAuthors.moveFirst();

            // Loop through recordset.
            while(!rstAuthors.getEOF())
            {
                intResult = rstAuthors.compareBookmarks
                    ((Variant)rstAuthors.getBookmark(), varTarget);
                if(intResult == AdoEnums.Compare.NOTEQUAL)
                    System.out.println("Row " +
                        Integer.toString(intCount) +
                        ": Bookmarks are not equal.");
                else if(intResult == AdoEnums.Compare.NOTCOMPARABLE)
                    System.out.println("Row " +
                        Integer.toString(intCount) +
                        ": Bookmarks are not comparable.");
                else
                {
                    switch(intResult)
                    {
                    case AdoEnums.Compare.LESSTHAN :
                        strAns = "less than";
                        break;
                    case AdoEnums.Compare.EQUAL :
                        strAns = "equal to";
                        break;
                    case AdoEnums.Compare.GREATERTHAN :
                        strAns = "greater than";
                        break;
                    default :
                        strAns = "in error comparing to";
                        break;
                    }
                    System.out.println("Row position " +
                        Integer.toString(intCount) +
                        " is " + strAns + " the target.");
                }
                if(intCount % intDisplaySize == 0 && intCount > 0)
                {
                    System.out.println("\nPress <Enter> to continue..");
                    in.readLine();
                }
                intCount++;
                rstAuthors.moveNext();
            }

            // Cleanup objects before exit.
            rstAuthors.close();
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


ConnectionString、ConnectionTimeout、State プロパティの例 (VJ++)

この例では、Connection オブジェクトを開くための、ConnectionString プロパティのさまざまな使い方を示します。また、ConnectionTimeout プロパティを使って接続のタイムアウト時間を設定し、State プロパティを使って接続の状態を確認します。このプロシージャを実行するには、Getstate 関数が必要です。

import com.ms.wfc.data.*;
import java.io.* ;

public class ConnectionStringX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        ConnectionStringX();
        System.exit(0);
    }

    // ConnectionStringX function

    static void ConnectionStringX()
    {
        // Define ADO Objects.
        Connection cnConn1 = null;
        Connection cnConn2 = null;
        Connection cnConn3 = null;
        Connection cnConn4 = null;

        //Declarations.

        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strTemp;

        try
        {
            // Open a connection without using a Data Source Name (DSN).
            cnConn1 = new Connection();
            cnConn1.setConnectionString("driver={SQL Server};"
                + "server=srv;uid=sa;pwd=;database=Pubs");
            cnConn1.setCommandTimeout(30);
            cnConn1.open();

            // Open a connection using a DSN and ODBC tags.
            cnConn2 = new Connection();
            cnConn2.setConnectionString("DSN=Pubs;UID=sa;PWD=;");
            cnConn2.open();

            // Open a connection using a DSN and OLE DB tags.
            cnConn3 = new Connection();
            cnConn3.setConnectionString
                ("Data Source=Pubs;User ID=sa;Password=;");
            cnConn3.open();

            // Open a connection using a DSN and individual
            // arguments instead of a connection string.
            cnConn4 = new Connection();
            cnConn4.open("Pubs", "sa", "");

            // Display the state of the connections.
            strTemp = getState(cnConn1.getState());
            System.out.println("CnConn1 state: " + strTemp);
            strTemp = getState(cnConn2.getState());
            System.out.println("CnConn2 state: " + strTemp);
            strTemp = getState(cnConn3.getState());
            System.out.println("CnConn3 state: " + strTemp);
            strTemp = getState(cnConn4.getState());
            System.out.println("CnConn4 state: " + strTemp);

            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup objects before exit.
            cnConn1.close();
            cnConn2.close();
            cnConn3.close();
            cnConn4.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            System.out.println("Exception: " + ae.getMessage());

        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // getState Function

    static String getState(int intState)
    {
        // Returns current state of the connection object.
        String strState=null;

        switch(intState)
        {
        case AdoEnums.ObjectState.CLOSED :
            strState = new String("adStateClosed");
            break;
        case AdoEnums.ObjectState.OPEN  :
            strState = new String("adStateOpen");
            break;
        default :
            break;
        }
        return strState;
    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Count プロパティの例 (VJ++)

この例では、Employees データベース内の 2 つのコレクションで Count プロパティを使用します。このプロパティで、各コレクション内のオブジェクト数を取得し、これらのコレクションを列挙するループに上限を設定します。

import com.ms.wfc.data.*;
import java.io.* ;

public class CountX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        CountX();
        System.exit(0);
    }

    // CountX function

    static void CountX()
    {

        // Define ADO Objects.
        Recordset rstEmployees = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=Pubs;User Id=sa;Password=;";

        int intLoop;
        int intDisplaySize = 20;
        int recCount=0;

        try
        {
            rstEmployees = new Recordset();

            // Open recordset with data from Employees table.
            rstEmployees.open("employee", strCnn,
                AdoEnums.CursorType.FORWARDONLY,
                AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE);

            // Print information about Fields collection.
            System.out.println(rstEmployees.getFields().getCount() +
                " Fields in Employees");
            for ( intLoop = 0; intLoop <
                rstEmployees.getFields().getCount(); intLoop++)
            {
                System.out.println("\t" +
                    rstEmployees.getFields().getItem(intLoop).getName());
            }
            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Print information about Properties collection.
            System.out.println(rstEmployees.getProperties().getCount() +
                " Properties in Employees");
            for ( intLoop = 0; intLoop <
                rstEmployees.getProperties().getCount(); intLoop++)
            {
                System.out.println("\t" +
                    rstEmployees.getProperties().getItem(intLoop).getName());
                recCount++;
                if ( recCount >= intDisplaySize)
                {
                    System.out.println("\n\nPress <Enter> to continue..");
                    in.readLine();
                    recCount = 0;
                }
            }
            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup objects before exit.
            rstEmployees.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // Check for null pointer for connection object.
            if (rstEmployees.getActiveConnection()==null)
            {
                System.out.println("Exception: " + ae.getMessage());
            }
            else
            {
                // As passing a Recordset, check for null pointer first.
                if (rstEmployees != null)
                {
                    PrintProviderError(rstEmployees.getActiveConnection());
                }
                else
                {
                    System.out.println("Exception: " + ae.getMessage());
                }
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


CursorType、LockType、EditMode プロパティの例 (VJ++)

この例では、Recordset を開く前に CursorType および LockType プロパティを設定します。また、さまざまな条件下での EditMode プロパティの値も示します。このプロシージャを実行するには、EditModeOutput 関数が必要です。

import com.ms.wfc.data.*;
import java.io.* ;

public class EditModeX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        EditModeX ();
        System.exit(0);
    }

    // EditModeX function

    static void EditModeX ()
    {

        // Define ADO Objects.
        Connection cnConn1 = null;
        Recordset rstEmployees = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=Pubs;User Id=sa;Password=;";

        try
        {
            // Open recordset with data from Employees table.

            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            rstEmployees = new Recordset();
            rstEmployees.setActiveConnection(cnConn1);
            rstEmployees.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            rstEmployees.setCursorType(AdoEnums.CursorType.STATIC);
            rstEmployees.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
            rstEmployees.open("employee", cnConn1,
                AdoEnums.CursorType.STATIC,
                AdoEnums.LockType.BATCHOPTIMISTIC,
                AdoEnums.CommandType.TABLE);

            // Show the EditMode property under different editing states.

            rstEmployees.addNew();
            rstEmployees.getField("emp_id").setString("T-T55555M");
            rstEmployees.getField("fname").setString("temp_fname");
            rstEmployees.getField("lname").setString("temp_lname");
            EditModeOutput("After AddNew:", rstEmployees.getEditMode());
            rstEmployees.updateBatch();
            EditModeOutput("After Update:", rstEmployees.getEditMode());
            rstEmployees.getField("fname").setString("test");
            EditModeOutput("After Edit:", rstEmployees.getEditMode());

            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Delete new record because this is a demonstration.
            cnConn1.execute(
                "DELETE FROM employee WHERE emp_id = 'T-T55555M'");

            // Cleanup objects before exit.
            rstEmployees.close();
            cnConn1.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // Check for null pointer for connection object.
            if (cnConn1==null)
                System.out.println("Exception: " + ae.getMessage());

            // As passing a Recordset, check for null pointer first.
            if (rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // EditModeOutput Function

    static void EditModeOutput(String strTemp, int intEditMode)
    {
        String strMessage="";
        // Print report based on the value of the EditMode
        // property.

        System.out.println("\n" + strTemp);
        strMessage ="\n\tEditMode = ";
        switch(intEditMode)
        {
        case AdoEnums.EditMode.NONE :
            strMessage+="adEditNone";
            break;
        case AdoEnums.EditMode.INPROGRESS :
            strMessage+="adEditInProgress";
            break;
        case AdoEnums.EditMode.ADD :
            strMessage+="adEditAdd";
            break;
        default :
            break;
        }
        System.out.println(strMessage);
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Delete メソッドの例 (VJ++)

この例では、Delete メソッドを使って、指定されたレコードを Recordset から削除します。

// The WFC class includes the ADO objects.

import com.ms.wfc.data.*;
import java.io.* ;

public class DeleteX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        DeleteX();
        System.exit(0);
    }

    // DeleteX function

    static void DeleteX()
    {

        // Define ADO Objects.
        Recordset rstRoySched = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=Pubs;User Id=sa;Password=;";

        String  strMessage="";
        String  strTitleID;
        int intLoRange =0;
        int intHiRange =0;
        int intRoyalty =0;
        boolean bolFound;

        try
        {
            rstRoySched = new Recordset();
            rstRoySched.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            rstRoySched.setCursorType(AdoEnums.CursorType.STATIC);
            rstRoySched.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);

            // Open RoySched table.
            rstRoySched.open("SELECT * FROM roysched " +
                "WHERE royalty = 20", strCnn,
                AdoEnums.CursorType.STATIC,
                AdoEnums.LockType.BATCHOPTIMISTIC,
                AdoEnums.CommandType.TEXT);

            // Prompt for a record to delete.
            strMessage = "Before delete there are "
                + rstRoySched.getRecordCount()
                + " titles with 20 percent royalty:" + "\n\n";
            while(!rstRoySched.getEOF())
            {
                strMessage += rstRoySched.getField("title_id").getString() +
                    "\n\n";
                rstRoySched.moveNext();
            }
            strMessage += "Enter the ID of a record to delete:" + "\n";
            System.out.println(strMessage);
            strTitleID = in.readLine().trim().toUpperCase();

            // Move to the record and save data so it can be restored.
            rstRoySched.setFilter("title_id = '" + strTitleID + "'");
            if(!(rstRoySched.getRecordCount()==0))
            {
                intLoRange = rstRoySched.getField("lorange").getInt();
                intHiRange = rstRoySched.getField("hirange").getInt();
                intRoyalty = rstRoySched.getField("royalty").getInt();
                bolFound = true;
            }
            else
            {
                System.out.println("\nIncorrect ID. No Record deleted." );
                bolFound = false;
            }

            // Delete the record.
            if(bolFound)
            {
                rstRoySched.delete();
                rstRoySched.updateBatch();
            }
            // Show the results.
            rstRoySched.setFilter(new Integer(AdoEnums.FilterGroup.NONE));
            rstRoySched.requery();
            strMessage ="";
            strMessage = "\n\nAfter delete there are "
                + rstRoySched.getRecordCount()
                + " titles with 20 percent royalty:" + "\n\n";
            while(!rstRoySched.getEOF())
            {
                strMessage += rstRoySched.getField("title_id").getString() +
                    "\n\n";
                rstRoySched.moveNext();
            }
            System.out.println(strMessage);
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();

            // Restore the data because this is a demonstration.
            if(bolFound)
            {
                rstRoySched.addNew();
                rstRoySched.getField("title_id").setString(strTitleID);
                rstRoySched.getField("lorange").setInt(intLoRange);
                rstRoySched.getField("hirange").setInt(intHiRange);
                rstRoySched.getField("royalty").setInt(intRoyalty);
                rstRoySched.updateBatch();
            }

            // Cleanup objects before exit.
            rstRoySched.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
                if (rstRoySched != null)
                {
                    PrintProviderError(rstRoySched.getActiveConnection());
                    System.out.println("Exception: " + ae.getMessage());
                }
                else
                {
                    System.out.println("Exception: " + ae.getMessage());
                }

        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Description、NativeError、Number、Source、SQLState プロパティの例 (VJ++)

この例では、エラーを発生させてトラップし、生成された Error オブジェクトの Description、HelpContext、HelpFile、NativeError、Number、Source、および SQLState プロパティを表示します。

// The WFC class includes the ADO objects.

import com.ms.wfc.data.*;
import java.io.* ;

public class DescriptionX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        DescriptionX();
        System.exit(0);
    }

    // DescriptionX function

    static void DescriptionX()
    {

        // Define ADO Objects.
        Connection cnConn1 = null;

        try
        {
            // Intentionally trigger an error.
            cnConn1 = new Connection();
            cnConn1.open("nothing");
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.
            PrintProviderError(cnConn1);
        }

    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Execute、Requery、Clear メソッドの例 (VJ++)

この例では、Command オブジェクトの Execute メソッドを実行する場合と Connection オブジェクトの Execute メソッドを実行する場合を示します。また、Requery メソッドを使用してレコードセット内の最新のデータを取得し、Clear メソッドを使用して Errors コレクションの内容をクリアします。このプロシージャを実行するには、ExecuteCommand と PrintOutput プロシージャが必要です。

// The WFC class includes the ADO objects.
import com.ms.wfc.data.*;

public class ExecuteX
{
// Main Function

public static void main (String[] args)
{
    ExecuteX();
    System.exit(0);
}

// ExecuteX Function

static void ExecuteX()
{
    // Define string variables.
    String strSQLChange = "UPDATE Titles SET Type = "
            + "'self_help' WHERE Type = 'psychology'";
    String strSQLRestore = "UPDATE Titles SET Type = "
            + "'psychology' WHERE Type = 'self_help'";
    String strCnn = "Provider=sqloledb;Data Source=Server4;"
            + "Initial Catalog=Pubs;User Id=sa;Password=;";

    // Define ADO objects.
    Connection  cnConn1    = null;
    Command  cmdChange  = null;
    Recordset  rsTitles  = null;

    try
    {
        // Open connection.
        cnConn1 = new Connection ();
        cnConn1.open(strCnn, "", "", AdoEnums.CommandType.UNSPECIFIED);

        // Create command object.
        cmdChange = new Command();
        cmdChange.setActiveConnection (cnConn1);
        cmdChange.setCommandText (strSQLChange);

        // Open recordset with Titles table.
        rsTitles = new Recordset();
        rsTitles.open("Titles", cnConn1,
                      AdoEnums.CursorType.STATIC,
                      AdoEnums.LockType.OPTIMISTIC,
                      AdoEnums.CommandType.TABLE);

        // Print report of original data.
        System.out.println("\n\n\tData in Titles table "
                           + "before executing the query: \n");
        PrintOutput(rsTitles);

        // Clear extraneous errors from the Errors collection.
        cnConn1.getErrors().clear();

        // Call the ExecuteCommand subroutine to
        // execute cmdChange command.
        ExecuteCommand(cmdChange, rsTitles);

        // Print report of new data.
        System.out.println("\n\n\tData in Titles table after "
            + "executing the query: \n");
        PrintOutput(rsTitles);

        // Use the Connection object's execute method to
        // execute SQL statement to restore data.
        cnConn1.execute(strSQLRestore);

        // Print report of restored data.
        System.out.println("\n\n\tData after executing the query "
            + "to restore the original information: \n");
        PrintOutput(rsTitles);

        // Clean up objects before exit.
        rsTitles.close();
        cnConn1.close();
    }  // End Try statement.
    catch( AdoException ae )
    {
        // Notify user of any errors that result from ADO.

        // As passing a Recordset, check for null pointer first.
        if (rsTitles != null)
        {
            PrintProviderError(rsTitles.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getMessage());
        }
    }
}

// ExecuteCommand Function

static void ExecuteCommand(Command cmdTemp, Recordset rstTemp)
{
    try
    {
        // CommandText property already set before function was called.
        cmdTemp.setCommandType(AdoEnums.CommandType.TEXT);
        cmdTemp.execute();

        // Retrieve the current data by requerying the recordset.
        rstTemp.requery(AdoEnums.CommandType.UNKNOWN);
    }
    catch( AdoException ae )
    {
        // Notify user of any errors that result from ADO.
        PrintProviderError(rstTemp.getActiveConnection());
    }
}

//  PrintOutput Function

static void PrintOutput(Recordset rstTemp)
{
    // Ensure at top of recordset.
    rstTemp.moveFirst();

    // If EOF is true, then no data and skip print loop.
    if( rstTemp.getEOF() )
    {
        System.out.println("\tRecordset empty\n");
    }
    else
    {
        // Enumerate Recordset and print data from each.
        while( !(rstTemp.getEOF()) )
        {
            // Convert variant string to convertable string type.
            System.out.println("\t"
                + rstTemp.getFields().getItem("Title").getValue() + " "
                + rstTemp.getFields().getItem("Type").getValue() + "\n");
            rstTemp.moveNext();
        }
    }
}

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Filter、RecordCount プロパティの例 (VJ++)

この例では、Filter プロパティを使って、既存の Recordset に適用されている特定の条件に基づいて新規 Recordset を開きます。RecordCount プロパティを使って、2 つのレコードセット内のレコードの数を示します。このプロシージャを実行するには、FilterField 関数が必要です。

// The WFC class includes the ADO objects.

import com.ms.wfc.data.*;
import java.io.* ;

public class FilterX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        FilterX();
        FilterX2();
        System.exit(0);
    }

    // FilterX function
    static void FilterX()
    {

        // Define ADO Objects.
        Recordset rstPublishers = null;
        Recordset rstPublishersCountry = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=Pubs;User Id=sa;Password=;";

        int intPublisherCount;
        String strCountry;
        String strMessage;

        try
        {
            rstPublishers = new Recordset();

            // Open recordset with data from Publishers table.
            rstPublishers.setCursorType(AdoEnums.CursorType.STATIC);
            rstPublishers.open("publishers", strCnn,
                          AdoEnums.CursorType.STATIC,
                          AdoEnums.LockType.READONLY,
                          AdoEnums.CommandType.TABLE);

            // Populate the Recordset.
            intPublisherCount = rstPublishers.getRecordCount();

            // Get user input.
            System.out.println("Enter a country to filter on:");
            strCountry = in.readLine().trim();

            if(!strCountry.equals(""))
            {
                // Open a filtered Recordset object.
                rstPublishersCountry =
                    FilterField(rstPublishers, "Country", strCountry);
                if(rstPublishersCountry.getRecordCount()==0)
                    System.out.println("\nNo publishers from that country.");
                else
                {
                    // Print number of records for the original
                    // Recordset object and the filtered Recordset
                    // object.
                    strMessage = "\nOrders in original recordset: " + "\n"
                        + intPublisherCount + "\n"
                        + "Orders in filtered recordset (Country = '"
                        + strCountry + "'): \n"
                        + rstPublishersCountry.getRecordCount();
                    System.out.println(strMessage);
                }
                rstPublishersCountry.close();
            }
            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup objects before exit.
            rstPublishers.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstPublishers != null)
            {
                PrintProviderError(rstPublishers.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }

        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // FilterField Function

    static Recordset FilterField(Recordset rstTemp,String strField,
                                 String strFilter)
    {
        // Set a filter on the specified Recordset object and then
        // open a new Recordset object.
        rstTemp.setFilter(strField + " = '" + strFilter + "'");
        return rstTemp;
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }

    // FilterX2 function

    static void FilterX2()
    {

        // Define ADO Objects.
        Recordset rstPublishers = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=Pubs;User Id=sa;Password=;";

        try
        {
            rstPublishers = new Recordset();

            // Open recordset with data from Publishers table.
            rstPublishers.setCursorType(AdoEnums.CursorType.STATIC);
            rstPublishers.open("SELECT * FROM publishers " +
                                "WHERE Country = 'USA'", strCnn,
                                AdoEnums.CursorType.STATIC,
                                AdoEnums.LockType.READONLY,
                                AdoEnums.CommandType.TEXT);

            // Print current data in recordset.
            rstPublishers.moveFirst();
            while(!rstPublishers.getEOF())
            {
                System.out.println(rstPublishers.getField("pub_name").getString()
                               +", "
                               + rstPublishers.getField("country").getString());
                rstPublishers.moveNext();
            }
            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup objects before exit.
            rstPublishers.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // Check for null pointer for connection object.
            if (rstPublishers.getActiveConnection()==null)
            {
                    System.out.println("Exception: " + ae.getMessage());
            }
            else
            {
                // As passing a Recordset, check for null pointer first.
                if (rstPublishers != null)
                {
                    PrintProviderError(rstPublishers.getActiveConnection());
                }
                else
                {
                    System.out.println("Exception: " + ae.getMessage());
                }
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }
}


Find メソッドの例 (VJ++)

この例では、Recordset オブジェクトの Find メソッドを使って、Pubs データベースのビジネス タイトルを検索して位置を定め、その数をカウントします。この例は、基になるプロバイダが類似の機能をサポートしていない場合を想定しています。

// The WFC class includes the ADO objects.
import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class FindX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        FindX();
        System.exit(0);
    }

    // FindX function

    static void FindX()
    {

        // Define ADO Objects.
        Connection cnConn1 = null;
        Recordset rstTitles = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";
        Variant varMark = null;
        int intCount = 0;

        try
        {
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            rstTitles = new Recordset();
            rstTitles.open("SELECT title_id FROM titles",
                    cnConn1,
                    AdoEnums.CursorType.STATIC,
                    AdoEnums.LockType.READONLY,
                    AdoEnums.CommandType.TEXT);

            //  The default parameters are sufficient to search forward
            //  through a Recordset.
            rstTitles.find("title_id LIKE 'BU%'");

            // Skip current record to avoid finding the same row repeatedly.
            // The bookmark is redundant because Find searches from current
            // position.
            while(!rstTitles.getEOF()) // Continue if last find succeeded.
            {
                System.out.println("Title ID: "
                                   + rstTitles.getField("title_id").getString());
                intCount++; // Count the last title found.
                varMark = (Variant)rstTitles.getBookmark();
                // Note current position.
                rstTitles.find("title_id LIKE 'BU%'",
                         1,
                         AdoEnums.SearchDirection.FORWARD,
                         varMark);
            }

            // Cleanup objects before exit.
            rstTitles.close();
            cnConn1.close();

            System.out.println("\nThe number of business titles is " +
                               Integer.toString(intCount));
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstTitles != null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


GetRows メソッドの例 (VJ++)

この例では、GetRows メソッドを使って、指定された数の行を Recordset から取得し、結果のデータを配列に格納します。GetRows メソッドでは、次の 2 つのケースにおいて、要求された行数よりも少ない数が返される場合があります。1 つは EOF に達した場合で、もう 1 つは GetRows が別のユーザーによって削除されたレコードを取得しようとした場合です。関数は、2 番目のケースが発生した場合にのみ、False を返します。このプロシージャを実行するには、GetRowsOK 関数が必要です。

// The WFC class includes the ADO objects.

import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class GetRowsX
{
     // The main entry point for the application.

    static Variant avarRecords = null;

    public static void main (String[] args)
    {
        GetRowsX();
        System.exit(0);
    }

    // GetRowsX  function

    static void GetRowsX()
    {

        // Define ADO Objects.
        Recordset rstEmployees = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=Pubs;User Id=sa;Password=;";

        int intRows;
        int intRecord;
        int intUBound;
        int intDisplaysize = 15;

        try
        {
            // Open recordset with names and hire dates from Employees table.
            rstEmployees = new Recordset();
            rstEmployees.open("SELECT fName, lName, hire_date " +
                                "FROM Employee ORDER BY lName", strCnn,
                                AdoEnums.CursorType.FORWARDONLY,
                                AdoEnums.LockType.READONLY,
                                AdoEnums.CommandType.TEXT);

            while(true)
            {
                // Get user input for number of rows.
                System.out.println(
                "\nEnter number of rows to retrieve. (<= 0 to Exit)");
                line = in.readLine().trim();

                // Convert string entry to int.
                intRows = Integer.parseInt(line);

                // Exit the application if intRows is negative or zero.
                if(intRows <= 0)
                    break;

                // If GetRowsOK is successful, print the results,
                // noting if the end of the file was reached.
                if(GetRowsOK(rstEmployees,intRows))
                {
                    SafeArray sa = avarRecords.toSafeArray();
                    intUBound = sa.getUBound(2);
                    if ( intRows > (intUBound + 1))
                        System.out.println("\n(Not enough records in " +
                            "Recordset to retrieve " + intRows + " rows.)");
                    System.out.println("\n" + (intUBound+ 1) +
                                       " records found.\n");

                    // Print the retrieved data.

                    for ( intRecord = sa.getLBound();
                         intRecord  <= intUBound; intRecord++)
                    {

                        System.out.println(
                            " " + sa.getString(0, intRecord) + " " +
                            sa.getString(1, intRecord) + ", " +
                            sa.getString(2, intRecord));
                        if ( ((intRecord +1) % intDisplaysize) == 0)
                        {
                            System.out.println("\nPress <Enter> to continue..");
                            in.readLine();
                        }

                    }
                }
                else
                {
                    // Assuming the GetRows error was due to data
                    // changes by another user, use Requery to
                    // refresh the Recordset and start over.
                    System.out.println("\nGetRows failed--retry? (Y/N)");
                    if(in.readLine().trim().toUpperCase().equals("Y"))
                        rstEmployees.requery();
                    else
                    {
                        System.out.println("GetRows failed!");
                        break;
                    }
                }

                // Because using GetRows leaves the current
                // record pointer at the last record accessed,
                // move the pointer back to the beginning of the
                // Recordset before looping back for another search.
                rstEmployees.moveFirst();
            }

            // Cleanup objects before exit.
            rstEmployees.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

        // Display Error that the application has attempted to convert
        // a string of inappropriate format to one of the numeric types.
        catch(java.lang.NumberFormatException ne)
        {
            System.out.println(
                "Exception: Must specify an Integer value." );
        }

    }

    // GetRowsOK Function

    static boolean GetRowsOK(Recordset rstTemp,int intNumber)
        {
        // Store results of GetRows method in array.
        avarRecords = rstTemp.getRows(intNumber);

        // Return False only if fewer than the desired
        // number of rows were returned, but not because the
        // end of the Recordset was reached.
        if ( intNumber > (avarRecords.toSafeArray().getUBound(2)+ 1)
                    && !(rstTemp.getEOF()))
            return false;
        else
            return true;

    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


GetString メソッドの例 (VJ++)

この例では、GetString メソッドの機能を示します。

ユーザーは、データ アクセスの問題をデバッグ中で、小規模な Recordset の現在の内容をすばやく簡単に出力する方法を必要としているとします。

// The WFC class includes the ADO objects.
import com.ms.wfc.data.*;
import java.io.* ;

public class GetStringX
{
     // The main entry point for the application.

    public static void main (String[] args)
    {
        GetStringX ();
        System.exit(0);
    }

    // GetStringX  function
    static void GetStringX()
    {
        // Define ADO Objects.
        Connection cnConn1 = null;
        Recordset rstAuthors = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";
        String strOutput;

        try
        {
            // Get the user input for state.
            System.out.println(
                "Enter a state (CA, IN, KS, MD, MI, OR, TN, UT): ");
            String strState = in.readLine().trim();
            String strQuery =
                "SELECT au_fname, au_lname, address, city FROM Authors " +
                          "WHERE state = '" + strState + "'";

            // Open recordset with data from Authors table.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            rstAuthors = new Recordset();
            rstAuthors.open(strQuery,
                     cnConn1,
                     AdoEnums.CursorType.STATIC,
                     AdoEnums.LockType.READONLY,
                     AdoEnums.CommandType.TEXT);

            if (rstAuthors.getRecordCount() > 0)
            {
                // Use all defaults: get all rows, TAB column delimiter,
                // CARRIAGE RETURN
                // row delimiter, empty-string null delimiter.
                strOutput =
                    rstAuthors.getString(AdoEnums.StringFormat.CLIPSTRING,
                    rstAuthors.getRecordCount(),
                    "\t ",
                    "\n",
                    "").trim();
                System.out.println("\nState = '" + strState + "'" +
                    "\n\n" +
                    "Name             Address             City" +
                    "\n");
                System.out.println(strOutput);
            }
            else
                System.out.println("\nNo rows found for state = '" +
                    strState + "'\n");

            // Cleanup objects before exit.
            rstAuthors.close();
            cnConn1.close();

            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Handler プロパティの例 (VJ++)

この例では、RDS.DataControl オブジェクトの Handler プロパティの機能を示します。詳細については、「DataFactory のカスタマイズ」を参照してください。

サーバー上のパラメータ ファイル MSDFMAP.INI に、次のセクションがあるとします。

[connect AuthorDataBase]
Access=ReadWrite
Connect="DSN=Pubs;UID=sa;PWD=;"
[sql AuthorById]
SQL="SELECT * FROM Authors WHERE au_id = ?"

コードは次のようになります。SQL プロパティに割り当てられたコマンドは識別子 AuthorById に一致するので、Michael O'Leary という author の行を取得します。コード中の Connect プロパティは Pubs データ ソースを指定していますが、このデータ ソースは、MSDFMAP.INI の connect セクションにより上書きされます。DataControl オブジェクトの Recordset プロパティは、コーディングの便宜上、接続されていない Recordset オブジェクトに割り当てられます。

import com.ms.wfc.data.*;
import com.ms.wfc.data.rds.*;
import java.io.* ;

public class HandlerX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        HandlerX();
        System.exit(0);
    }

    // HandlerX function

    static void HandlerX()
    {

        // Define ADO Objects.
        Recordset rstAuthors = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        int intCount = 0;
        int intDisplaysize = 15;

        try
        {
            IBindMgr dc = (IBindMgr) new DataControl();
            dc.setHandler("MSDFMAP.Handler");
            dc.setServer("http://tcsp636");
            dc.setConnect("Data Source=AuthorDatabase");
            dc.setSQL("AuthorById('267-41-2394')");
            dc.Refresh();                        // Retrieve the record.
            // Use another recordset as a convenience.
            rstAuthors = (Recordset)dc.getRecordset();
            System.out.println("Author is '" +
                               rstAuthors.getField("au_fname").getString() +
                               " " +
                               rstAuthors.getField("au_lname").getString() +
                               "'");

            // Cleanup objects before exit.
            rstAuthors.close();
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
        catch(java.lang.UnsatisfiedLinkError e)
        {
            System.out.println("Exception: " + e.getMessage());
        }
        catch(java.lang.NullPointerException ne)
        {
            System.out.println(
            "Exception: Attempt to use null where an object is required.");
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


InternetTimeout プロパティの例 (VJ++)

この例では、DataControl と DataSpace オブジェクトにある InternetTimeout プロパティの機能を示します。ここでは、DataControl オブジェクトの InternetTimeout プロパティを使って、タイムアウトを 20 秒に設定します。

// The WFC class includes the ADO objects.
import com.ms.wfc.data.*;
import com.ms.wfc.data.rds.*;
import java.io.* ;

public class InternetTimeoutX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        InternetTimeoutX();
        System.exit(0);
    }

    // InternetTimeoutX function

    static void InternetTimeoutX()
    {

        // Define ADO Objects.
        Recordset rstAuthors = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        int intCount = 0;
        int intDisplaysize = 15;

        try
        {
            IBindMgr dc = (IBindMgr) new DataControl();
            dc.setServer("http://tcsp636");
            dc.setConnect("DSN=Pubs;UID=sa;PWD=;");
            dc.setSQL("SELECT * FROM Authors");
            dc.setInternetTimeout(20000);    // Wait at least 20 seconds.
            dc.Refresh();
            rstAuthors = (Recordset)dc.getRecordset();
            while(!rstAuthors.getEOF())
            {
                System.out.println(rstAuthors.getField
                    ("au_fname").getString() + " " +
                    rstAuthors.getField("au_lname").getString());
                intCount++;
                if(intCount % intDisplaysize == 0)
                {
                    System.out.println("\nPress <Enter> to continue..");
                    in.readLine();
                    intCount = 0;
                }
                rstAuthors.moveNext();
            }
            // Cleanup objects before exit.
            rstAuthors.close();
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
        catch(java.lang.UnsatisfiedLinkError e)
        {
            System.out.println("Exception: " + e.getMessage());
        }
        catch(java.lang.NullPointerException ne)
        {
            System.out.println(
            "Exception: Attempt to use null where an object is required.");
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


IsolationLevel、Mode プロパティの例 (VJ++)

この例では、Mode プロパティを使って排他的接続を開き、IsolationLevel プロパティを使ってほかのトランザクションから独立したトランザクションを開きます。

import com.ms.wfc.data.*;
import java.io.*;

public class IsolationLevelX
{
// The main entry point for the application.
public static void main (String[] args)
{
    IsolationLevelX();
    System.exit(0);
}

// IsolationLevelX Function

static void IsolationLevelX()
{
    // Define ADO Objects
    Connection cnn1 = null;
    Recordset rstTitles = null;

    // Assign connection string to variable
    String strCnn = "Provider=sqloledb;Data Source=srv;"+
                    "Initial Catalog=Pubs;User Id=sa;Password=;";

    // Declarations
    BufferedReader in =
        new BufferedReader ( new InputStreamReader(System.in));
    String line = null;

    try
    {
        // Open connection and Titles table
        cnn1 = new Connection();

        cnn1.setMode(AdoEnums.ConnectMode.SHAREEXCLUSIVE);
        cnn1.setIsolationLevel(AdoEnums.IsolationLevel.ISOLATED);
        cnn1.open(strCnn);

        rstTitles = new Recordset();
        rstTitles.setCursorType(AdoEnums.CursorType.DYNAMIC);
        rstTitles.setLockType(AdoEnums.LockType.PESSIMISTIC);
        rstTitles.open("Titles", cnn1, AdoEnums.CursorType.DYNAMIC,
            AdoEnums.LockType.PESSIMISTIC);

        cnn1.beginTrans();

        // Display the connection mode
        if (cnn1.getMode() == AdoEnums.ConnectMode.SHAREEXCLUSIVE)
            System.out.println("\n\tConnection mode is exclusive");
        else
            System.out.println("\n\tConnection mode is not exclusive");
        System.out.println("\nPress <Enter> to continue..");
        in.readLine();

        // Display the Isolation level
        if ( cnn1.getIsolationLevel() == AdoEnums.IsolationLevel.ISOLATED)
            System.out.println("\tTransaction is Isolated\n");
        else
            System.out.println("\tTransaction is not Isolated\n");
        System.out.println("\nPress <Enter> to continue..");
        in.readLine();

        // Change the type of psychology titles
        while(!rstTitles.getEOF())
        {

            if(rstTitles.getField("Type").getString().trim().
                equals(new String("psychology")))
            {
                rstTitles.getField("Type").setString("self_help");
                rstTitles.update();
            }
            rstTitles.moveNext();

        }

        // Print current data in recordset
        rstTitles.requery();
        while(!rstTitles.getEOF())
        {
            System.out.println(rstTitles.getField("Title").getString() +
                " - " + rstTitles.getField("Type").getString() );
            rstTitles.moveNext();
        }
        System.out.println("\nPress <Enter> to continue..");
        in.readLine();

        // Restore original data
        cnn1.rollbackTrans();

        // Cleanup objects before exit
        rstTitles.close();
        cnn1.close();
    }
    catch(AdoException ae)
    {
        // Notify the user of any errors that result from ADO

        // As passing a connection, check for null pointer first
        if(cnn1 !=null)
        {
            PrintProviderError(cnn1);
        }
        else
        {
            System.out.println("Exception:" + ae.getLocalizedMessage());
        }
    }

    // System Read requires this catch
    catch(java.io.IOException je)
    {
        PrintIOError(je);

    }
}

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Item プロパティの例 (VJ++)

この例では、Item プロパティを使ってコレクションのメンバにアクセスする方法を示します。この例では、パラメータ化コマンドを使って Pubs データベースの Authors テーブルを開きます。

データベースに対して発行されるコマンドのパラメータには、Command オブジェクトの Parameters コレクションからインデックスおよび名前によってアクセスします。返される Recordset のフィールドには、そのオブジェクトの Fields コレクションからインデックスおよび名前によってアクセスします。

import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class ItemX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        ItemX();
        System.exit(0);
    }

    // ItemX  function

    static void ItemX()
    {

        // Define ADO Objects.
        Connection cnConn1 = null;
        Recordset rstAuthors = null;
        Command cmd = null;
        Parameter prm = null;
        Field fld = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";
        Variant [] varColumn = null;
        int intIndex;
        int intLimit;

        try
        {
            cnConn1 = new Connection();
            rstAuthors = new Recordset();
            cmd = new Command();

            //  Set the array with the Authors table field (column) names.
            varColumn = new Variant[9];
            varColumn[0] = new Variant("au_id");
            varColumn[1] = new Variant("au_lname");
            varColumn[2] = new Variant("au_fname");
            varColumn[3] = new Variant("phone");
            varColumn[4] = new Variant("address");
            varColumn[5] = new Variant("city");
            varColumn[6] = new Variant("state");
            varColumn[7] = new Variant("zip");
            varColumn[8] = new Variant("contract");

            cmd.setCommandText("SELECT * FROM Authors WHERE state = ?");
            prm = cmd.createParameter("ItemXparm",
                                      AdoEnums.DataType.CHAR,
                                      AdoEnums.ParameterDirection.INPUT,
                                      2,
                                      "CA");
            cmd.getParameters().append(prm);

            cnConn1.open(strCnn);
            cmd.setActiveConnection(cnConn1);

            // Connection and CommandType are omitted
            // because a Command Object is provided.
            rstAuthors.open(cmd,
                     null ,
                     AdoEnums.CursorType.STATIC,
                     AdoEnums.LockType.READONLY);

            System.out.println(
                "The Parameters collection accessed by index...");
            prm = cmd.getParameters().getItem(0);
            System.out.println("Parameter name = '" +
                               prm.getName() +
                               "', value = '" +
                               prm.getValue().toString() + "'\n");

            System.out.println(
                "The Parameters collection accessed by name...");
            prm = cmd.getParameters().getItem("ItemXparm");
            System.out.println("Parameters name = '" +
                               prm.getName() +
                               "', value = '" +
                               prm.getValue().toString() + "'\n");
            System.out.println("Press <Enter> to continue..");
            in.readLine();

            System.out.println(
                "The Fields collection accessed by index...");
            rstAuthors.moveFirst();
            intLimit = rstAuthors.getFields().getCount() - 1;
            for(intIndex = 0; intIndex <= intLimit; intIndex++)
            {
                fld = rstAuthors.getFields().getItem(intIndex);
                short intVtType = fld.getValue().getvt();
                String strFieldValue;
                switch(intVtType)
                {
                case Variant.VariantString :
                    strFieldValue = fld.getValue().toString();
                    break;
                case Variant.VariantBoolean :
                    if(fld.getValue().getBoolean())
                        strFieldValue = "True";
                    else
                        strFieldValue = "False";
                    break;
                default :
                    strFieldValue = fld.getValue().toString();
                    break;
                }
                System.out.println("Field " +
                                   Integer.toString(intIndex) +
                                   " : Name = '" +
                                   fld.getName() +
                                   "', value = '" +
                                   strFieldValue +
                                   "'");
            }
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();

            System.out.println("The Fields collection accessed by name...");
            rstAuthors.moveFirst();
            for(intIndex = 0; intIndex <= 8; intIndex++)
            {
                fld = rstAuthors.getFields().getItem
                    (varColumn[intIndex].toString());
                short intVtType = fld.getValue().getvt();
                String strFieldValue;
                switch(intVtType)
                {
                case Variant.VariantString :
                    strFieldValue = fld.getValue().toString();
                    break;
                case Variant.VariantBoolean :
                    if(fld.getValue().getBoolean())
                        strFieldValue = "True";
                    else
                        strFieldValue = "False";
                    break;
                default :
                    strFieldValue = fld.getValue().toString();
                    break;
                }
                System.out.println("Field " +
                                   "name = '" +
                                   fld.getName() +
                                   "', value = '" +
                                   strFieldValue +
                                   "'");
            }
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup objects before exit.
            rstAuthors.close();
            cnConn1.close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


MarshalOptions プロパティの例 (VJ++)

この例では、MarshalOptions プロパティを使って、サーバーに送り返される行 (すべての行または修正された行のみ) を特定します。

import java.io.*;
import com.ms.wfc.data.*;

public class MarshalOptionsX
{
// The main entry point for the application.
public static void main (String[] args)
{
    MarshalOptionsX();
    System.exit(0);
}
// MarshalX Function

static void MarshalOptionsX()
{
    // Define ADO Objects
    Recordset rstEmployees = null;

    // Declarations
    BufferedReader in =
        new BufferedReader(new InputStreamReader(System.in));
    String line = null;

    try
    {

        // Open Recordset with names from Employees Table.
        String strCnn = " Provider=sqloledb;Data Source=srv;" +
                 "Initial Catalog=Pubs;User Id=sa;Password=;";

        rstEmployees = new Recordset();
        rstEmployees.setCursorType(AdoEnums.CursorType.KEYSET);
        rstEmployees.setLockType(AdoEnums.LockType.OPTIMISTIC);
        rstEmployees.setCursorLocation(AdoEnums.CursorLocation.CLIENT);

        rstEmployees.open(
            "SELECT fname,lname from Employee ORDER BY lname",
            strCnn,AdoEnums.CursorType.KEYSET,
            AdoEnums.LockType.OPTIMISTIC, AdoEnums.CommandType.TEXT);

        // Store original data
        String strOldFirst = rstEmployees.getField("fname").getString();
        String strOldLast = rstEmployees.getField("lname").getString();

        // Change data in edit buffer
        rstEmployees.getField("fname").setString("Linda");
        rstEmployees.getField("lname").setString("Kobara");

        // Show contents of buffer and get user input
        String strMessage = "Edit in progress: "+ "\n"+
                     "Original Data  = \t"+ strOldFirst +" "+
                     strOldLast + "\n" + "Data in Buffer = \t"+
                     rstEmployees.getField("fname").getString()+ " " +
                     rstEmployees.getField("lname").getString()+"\n"+"\n"+
                     "Use Update to replace the original data with " +
                     "the buffered data in the recordset";
        String strMarshalAll = "Would you like to send all the rows" +
                        " in the recordset back to the server";
        String strMarshalModified = "Would you like to send only "+
                             " modified rows back to the server";

        System.out.println(strMessage + "\nEnter (Y/N)...");

        if (in.readLine().equalsIgnoreCase("Y"))
        {
            System.out.println(strMarshalAll);
            System.out.println("\nEnter (Y/N)...");

            if(in.readLine().equalsIgnoreCase("Y"))
            {
                rstEmployees.setMarshalOptions(AdoEnums.MarshalOptions.ALL);
                rstEmployees.update();
            }
            else
            {
                System.out.println(strMarshalModified);
                System.out.println("\nEnter (Y/N)...");

                if (in.readLine().equalsIgnoreCase("Y"))
                {
                    rstEmployees.setMarshalOptions(
                        AdoEnums.MarshalOptions.MODIFIEDONLY);
                    rstEmployees.update();
                }
            }

        }

        // Show the resulting data
        System.out.println("\nData in recordset = " +
            rstEmployees.getField("fname").getString() +
            " " + rstEmployees.getField("lname").getString());

        // Restore original data because this is a demonstration
        if (!((strOldFirst.equals(rstEmployees.getField("fname")))
            &&(strOldLast.equals(rstEmployees.getField("lname")))))
        {
            rstEmployees.getField("fname").setString(strOldFirst);
            rstEmployees.getField("lname").setString(strOldLast);
            rstEmployees.update();
        }
    // Cleanup objects before exit
    rstEmployees.close();
    System.out.println("\n\nPress <Enter> to continue..");
    in.readLine();
    }

    catch(AdoException ae)
    {
        // Notify the user of any errors that result from ADO

        // As passing a connection, check for null pointer first
        if(rstEmployees!= null)
        {
            PrintProviderError(rstEmployees.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getLocalizedMessage());
        }
    }

    // System Read requires this catch
    catch(java.io.IOException je)
    {
        PrintIOError(je);
    }
}

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


MaxRecords プロパティの例 (VJ++)

次の例では、MaxRecords プロパティを使って、Titles テーブル中の最も高価な 10 タイトルを含む Recordset を開きます。

import java.io.*;
import com.ms.wfc.data.*;

public class MaxRecordsX
{
// The main entry point for the application.

public static void main (String[] args)
{
    MaxRecordsX();
    System.exit(0);
}
// MaxRecordsX Function

static void MaxRecordsX()
{
    //  Define ADO Objects
    Recordset rstTemp = null;

    try
    {
        // Declarations
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        // Open recordset containing the 10 most expensive
        // titles in the Titles table.
        String strCnn = " Provider=sqloledb;Data Source=srv;"+
            " Initial Catalog=Pubs;User Id=sa;Password=;";
        rstTemp = new Recordset();
        rstTemp.setMaxRecords(10);
        rstTemp.open("select title,price from Titles" +
            " order by price desc", strCnn,AdoEnums.CursorType.FORWARDONLY,
            AdoEnums.LockType.READONLY, AdoEnums.CommandType.TEXT);

        // Display the contents of the recordset.
        System.out.println("Top Ten Titles by Price:\n");
        while (!rstTemp.getEOF())
        {
            System.out.println(" "+ rstTemp.getField("title").getString() +
                " - " + rstTemp.getField("Price").getString());
            rstTemp.moveNext();
        }
        // Cleanup objects before exit.
        rstTemp.close();

        System.out.println("\n\nPress <Enter> to continue..");
        in.readLine();
    }

    catch(AdoException ae)
    {
        // Notify the user of any errors that result from ADO.

        // As passing a connection, check for null pointer first.
        if (rstTemp!=null)
        {
            PrintProviderError(rstTemp.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getLocalizedMessage());
        }
    }

    // System read requires this catch.
    catch(java.io.IOException je)
    {
        PrintIOError(je);
    }
}
    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Move メソッドの例 (VJ++)

この例では、Move メソッドを使って、ユーザーの入力に基づいてレコード ポインタを配置します。

import java.io.*;
import com.ms.wfc.data.*;
import com.ms.com.*;

public class MoveX
{
// The main entry point for the application.

public static void main (String[] args)
{
    MoveX();
    System.exit(0);
}
// MoveX Function

static void MoveX()
{
    // Define ADO Objects
    Recordset rstAuthors = null;

    // Declarations
    String line = null;
    Variant varBookmark;
    String strCommand = null;
    int lngMove;
    BufferedReader in =
        new BufferedReader(new InputStreamReader(System.in));

    try
    {
        //  Open recordset from Authors table.
        String strCnn = "Provider=sqloledb;Data Source=srv;"+
            "Initial Catalog=Pubs;User Id=sa;Password=;";

        rstAuthors = new Recordset();
        rstAuthors.setCursorType(AdoEnums.CursorType.STATIC);

        // Use client cursor to allow use of
        // Absolute Position property.
        rstAuthors.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
        rstAuthors.open("select au_id,au_fname,au_lname,city,state " +
            "from Authors order by au_lname",
            strCnn,AdoEnums.CursorType.STATIC,
            AdoEnums.CursorLocation.CLIENT, AdoEnums.CommandType.TEXT);

        rstAuthors.moveFirst();

        while(true)
        {
            // Display information about current record and
            // ask how many records to move.
            strCommand = "Record:\t\t"+ rstAuthors.getAbsolutePosition() +
                " of " + rstAuthors.getRecordCount() + "\n" + "\tAuthor:\t\t"
                 + rstAuthors.getField("au_fname").getString() +
                 " " + rstAuthors.getField("au_lname").getString() +
                "\n" +"\tLocation:\t" +
                rstAuthors.getField("city").getString() +
                 ", " +rstAuthors.getField("state").getString()
                 +"\n\n"+"\tEnter number of records to move" +
                " (positive or negative).";

            System.out.print("\t"+ strCommand + "\t");
            line =in.readLine();

            // No entry exits program loop.
            if (line.length()== 0)
                break;

            // Converts string entry to int.
            lngMove = Integer.parseInt(line);

            // Store bookmark in case the move goes too far
            // forward or backward.
            varBookmark =(Variant)rstAuthors.getBookmark();

            // Move method requires parameter of data type int.
            rstAuthors.move(lngMove);

            // Trap for BOF and EOF.
            if (rstAuthors.getBOF())
            {
                System.out.println("\tToo far backward!  " +
                    "Returning to the current record.");
                rstAuthors.setBookmark(varBookmark);
            }
            if (rstAuthors.getEOF())
            {
                System.out.println("\tToo far forward!  " +
                    "Returning to the current record.");
                rstAuthors.setBookmark(varBookmark);
            }
        }
        // Cleanup objects before exit.
        rstAuthors.close();
        System.out.println("\tPress <Enter> to continue..");
        in.readLine();
    }

    catch(AdoException ae)
    {
        // Notify user of any errors that result from ADO.

        // As passing a recordset, check for null pointer.
        if (rstAuthors!=null)
        {
            PrintProviderError(rstAuthors.getActiveConnection());
        }
        else
        {
            System.out.println(" Exception: "+ ae.getMessage());
        }
    }
    // System Read requires this catch.
    catch(java.io.IOException je)
    {
        PrintIOError(je);
    }
    // Required if the user enter non integer value.
    catch(java.lang.NumberFormatException ne)
    {
        System.out.println("\n\nPlease enter integer values!");
        rstAuthors.close();
    }
}
    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


MoveFirst、MoveLast、MoveNext、MovePrevious メソッドの例 (VJ++)

この例では、与えられたコマンドに基づいて Recordset のレコード ポインタを移動するのに、MoveFirst、MoveLast、MoveNext、および MovePrevious メソッドを使います。このプロシージャを実行するには、MoveAny プロシージャが必要です。

import com.ms.wfc.data.*;
import java.io.*;

public class MoveFirstX  // DLL name.
{
// Main Function

public static void main( String rgArg[] )
{
    MoveFirstX();
    System.exit(0);
}

// MoveFirstX Function

static void MoveFirstX()
{
    // Declarations
    Recordset rsAuthors = null;
    BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));
    String  line = null;

    String strCnn = "Provider=sqloledb;data source=dianaped4;"
        + "Initial Catalog=Pubs;User Id=sa;Password=;";

    String strMessage = "UPDATE Titles SET type = 'psychology' "
        +"WHERE type = 'self_help'";

    int intCommand = 0;
    String strFName;
    String strLName;

    try
    {
        // Open recordset from Authors table.
        rsAuthors = new Recordset();
        rsAuthors.setCursorLocation( AdoEnums.CursorLocation.CLIENT );

        // Use client cursor to enable AbsolutePosition property.
        rsAuthors.open( "Authors", strCnn, AdoEnums.CursorType.STATIC,
            AdoEnums.LockType.BATCHOPTIMISTIC, AdoEnums.CommandType.TABLE );

        // Get user's move requests and show current record information.
        while( true )    // Continuous loop.
        {
        // Assign field information to variable to simplify output code.
            strFName = rsAuthors.getField("au_fname").getString();
            strLName = rsAuthors.getField("au_lname").getString();

            System.out.println
                ( "\nName: " + strFName + " " + strLName + "\n"
                + "Record " + rsAuthors.getAbsolutePosition()
                + " of " + rsAuthors.getRecordCount() + "\n\n" );
            System.out.println( "[1 - MoveFirst, 2 - MoveLast, \n");
            System.out.println( " 3 - MoveNext, 4 - MovePrevious]\n");

            // User types a number followed by enter (cr-lf).
            line = in.readLine();

            // No entry exits program loop.
            if (line.length() == 0) break;
            // Convert string entry to int.
            intCommand = Integer.parseInt(line);
            // Out of range entry exits program loop.
            if ((intCommand < 1) || (intCommand > 4)) break;

            // Call method based on user's validated selection.
            MoveAny(intCommand, rsAuthors);
        }
        rsAuthors.close();
    }
    catch( AdoException ae )
    {
        // Notify user of any errors that result from ADO.

        // As passing a Recordset, check for null pointer first.
        if (rsAuthors != null)
        {
            PrintProviderError(rsAuthors.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getMessage());
        }
    }
    // System Read requires this catch.
    catch( java.io.IOException je )
    {
        PrintIOError(je);
    }
}

// MoveAny Function

static void MoveAny(int intChoice, Recordset rsTemp)
{
    // Move per selection from user, checking for BOF and EOF.
    try
    {
        switch(intChoice)
        {
        case 1:   // Equals char of 1.
            rsTemp.moveFirst();
            break;
        case 2:   // Equals char of 2.
            rsTemp.moveLast();
            break;
        case 3:   // Equals char of 3.
            rsTemp.moveNext();
            if(rsTemp.getEOF())
            {
                System.out.println("\nAlready at end of recordset!\n");
                rsTemp.moveLast();
            }
            break;
        case 4:   // Equals char of 4.
            rsTemp.movePrevious();
            if(rsTemp.getBOF())
            {
                System.out.println
                    ("\nAlready at beginning of recordset!\n");
                rsTemp.moveFirst();
            }
            break;
        default:
            break;
        }
    }
    catch( AdoException ae )
    {
        // Notify user of any errors that result from ADO.

        // As passing a Recordset, check for null pointer first.
        if (rsTemp != null)
        {
            PrintProviderError(rsTemp.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getMessage());
        }
    }
}

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


NextRecordset メソッドの例 (VJ++)

この例では、NextRecordset メソッドを使って、3 つに分割された SELECT ステートメントからなる複合コマンド ステートメントを使用する、レコードセット内のデータを参照します。

import java.io.*;
import com.ms.wfc.data.*;

public class NextRecordsetX
{
// The main entry point for the application.

public static void main (String[] args)
{
    NextRecordsetX();
    System.exit(0);

}
// NextRecordsetX Function
static void NextRecordsetX()
{
    // Define ADO Object
    Recordset rstCompound = null;

    // Declarations
    BufferedReader in =
        new BufferedReader(new InputStreamReader(System.in));
    String strCnn;
    int intCount;
    int intDisplayRecords = 15;
    int intRecordCount;

    try
    {
        // Open compound recordset.
        strCnn = "Provider=sqloledb;Data Source=srv;" +
             "Initial Catalog=Pubs;User Id=sa;Password=;";

        rstCompound = new Recordset();
        rstCompound.open("select * from Authors;" +
             "select * from stores;" +
             "select * from jobs", strCnn, AdoEnums.CursorType.FORWARDONLY,
            AdoEnums.LockType.READONLY,AdoEnums.CommandType.TEXT);

        // Display results from each select statement.
        intCount=1;

            while (rstCompound != null)
            {
                System.out.println(
                    "Contents of recordset #" + intCount + "\n");
                intRecordCount = 0;
                while(rstCompound.getEOF() != true )
                    {
                        System.out.println(
                            rstCompound.getField(0).getString()+" " +
                            rstCompound.getField(1).getString());
                        intRecordCount++;
                        if ( intRecordCount == intDisplayRecords)
                        {
                            System.out.println("\nPress <Enter> to continue..");
                            in.readLine();
                            intRecordCount = 0;
                        }
                        rstCompound.moveNext();
                    }
                System.out.println("\nPress <Enter> to continue..");
                in.readLine();

                rstCompound = rstCompound.nextRecordset();

                intCount++;
            }
    }
    // System read requires this catch.
    catch(java.io.IOException je)
    {
        PrintIOError(je);
    }
    catch(AdoException ae)
    {
        // Notify the user of any errors that result from ADO.

        // As passing a recordset. check for the null pointer first
        if(rstCompound!=null)
        {
            PrintProviderError(rstCompound.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getMessage());
        }
    }
    catch(java.lang.NullPointerException ne)
    {
        System.out.println("Error Description: " + ne.getMessage());
    }

}

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


NumericScale、Precision プロパティの例 (VJ++)

この例では、NumericScale および Precision プロパティを使って、Pubs データベースの Discounts テーブル内にあるフィールドの小数点の桁数と精度を表示します。

import com.ms.wfc.data.*;
import java.io.* ;

public class NumericScaleX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        NumericScaleX();
        System.exit(0);
    }

    // NumericScaleX function

    static void NumericScaleX()
    {

        // Define ADO Objects.
        Recordset rstDiscounts = null;
        Field fldTemp = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "Provider=sqloledb;Data Source=srv;"
             + "Initial Catalog=Pubs;User Id=sa;Password=;";
        int intLoop;

        try
        {
            rstDiscounts = new Recordset();

            // Open recordset.
            rstDiscounts.open("Discounts", strCnn,
                          AdoEnums.CursorType.FORWARDONLY,
                          AdoEnums.LockType.READONLY,
                          AdoEnums.CommandType.TABLE);

            // Display numeric scale and precision of
            // numeric and small integer fields.
            for ( intLoop=0; intLoop <
                rstDiscounts.getFields().getCount();intLoop++)
            {
                fldTemp = rstDiscounts.getFields().getItem(intLoop);
                if((fldTemp.getType()== AdoEnums.DataType.NUMERIC) |
                    (fldTemp.getType()== AdoEnums.DataType.SMALLINT))
                {
                    System.out.println("\nField: "
                        + fldTemp.getName());
                    System.out.println("\nNumeric scale: "
                        + fldTemp.getNumericScale());
                    System.out.println("\nPrecision: "
                        + fldTemp.getPrecision());
                    System.out.println("\n\nPress <Enter> to continue..");
                    in.readLine();
                }
            }

            // Cleanup objects before exit.
            rstDiscounts.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstDiscounts != null)
            {
                PrintProviderError(rstDiscounts.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }

        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Open、Close メソッドの例 (VJ++)

この例では、開かれている Recordset と Connection オブジェクトの両方に、Open と Close メソッドを使用します。

import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class OpenX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        OpenX();
        System.exit(0);
    }

    // OpenX function

    static void OpenX()
    {

        // Define ADO Objects.
        Connection cnConn1 = null;
        Recordset rstEmployees = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "Provider=sqloledb;Data Source=srv;"
                        + "Initial Catalog=Pubs;User Id=sa;Password=;";
        Variant varDate;
        String strHDate;

        try
        {
            // Open connection.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);

            // Open Employees table.
            rstEmployees = new Recordset();
            rstEmployees.setCursorType(AdoEnums.CursorType.KEYSET);
            rstEmployees.setLockType(AdoEnums.LockType.OPTIMISTIC);
            rstEmployees.open("Employee", cnConn1,
                          AdoEnums.CursorType.KEYSET,
                          AdoEnums.LockType.OPTIMISTIC,
                          AdoEnums.CommandType.TABLE);

            // Assign the first employee record's hire date
            // to a variable, then change the hire date.
            varDate = rstEmployees.getField("hire_date").getOriginalValue();
            System.out.println("Original data\n");
            System.out.println("\tName - Hire Date");
            strHDate = rstEmployees.getField("hire_date").getString();
            strHDate = strHDate.substring(5,7) + "/" +
                strHDate.substring(8,10)
                 + "/" + strHDate.substring(2,4);
            System.out.println("\t" +
                rstEmployees.getField("fName").getString()+ " "
                 + rstEmployees.getField("lName").getString()+ " - "
                 + strHDate);
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
            rstEmployees.getField("hire_date").setString("1/1/1900");
            rstEmployees.update();
            System.out.println("Changed data\n");
            System.out.println("\tName - Hire Date");
            strHDate = rstEmployees.getField("hire_date").getString();
            strHDate = strHDate.substring(5,7) + "/" +
                strHDate.substring(8,10)
                 + "/" + strHDate.substring(0,4);
            System.out.println("\t" +
                rstEmployees.getField("fName").getString()+ " "
                 + rstEmployees.getField("lName").getString()+ " - "
                 + strHDate);
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();

            // Requery Recordset and reset the hire date.
            rstEmployees.requery();
            rstEmployees.getField("hire_date").setValue(varDate);
            rstEmployees.update();
            System.out.println("Data after reset\n");
            System.out.println("\tName - Hire Date");
            strHDate = rstEmployees.getField("hire_date").getString();
            strHDate = strHDate.substring(5,7) + "/" +
                strHDate.substring(8,10)
                 + "/" + strHDate.substring(2,4);
            System.out.println("\t" +
                rstEmployees.getField("fName").getString()+ " "
                 + rstEmployees.getField("lName").getString()+ " - "
                 + strHDate);
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup objects before exit.
            rstEmployees.close();
            cnConn1.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }

        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


OpenSchema メソッドの例 (VJ++)

この例では、OpenSchema メソッドを使って、Pubs データベース内の、それぞれのテーブルの名前と種類を表示します。

import com.ms.wfc.data.*;
import java.io.*;
import com.ms.com.*;

public class OpenSchemaX
{
 // The main entry point of the application.

public static void main (String[] args)
{
    OpenSchemaX();
    OpenSchemaX2();
    System.exit(0);
}

// OpenSchemaX Function
static void OpenSchemaX()
{
    // Define ADO Objects
    Connection cnn1 = null;
    Recordset rstSchema = null;

    //  Declarations
    String strCnn;
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    int intDisplayRecords = 5;
    int intRecordCount = 0;

    try
    {

        cnn1 = new Connection();
        strCnn = "Provider = Microsoft.Jet.OLEDB.4.0;" +
            "Data Source=C:\\Program Files\\Microsoft " +
            "Office\\Office\\Samples\\Northwind.mdb;" +
            "User Id=admin;Password=;";
        cnn1.open(strCnn);
        rstSchema = cnn1.openSchema(AdoEnums.Schema.TABLES);

        while (!rstSchema.getEOF())
        {

            System.out.println("Table Name: " +
                rstSchema.getField("TABLE_NAME").getString()+"\n"+
                "Table Type: " +
                rstSchema.getField("TABLE_TYPE").getString()+"\n");
            intRecordCount++;
            if ( intRecordCount == intDisplayRecords)
            {
                System.out.println("Press <Enter> to continue..");
                in.readLine();
                intRecordCount = 0;
            }
            rstSchema.moveNext();

        }
        System.out.println("Press <Enter> to continue..");
        in.readLine();
        // Cleanup objects before exit
        rstSchema.close();
        cnn1.close();

    }
    catch(AdoException ae)
    {
        // Notify user of any errors that result from ADO.

        // As passing a Recordset, check for null pointer first.
        if(rstSchema != null)
        {
            PrintProviderError(rstSchema.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getMessage());
        }
    }
    // System read requires this catch.
    catch(java.io.IOException je)
    {
        PrintIOError(je);
    }
}

// OpenSchemaX2 Function

static void OpenSchemaX2()
{
    // Define ADO Objects
    Connection cnn2 = null;
    Recordset rstSchema = null;

    // Declarations
    String strCnn;
    BufferedReader in =
        new BufferedReader(new InputStreamReader(System.in));
    int intDisplayRecords = 5;
    int intRecordCount = 0;

    try
    {
        cnn2 = new Connection();
        strCnn = "Provider = Microsoft.Jet.OLEDB.4.0;" +
            "Data Source=C:\\Program Files\\Microsoft " +
            "Office\\Office\\Samples\\Northwind.mdb;" +
            "User Id=admin;Password=;";
        cnn2.open(strCnn);

        Variant[] va = new Variant[4];
        va[0] = new Variant();
        va[1] = new Variant();
        va[2] = new Variant();
        va[3] = new Variant("VIEW");
        rstSchema = cnn2.openSchema(AdoEnums.Schema.TABLES,(Object[])va);

        while (!rstSchema.getEOF())
        {
            System.out.println("Table Name: " +
                rstSchema.getField("TABLE_NAME").getString()+"\n"+
                "Table Type: " +
                rstSchema.getField("TABLE_TYPE").getString()+"\n");
            intRecordCount++;
            if ( intRecordCount == intDisplayRecords)
            {
                System.out.println("Press <Enter> to continue..");
                in.readLine();
                intRecordCount = 0;
            }
            rstSchema.moveNext();

        }
        System.out.println("Press <Enter> to continue..");
        in.readLine();
        // Cleanup Objects before exit.
        rstSchema.close();
        cnn2.close();

    }
    catch(AdoException ae)
    {
        // Notify user of any errors that result from ADO.

        // As passing a Recordset, check for null pointer first.
        if(rstSchema != null)
        {
            PrintProviderError(rstSchema.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getMessage());
        }
    }
    // System read requires this catch.
    catch(java.io.IOException je)
    {
        PrintIOError(je);
    }

}
    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Optimize プロパティの例 (VJ++)

この例では、Field オブジェクトのダイナミック Optimize プロパティの機能を示します。Pubs データベース内の Authors テーブルの zip フィールドには、インデックスが作成されていません。zip フィールドの Optimize プロパティを True に設定すると、ADO によってインデックスが作成され、Find メソッドのパフォーマンスが向上します。

import com.ms.wfc.data.*;
import java.io.* ;

public class OptimizeX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        OptimizeX();
        System.exit(0);
    }

    // OptimizeX function

    static void OptimizeX()
    {

        // Define ADO Objects.
        Recordset rstAuthors = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";

        try
        {
            rstAuthors = new Recordset();
            rstAuthors.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            // Enable index creation.
            rstAuthors.open("SELECT * FROM Authors",
                    strCnn,
                    AdoEnums.CursorType.STATIC,
                    AdoEnums.LockType.READONLY,
                    AdoEnums.CommandType.TEXT);
            rstAuthors.getField("zip").getProperties().
                getItem("Optimize").setBoolean(true); // Create the index.
            rstAuthors.find("zip = '94595'");    // Find Akiko Yokomoto.
            System.out.println(rstAuthors.getField("au_fname").getString() +
                " " + rstAuthors.getField("au_lname").getString() + " " +
                rstAuthors.getField("address").getString() + " " +
                rstAuthors.getField("city").getString() + " " +
                rstAuthors.getField("state").getString() + " ");
            rstAuthors.getField("zip").getProperties().
                getItem("Optimize").setBoolean(false); // Delete the index.

            // Cleanup objects before exit.
            rstAuthors.close();
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


OriginalValue、UnderlyingValue プロパティの例 (VJ++)

この例では、OriginalValue および UnderlyingValue プロパティを使って、Recordset のバッチ更新中にレコードの基になるデータが変更された場合に、メッセージを表示します。

import com.ms.wfc.data.*;
import java.io.* ;

public class OriginalValueX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        OriginalValueX();
        System.exit(0);
    }

    // OriginalValueX function

    static void OriginalValueX()
    {
        // Define ADO Objects.
        Connection cnConn1 = null;
        Recordset rstTitles = null;
        Field fldType = null;

        // Declarations.
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=Pubs;User Id=sa;Password=;";
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));

        try
        {
            // Open a connection.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);

            // Open recordset for batch update.
            rstTitles = new Recordset();
            rstTitles.setActiveConnection(cnConn1);
            rstTitles.setCursorType(AdoEnums.CursorType.KEYSET);
            rstTitles.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
            rstTitles.open("Titles",cnConn1,
                           AdoEnums.CursorType.KEYSET,
                           AdoEnums.LockType.BATCHOPTIMISTIC,
                           AdoEnums.CommandType.TABLE);

            // Set field object variable for Type field.
            fldType = rstTitles.getField("type");

            // Change the type of psychology titles.
            while(!rstTitles.getEOF())
            {
                if(rstTitles.getField("type").getString().
                    trim().equals("psychology"))
                    fldType.setString("self_help");
                rstTitles.moveNext();
            }

            // Similate a change by another user by updating
            // data using a command string.
            cnConn1.execute("UPDATE Titles SET type = 'sociology' "
                                + "WHERE type = 'psychology'");

            // Check for changes.
            rstTitles.moveFirst();

            while(!rstTitles.getEOF())
            {
                String strOriginalValue =
                    fldType.getOriginalValue().toString().trim();
                String strUnderlyingValue =
                    fldType.getUnderlyingValue().toString().trim();
                if(!(strOriginalValue.equals(strUnderlyingValue)))
                {
                    System.out.println("Data has changed!" + "\n\n");
                    System.out.println("\tTitle ID: "
                        + rstTitles.getField("title_id").getString().trim() +
                        "\n");
                    System.out.println("\tCurrent value: "
                            + fldType.getString()+ "\n");
                    System.out.println("\tOriginal value: "
                            + fldType.getOriginalValue().toString()+ "\n");
                    System.out.println("\tUnderlying value: "
                            + fldType.getUnderlyingValue().toString()+ "\n");
                    System.out.println("\n\nPress <Enter> to continue..");
                    in.readLine();
                }
                rstTitles.moveNext();
            }
            // Cancel the update because this is a demonstration.

            rstTitles.cancelBatch();
            rstTitles.close();

            // Restore original values.
            cnConn1.execute("UPDATE Titles SET type = 'psychology' "
                            + "WHERE type = 'sociology'");

            // Cleanup objects before exit.
            cnConn1.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstTitles!= null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Prepared プロパティの例 (VJ++)

この例では、一方はステートメントが準備され (またはコンパイルされて)、もう一方はステートメントが準備されていない、2 つの Command オブジェクトを開いて、Prepared プロパティの機能を示します。

import com.ms.wfc.data.*;
import java.io.* ;

public class PreparedX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        PreparedX();
        System.exit(0);
    }

    // PreparedX function

    static void PreparedX()
    {
        // Define string variables.
        String strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=Pubs;User Id=sa;Password=;";
        String strCmd = "SELECT title, type FROM Titles ORDER BY type";

        // Define ADO Objects.
        Connection cnConn1 = null;
        Command cmd1 = null;
        Command cmd2 = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        long timeStart;
        long timeEnd;
        float timeNotPrepared ;
        float timePrepared;
        int   intLoop;
        String strTemp;

        try
        {
            // Open a connection.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);

            // Create two command objects for the same
            // command - one prepared and one not prepared.
            cmd1 = new Command();
            cmd1.setActiveConnection(cnConn1);
            cmd1.setCommandType(AdoEnums.CommandType.TEXT);
            cmd1.setCommandText(strCmd);

            cmd2 = new Command();
            cmd2.setActiveConnection(cnConn1);
            cmd2.setCommandType(AdoEnums.CommandType.TEXT);
            cmd2.setCommandText(strCmd);
            cmd2.setPrepared(true);

            // Set a timer, then execute the unprepared
            // command 20 times.
            timeStart = System.currentTimeMillis();
            for ( intLoop = 0; intLoop < 20; intLoop++)
                cmd1.execute();
            timeEnd = System.currentTimeMillis();
            timeNotPrepared =(float)(timeEnd - timeStart)/1000f;

            // Reset the timer, then execute the prepared
            // command 20 times.
            timeStart = System.currentTimeMillis();
            for ( intLoop = 0; intLoop < 20; intLoop++)
                cmd2.execute();
            timeEnd = System.currentTimeMillis();
            timePrepared =(float)(timeEnd - timeStart)/1000f;

            // Display performance results.
            System.out.println("\nPerformance Results:");
            System.out.println("\n\tNot Prepared: " + timeNotPrepared +
                " seconds");
            System.out.println("\n\tPrepared: " + timePrepared +
                " seconds");
            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup objects before exit.
            cnConn1.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Connection, check for null pointer first.
            if (cnConn1!= null)
            {
                PrintProviderError(cnConn1);
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Provider、DefaultDatabase プロパティの例 (VJ++)

この例では、異なるプロバイダを使用する 3 つの Connection オブジェクトを開くことによって、Provider プロパティの機能を示します。この例ではまた、DefaultDatabase プロパティを使って Microsoft ODBC Provider の既定のデータベースを設定します。

import java.io.*;
import com.ms.wfc.data.*;

public class ProviderX
{
    //    The main entry point of the application.
    public static void main (String[] args)
    {
        ProviderX();
        System.exit(0);
    }
    // ProviderX Function
    static void ProviderX()
    {
        // Define ADO Objects.
        Connection cnn1 = null;
        Connection cnn2 = null;
        Connection cnn3 = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));
        try
        {
            // Open a connection using the Microsoft ODBC Provider.
            cnn1 = new Connection();
            cnn1.setConnectionString("driver={SQL Server};"+
                 "server=srv;User id=sa;Password=;");
            cnn1.open();
            cnn1.setDefaultDatabase("Pubs");

            // Display the provider.
            System.out.println("\n\n\tCnn1 provider: "+ cnn1.getProvider());

            // Open connection using the OLE DB Provider for Microsoft Jet.
            cnn2 = new Connection();
            cnn2.setProvider("Microsoft.Jet.OLEDB.3.51");
            cnn2.open("C:\\Program Files\\Microsoft " +
            "Office\\Office\\Samples\\Northwind.mdb","admin","");

            // Display the provider.
            System.out.println("\n\n\tCnn2 provider: " +
                cnn2.getProvider());

            // Open a connection using the Microsoft SQL Server Provider.
            cnn3 = new Connection();
            cnn3.setProvider("sqloledb");
            cnn3.open("Data Source=srv;Initial Catalog= Pubs;","sa","");

            // Display the provider.
            System.out.println("\n\n\tCnn3 provider: " +
                cnn3.getProvider());

            // Cleanup Objects before exit.
            cnn1.close();
            cnn2.close();
            cnn3.close();

            System.out.println("\n\n\tPress <Enter> to continue..");
            in.readLine();
        }
        catch(AdoException ae)
        {
            // Notify the user of any errors that result from ADO.

            // As passing a Connection, check for null pointer first.
            if(cnn1 != null)
            {
                PrintProviderError(cnn1);
            }
            else
            {
                System.out.println("Exception: " + ae.getLocalizedMessage());
            }
        }
        // System read requires needs this catch.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
    }
    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Refresh メソッドの例 (VJ++)

この例では、Refresh メソッドを使って、ストアド プロシージャ Command オブジェクトの Parameters コレクションを更新します。

import  com.ms.wfc.data.*;
import java.io.*;

public class RefreshX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        RefreshX();
        System.exit(0);
    }

    // RefreshX function

    static void RefreshX()
    {
        // Define ADO Objects.
        Connection cnConn1 = null;
        Command cmdByRoyalty = null;
        Recordset rstByRoyalty = null;
        Recordset rstAuthors = null;

        //Declarations.
        String strAuthorID;
        String strFName;
        String strLName;
        int intRoyalty ;
        BufferedReader in =
            new BufferedReader (new InputStreamReader (System.in));
        String line = null;

        try
        {
            // Open a connection.
            String strCnn = "Provider=sqloledb;Data Source=srv;"
                           + "Initial Catalog=Pubs;User Id=sa;Password=;";

            cnConn1 = new Connection();
            cnConn1.open(strCnn);

            // Open a command object for a stored procedure
            // with one parameter.
            cmdByRoyalty = new Command();
            cmdByRoyalty.setActiveConnection(cnConn1);
            cmdByRoyalty.setCommandText("byRoyalty");
            cmdByRoyalty.setCommandType(AdoEnums.CommandType.STOREDPROC);
            cmdByRoyalty.getParameters().refresh();

            // Get Parameter value and execute the command
            // storing the results in the recordset.
            System.out.println ("\nEnter Royalty : ");
            line = in.readLine().trim();
            intRoyalty = Integer.parseInt(line);
            cmdByRoyalty.getParameters().getItem(1).setInt(intRoyalty);

            // Create a recordset by executing the command.
            rstByRoyalty = cmdByRoyalty.execute();

            // Open the Authors table to get author names for display.
            rstAuthors = new Recordset ();
            rstAuthors.open(
                "Authors",strCnn,AdoEnums.CursorType.FORWARDONLY,
                AdoEnums.LockType.READONLY, AdoEnums.CommandType.TABLE );

            // Print current data in the recordset,
            // adding author names from Authors table.
            System.out.println("\nAuthors with " + intRoyalty +
                               " percent royalty");
            while (!rstByRoyalty.getEOF())
            {
                strAuthorID =  rstByRoyalty.getField("au_id").getString();
                rstAuthors.setFilter("au_id ='" +  strAuthorID + "'");
                strFName = rstAuthors.getField("au_fname").getString();
                strLName = rstAuthors.getField("au_lname").getString();
                System.out.println("\t" + strAuthorID + ", " + strFName
                                   + " " + strLName);
                rstByRoyalty.moveNext();
            }
            System.out.println("\n\nPress <Enter> key to continue..");
            line = in.readLine();

            //Cleanup objects before exit.
            rstByRoyalty.close();
            rstAuthors.close();
            cnConn1.close();

        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstByRoyalty != null)
            {
                PrintProviderError(rstByRoyalty.getActiveConnection());
            }
            else if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // This catch is required if input string cannot be converted to
        // Integer data type.
        catch ( java.lang.NumberFormatException ne)
        {
                System.out.println("\nException: Integer Input required.");
        }
        // System Read requires this catch.
        catch( java.io.IOException je )
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Resync メソッドの例 (VJ++)

この例では、Resync メソッドを使って、静的レコードセット内のデータを更新します。

import java.io.*;
import com.ms.wfc.data.*;

public class ResyncX
{
    // The main entry point of the application.
    public static void main (String[] args)
    {
        ResyncX();
        System.exit(0);
    }
    static void ResyncX()
    {
        // Define ADO Objects.
        Recordset rstTitles = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));
        String strCnn = "Provider=sqloledb;Data Source=srv;" +
                        "Initial Catalog=Pubs;User Id=sa;Password=;";

        try
        {
            // Open recordset for Titles table.
            rstTitles = new Recordset();
            rstTitles.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            rstTitles.setCursorType(AdoEnums.CursorType.STATIC);
            rstTitles.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
            rstTitles.open("Titles", strCnn, AdoEnums.CursorType.STATIC,
                AdoEnums.LockType.BATCHOPTIMISTIC,
                AdoEnums.CommandType.TABLE);

            // Change the type of the first title in the recordset.
            rstTitles.getField("type").setString("database");

            // Display the results of the change.
            System.out.println("\n\n\tBefore resync:\n" + "\tTitle - " +
                rstTitles.getField("title").getString() +
                "\n\tType  - " + rstTitles.getField("type").getString());

            // Resync with database and redisplay the results.
            rstTitles.resync();
            System.out.println("\n\n\tAfter resync:\n" + "\tTitle - " +
                rstTitles.getField("title").getString() +
                "\n\tType  - " +
                rstTitles.getField("type").getString()+"\n");
            rstTitles.cancelBatch();

            // Cleanup Objects before exit.
            rstTitles.close();

            System.out.println("\tPress <Enter> to continue..");
            in.readLine();

        }
        catch(AdoException ae)
        {
            // Notify user of any errors that result from ADO.

            // As passing a recordset, check for null pointer first.
            if(rstTitles != null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // System read requires this catch.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Save、Open メソッドの例 (VJ++)

次の 3 つの例では、Save メソッドと Open メソッドを一緒に使用する方法を示します。

ある社員が仕事で出張する予定があり、出張先にデータベースに含まれるテーブルを持っていく必要があるとします。出かける前に、Recordset としてデータにアクセスし、それを持ち出し可能な形式に保存します。出張先では、接続されていないローカルな Recordset としてアクセスします。Recordset に変更を加え、変更分と共に Recordset を再度保存します。最終的に会社に戻ったときに、再度データベースに接続し、出張中に行った変更に関する更新を、データベースに対して行います。

import com.ms.wfc.data.*;
import java.io.* ;

public class SaveX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        SaveX1();
        SaveX2();
        SaveX3();
        System.exit(0);
    }

    // First, access and save the Authors table.

    // SaveX1 function

    static void SaveX1()
    {
        // Define ADO Objects.
        Recordset rstAuthors = null;

        // Declarations.
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));
        File file;

        try
        {
            rstAuthors = new Recordset();
            rstAuthors.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            rstAuthors.open("SELECT * FROM Authors",
                                strCnn,
                                AdoEnums.CursorType.DYNAMIC,
                                AdoEnums.LockType.OPTIMISTIC,
                                AdoEnums.CommandType.TEXT);

            // For the sake of illustration, save the recordset to a
            //diskette in XML format.
            file = new File("a:\\Pubs.xml");
            if(!file.exists())
                rstAuthors.save("a:\\Pubs.xml",AdoEnums.PersistFormat.XML);
            else
            {
                System.out.println("\nFile already exists.");
                System.out.println("\nPress <Enter> to continue..");
                in.readLine();
                System.exit(0);
            }
            // Cleanup objects before exit.
            rstAuthors.close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // At this point, you have arrived at your destination. You will
    // access the Authors table as a local, disconnected Recordset.
    // Don't forget you must have the MSPersist provider on the machine
    // you are using in order to access the saved file, a:\Pubs.xml.

    // SaveX2 function

    static void SaveX2()
    {
        // Define ADO Objects.
        Recordset rstAuthors = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            rstAuthors = new Recordset();

            // For sake of illustration, we specify all parameters.
            rstAuthors.open("a:\\Pubs.xml",
                    "Provider=MSPersist;",
                    AdoEnums.CursorType.FORWARDONLY,
                    AdoEnums.LockType.OPTIMISTIC,
                    AdoEnums.CommandType.FILE);

            // Now you have a local, disconnected recordset.
            // Edit it as you desire.
            // (In this example, the change makes no difference).
            rstAuthors.find("au_lname = 'Carson'");
            if(rstAuthors.getEOF())
            {
                System.out.println("Name not found.");
                System.out.println("\nPress <Enter> to continue..");
                in.readLine();
                return;
            }
            rstAuthors.getField("city").setString("Berkeley");
            rstAuthors.update();

            // Save changes in ADTG format this time, for illustration.
            // Note that previous version on the diskette, as a:\Pubs.xml.
            rstAuthors.save("a:\\Pubs.adtg",AdoEnums.PersistFormat.ADTG);

            // Cleanup objects before exit.
            rstAuthors.close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // Finally, update the database with your changes.

    // SaveX3 function

    static void SaveX3()
    {
        // Define ADO Objects.
        Connection cnConn1 = null;
        Recordset rstAuthors = null;

        // Declarations.
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";

        try
        {
            // If there is no ActiveConnection, you can open with defaults.
            rstAuthors = new Recordset();
            rstAuthors.open("a:\\Pubs.adtg");

            // Connect to the database, associate the Recordset with
            // connection, then update the database table with the changed
            // Recordset.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            rstAuthors.setActiveConnection(cnConn1);
            rstAuthors.updateBatch();

            // Cleanup objects before exit.
            rstAuthors.close();
            cnConn1.close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Sort プロパティの例 (VJ++)

この例では、Recordset オブジェクトの Sort プロパティを使って、Pubs データベースの Authors テーブルから取得した Recordset の行を並べ替えます。二次ユーティリティ ルーチンで、各行を出力します。

import com.ms.wfc.data.*;
import java.io.* ;

public class SortX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        SortX();
        System.exit(0);
    }

    // SortX function

    static void SortX()
    {
        // Define ADO Objects.
        Connection cnConn1 = null;
        Recordset rstAuthors = null;

        // Declarations.
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";

        try
        {
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            rstAuthors = new Recordset();
            rstAuthors.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            rstAuthors.open("SELECT * FROM Authors",
                    cnConn1,
                    AdoEnums.CursorType.STATIC,
                    AdoEnums.LockType.READONLY,
                    AdoEnums.CommandType.TEXT);
            SortXprint("Initial Order",rstAuthors);

            rstAuthors.setSort("au_lname ASC, au_fname ASC");
            SortXprint("Last Name Ascending",rstAuthors);

            rstAuthors.setSort("au_lname DESC, au_fname ASC");
            SortXprint("Last Name Descending",rstAuthors);

            // Cleanup objects before exit.
            rstAuthors.close();
            cnConn1.close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

    }

    // SortXprint function

    static void SortXprint(String strTitle,Recordset rstp)
    {
        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        int intDisplaysize = 15;
        int intCount = 1;
        try
        {
            System.out.println("---------------" +
                               strTitle +
                               "---------------");
            System.out.println("First Name   Last Name" + "\n" +
                               "-------------------------" +
                               "-------------------------");
            rstp.moveFirst();
            while(!rstp.getEOF())
            {
                System.out.println(rstp.getField("au_fname").getString() +
                                   "   " +
                                   rstp.getField("au_lname").getString());
                if(intCount % intDisplaysize == 0)
                {
                    System.out.println("\nPress <Enter> to continue..");
                    in.readLine();
                    intCount = 0;
                }
                intCount++;
                rstp.moveNext();
            }
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstp != null)
            {
                PrintProviderError(rstp.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }
    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Source プロパティの例 (VJ++)

この例では、異なるデータ ソースに基づく 3 つの Recordset オブジェクトを開いて、Source プロパティの機能を示します。

import java.io.*;
import com.ms.wfc.data.*;

public class SourceX
{
    // The main entry point of the application.
    public static void main (String[] args)
    {
        SourceX();
        System.exit(0);
    }
    // SourceX Function
    static void SourceX()
    {
        // Define string variables.
        String strCnn = "Provider=sqloledb;Data Source=srv;" +
                        "Initial Catalog=Pubs;User Id=sa;Password=;";
        String strSQL = "SELECT title_ID AS TitleID, title AS Title,"+
                     "publishers.pub_id AS PubID, pub_name AS PubName "+
                     "FROM publishers INNER JOIN Titles "+
                     "ON publishers.pub_id=Titles.pub_id "+
                     "ORDER BY Title";

        // Define ADO Objects.
        Connection cnn1 = null;
        Recordset rstTitles = null;
        Recordset rstPublishers = null;
        Recordset rstPublishersDirect = null;
        Recordset rstTitlesPublishers = null;
        Command cmdSQL = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            // Open a connection.
            cnn1 = new Connection();
            cnn1.open(strCnn);

            // Open a recordset based on a command object.
            cmdSQL = new Command();
            cmdSQL.setActiveConnection(cnn1);
            cmdSQL.setCommandText("Select title,type,pubdate " +
                 "FROM Titles ORDER BY title");

            rstTitles = new Recordset();
            rstTitles = cmdSQL.execute();

            // Open a recordset based on a table.
            rstPublishers = new Recordset();
            rstPublishers.open("publishers", strCnn,
                AdoEnums.CursorType.FORWARDONLY, AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE);

            // Open a recordset based on a table.
            rstPublishersDirect = new Recordset();
            rstPublishersDirect.open("publishers", strCnn,
                AdoEnums.CursorType.FORWARDONLY, AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLEDIRECT);

            // Open a recordset based on an SQL String.
            rstTitlesPublishers = new Recordset();

            rstTitlesPublishers.open(strSQL, strCnn,
                AdoEnums.CursorType.FORWARDONLY, AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TEXT);

            // Use Source property to display the source of each recordset.
            System.out.println("\nrstTitles source: \n"+
                rstTitles.getSource());
            System.out.println("\nrstPublishers source: \n"+
                rstPublishers.getSource());
            System.out.println("\nrstPublishersDirect source:\n" +
                rstPublishersDirect.getSource() );
            System.out.println("\nrstTitlesPublishers source: \n" +
                rstTitlesPublishers.getSource());

            // Cleanup Objects before exit.
            rstTitles.close();
            rstPublishers.close();
            rstPublishersDirect.close();
            rstTitlesPublishers.close();
            cnn1.close();

            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();
        }
        catch(AdoException ae)
        {
            // Notify the user of any errors that result from ADO.

            // As passing a recordset, check for null pointer first.

            if(rstPublishers != null)
            {
                PrintProviderError(rstPublishers.getActiveConnection());
            }
            else if(rstPublishersDirect != null)
            {
                PrintProviderError(
                    rstPublishersDirect.getActiveConnection());
            }
            else if(rstTitles != null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else if(rstTitlesPublishers != null)
            {
                PrintProviderError(
                    rstTitlesPublishers.getActiveConnection());
            }
            else
                System.out.println("Exception: " + ae.getMessage());

        }
        // System read requires this catch.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }

    }
    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


State プロパティの例 (VJ++)

この例では、State プロパティを使って、非同期接続が開かれ非同期コマンドが実行されている間、メッセージを表示します。

import com.ms.wfc.data.*;
import java.io.*;

public class StateX
{
    // The main entry point of the application.
    public static void main (String[] args)
    {
        StateX();
        System.exit(0);
    }
    // StateX Function
    static void StateX()
    {
        // Define ADO Objects.
        Connection cnn1 = null;
        Connection cnn2 = null;
        Command cmdChange = null;
        Command cmdRestore = null;

        // Declarations.
        String strCnn = "Provider=sqloledb; Data Source=srv;"+
                        "Initial Catalog = Pubs;User Id = sa; Password=;";
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            // Open two Asynchronous connections, displaying
            // a message while connecting.
            cnn1 = new Connection();
            cnn2 = new Connection();

            cnn1.open(strCnn,"","",AdoEnums.ConnectOption.ASYNCCONNECT);
            while(cnn1.getState()==AdoEnums.ObjectState.CONNECTING)
                System.out.println("Opening the first connection....");

            cnn2.open(strCnn,"","",AdoEnums.ConnectOption.ASYNCCONNECT);
            while(cnn2.getState()==AdoEnums.ObjectState.CONNECTING)
                System.out.println("Opening the second connection....");

            // Create two command Objects.
            cmdChange = new Command();
            cmdChange.setActiveConnection(cnn1);
            cmdChange.setCommandText("UPDATE Titles SET type = 'self_help'"+
                                     "WHERE type = 'psychology'");

            cmdRestore = new Command();
            cmdRestore.setActiveConnection(cnn2);
            cmdRestore.setCommandText(
                "UPDATE Titles SET type = 'psychology'"+
                "WHERE type = 'self_help'");

            // Executing the commands, displaying a message
            // while they are executing.
            cmdChange.execute(null,AdoEnums.ExecuteOption.ASYNCEXECUTE);

            while(cmdChange.getState() == AdoEnums.ObjectState.EXECUTING)
                System.out.println("Change command executing....");

            cmdRestore.execute(null,AdoEnums.ExecuteOption.ASYNCEXECUTE);

            while(cmdRestore.getState() == AdoEnums.ObjectState.EXECUTING)
                System.out.println("Restore command executing....");

            // Cleanup Objects before exit.
            cnn1.close();
            cnn2.close();

            System.out.println("Press <Enter> to continue..");
            in.readLine();
        }
        // System read requires this catch.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
        catch(AdoException ae)
        {
            // Notify user of any errors resulting from ADO.

            // As passing a connection, check for null pointer first.
            if(cnn1 != null)
            {
                System.out.println("The error has occured in cnn1:");
                PrintProviderError(cnn1);
            }
            else if(cnn2 != null)
            {
                System.out.println("The error has occured in cnn2:");
                PrintProviderError(cnn2);
            }
            else
            {
                System.out.println("Exception: "+ ae.getMessage());
            }
        }

    }
    // PrintProviderError Function
    static void PrintProviderError(Connection cnn1)
    {
        // Print Provider Errors from Connection Object.
        // ErrItem is an item object in the Connection’s Errors Collection.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if ( nCount > 0)
        {
            // Collection ranges from 0 to nCount-1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError Function
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Status プロパティの例 (VJ++)

この例では、Status プロパティを使って、バッチ更新の前にバッチ操作で修正されたレコードを表示します。

import java.io.*;
import com.ms.wfc.data.*;

public class StatusX
{
    // The main entry point of the application.

    public static void main (String[] args)
    {
        StatusX();
        System.exit(0);
    }
    // StatusX Function

    static void StatusX()
    {
        // Define ADO Objects.
        Recordset rstTitles = null;

        // Declarations.
        String strCnn = "Provider=sqloledb;Data Source=srv;"+
                        "Initial Catalog=Pubs;User Id =sa;Password=;";
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            // Open Recordset for batch update.
            rstTitles = new Recordset();
            rstTitles.setCursorType(AdoEnums.CursorType.KEYSET);
            rstTitles.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
            rstTitles.open("Titles", strCnn, AdoEnums.CursorType.KEYSET,
                AdoEnums.LockType.BATCHOPTIMISTIC,
                AdoEnums.CommandType.TABLE);

            // Change the type of psychology titles.
            while(!rstTitles.getEOF())
            {
                if(rstTitles.getField("Type").getString().trim().
                    equals(new String("psychology")))
                    rstTitles.getField("Type").setString("self_help");

                rstTitles.moveNext();
            }

            // Display Title ID and status.
            rstTitles.moveFirst();

            while(!rstTitles.getEOF())
            {
                if(rstTitles.getStatus()==AdoEnums.RecordStatus.MODIFIED)
                    System.out.println(rstTitles.getField("title_id").
                        getString() + "-  Modified");
                else
                    System.out.println(rstTitles.getField("title_id").
                        getString());
                rstTitles.moveNext();
            }

            // Cancel the update because this is a demonstration.
            rstTitles.cancelBatch();

            // Clean up objects before exit.
            rstTitles.close();

            System.out.println("Press <Enter> to continue..");
            in.readLine();
        }
        catch(AdoException ae)
        {
            // Notify the user of any errors that result from ADO.

            // As passing a Recordset, check for the null pointer first.
            if(rstTitles != null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // System read requires this catch.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
    }
    // PrintProviderError Function
    static void PrintProviderError(Connection cnn1)
    {
        // Print Provider Errors from Connection Object.
        // ErrItem is an item object in the Connection’s Errors Collection.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if ( nCount > 0)
        {
            // Collection ranges from 0 to nCount-1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError Function
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


StayInSync プロパティの例 (VJ++)

この例では、階層 Recordset 内の行へのアクセスを簡単にする StayInSync プロパティの機能を示します。

外側のループで、各 author の姓名、州、および ID が表示されます。各行に追加された Recordset が Fields コレクションから取得され、StayInSync プロパティによって、親の Recordset が新しい行に移動するたびに、自動的に rstTitleAuthor に割り当てられます。内側のループで、追加されたレコードセットの各行から 4 つのフィールドが表示されます。

import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class StayInSyncX
{
     // The main entry point for the application.

    public static void main (String[] args)
    {
        StayInSyncX();
        System.exit(0);
    }

    // StayInSyncX function

    static void StayInSyncX()
    {

        // Define ADO Objects.
        Connection cnConn1 = null;
        Recordset rstAuthors = null;
        Recordset rstTitleAuthor = null;

        // Declarations.
        BufferedReader in = new
            BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=Pubs;Provider=MSDataShape;" +
            "Data Provider=MSDASQL;uid=sa;pwd=;";

        try
        {
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            rstAuthors = new Recordset();
            rstAuthors.setStayInSync(true);
            rstAuthors.open("SHAPE  {select * from Authors} " +
                     "APPEND ({select * from titleauthor}" +
                     "RELATE au_id TO au_id) AS chapTitleAuthor",
                    cnConn1,
                    AdoEnums.CursorType.STATIC,
                    AdoEnums.LockType.READONLY,
                    AdoEnums.CommandType.TEXT);

            Variant varRstTitleAuthor = rstAuthors.getFields().
                getItem("chapTitleAuthor").getValue();
            rstTitleAuthor =new Recordset(varRstTitleAuthor.toObject());
            int intCount =0;
            while(!rstAuthors.getEOF())
            {
                System.out.println("\n" +
                    rstAuthors.getField("au_fname").getString() + " " +
                    rstAuthors.getField("au_lname").getString() + " " +
                     rstAuthors.getField("state").getString() + " " +
                     rstAuthors.getField("au_id").getString());
                while(!rstTitleAuthor.getEOF())
                {
                    System.out.println(rstTitleAuthor.getField(0).
                        getString() + " " +
                        rstTitleAuthor.getField(1).getString() + " " +
                        rstTitleAuthor.getField(2).getString() + " " +
                        rstTitleAuthor.getField(3).getString());
                    rstTitleAuthor.moveNext();
                }
                if(++intCount % 5 == 0)
                {
                    System.out.println("\nPress <Enter> to continue..");
                    in.readLine();
                }
                rstAuthors.moveNext();
            }
            // Cleanup objects before exit.
            rstTitleAuthor.close();
            rstAuthors.close();
            cnConn1.close();

            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function
    static void PrintProviderError(Connection cnn1)
    {
        // Print Provider Errors from Connection Object.
        // ErrItem is an item object in the Connection’s Errors Collection.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if ( nCount > 0)
        {
            // Collection ranges from 0 to nCount-1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError Function
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Support メソッドの例 (VJ++)

この例では、Supports メソッドを使って、異なるカーソル タイプで開かれたレコードセットによってサポートされるオプションを表示します。この例を実行するには、DisplaySupport 関数が必要です。

import com.ms.wfc.data.*;
import java.io.*;

public class SupportsX
{
    // The main entry point of the application.

    public static void main (String[] args)
    {
        SupportsX();
        System.exit(0);
    }
    // SupportsX Function

    static void SupportsX()
    {
        // Define ADO Objects.
        Recordset rstTitles = null;

        // Declarations.
        int[] aintCursorType = new int[4];
        String strCnn;
        int intIndex;
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            // Open connections.
            strCnn = "Provider= sqloledb;Data Source=srv;"+
                     "Initial Catalog=Pubs;User Id=sa;Password=;";

            // Fill array with CursorType constants.
            aintCursorType[0] = AdoEnums.CursorType.FORWARDONLY;
            aintCursorType[1] = AdoEnums.CursorType.KEYSET;
            aintCursorType[2] = AdoEnums.CursorType.DYNAMIC;
            aintCursorType[3] = AdoEnums.CursorType.STATIC;

            // Open recordset using each CursorType and
            // Optimistic Locking.  Then call the DisplaySupport
            // procedure to display the supported options.
            for(intIndex = 0; intIndex < 4; intIndex++)
            {
                rstTitles = new Recordset();
                rstTitles.setCursorType(aintCursorType[intIndex]);
                rstTitles.setLockType(AdoEnums.LockType.OPTIMISTIC);
                rstTitles.open("Titles", strCnn, aintCursorType[intIndex],
                    AdoEnums.LockType.OPTIMISTIC, AdoEnums.CommandType.TABLE);

                switch(aintCursorType[intIndex])
                {
                case AdoEnums.CursorType.FORWARDONLY:
                    System.out.println("ForwardOnly cursor supports:");
                    break;
                case AdoEnums.CursorType.KEYSET:
                    System.out.println("Keyset cursor supports:");
                    break;
                case AdoEnums.CursorType.DYNAMIC:
                    System.out.println("Dynamic cursor supports:");
                    break;
                case AdoEnums.CursorType.STATIC:
                    System.out.println("Static cursor supports:");
                    break;
                default:
                    break;
                }
                DisplaySupport(rstTitles);
                rstTitles.close();
                System.out.println("Press <Enter> to continue..");
                in.readLine();
            }
        }
        catch(AdoException ae)
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstTitles!= null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }
    // DisplaySupport Function

    static void DisplaySupport( Recordset rstTemp )
    {
        long[] alngConstants = new long[11];
        boolean booSupports;
        int intIndex;
        try
        {
            // Fill array with cursor option constants.
            alngConstants[0]  = AdoEnums.CursorOption.ADDNEW;
            alngConstants[1]  = AdoEnums.CursorOption.APPROXPOSITION;
            alngConstants[2]  = AdoEnums.CursorOption.BOOKMARK;
            alngConstants[3]  = AdoEnums.CursorOption.DELETE;
            alngConstants[4]  = AdoEnums.CursorOption.FIND;
            alngConstants[5]  = AdoEnums.CursorOption.HOLDRECORDS;
            alngConstants[6]  = AdoEnums.CursorOption.MOVEPREVIOUS;
            alngConstants[7]  = AdoEnums.CursorOption.NOTIFY;
            alngConstants[8]  = AdoEnums.CursorOption.RESYNC;
            alngConstants[9]  = AdoEnums.CursorOption.UPDATE;
            alngConstants[10] = AdoEnums.CursorOption.UPDATEBATCH;

            for(intIndex = 0; intIndex <= 10; intIndex++)
            {
                booSupports = rstTemp.supports((int)alngConstants[intIndex]);
                if (booSupports)
                {
                    switch((int)alngConstants[intIndex])
                    {
                    case AdoEnums.CursorOption.ADDNEW:
                            System.out.println("    AddNew");
                            break;
                    case AdoEnums.CursorOption.APPROXPOSITION:
                            System.out.println(
                                "    AbsolutePosition and AbsolutePage");
                            break;
                    case AdoEnums.CursorOption.BOOKMARK:
                            System.out.println("    Bookmark");
                            break;
                    case AdoEnums.CursorOption.DELETE:
                            System.out.println("    Delete");
                            break;
                    case AdoEnums.CursorOption.FIND:
                            System.out.println("    Find");
                            break;
                    case AdoEnums.CursorOption.HOLDRECORDS:
                            System.out.println("    Holding Records");
                            break;
                    case AdoEnums.CursorOption.MOVEPREVIOUS:
                            System.out.println("    MovePrevious and Move");
                            break;
                    case AdoEnums.CursorOption.NOTIFY:
                            System.out.println("    Notifications");
                            break;
                    case AdoEnums.CursorOption.RESYNC:
                            System.out.println("    Resyncing Data");
                            break;
                    case AdoEnums.CursorOption.UPDATE:
                            System.out.println("    Update");
                            break;
                    case AdoEnums.CursorOption.UPDATEBATCH:
                            System.out.println("    Batch Updating");
                            break;
                    default:
                            break;
                    }
                }
            }
        }
        catch(AdoException ae)
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstTemp!= null)
            {
                PrintProviderError(rstTemp.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
    }

    // PrintProviderError Function
    static void PrintProviderError(Connection cnn1)
    {
        // Print Provider Errors from Connection Object.
        // ErrItem is an item object in the Connection’s Errors Collection.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if ( nCount > 0)
        {
            // Collection ranges from 0 to nCount-1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError Function
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Type プロパティの例 (Field) (VJ++)

この例では、Employees テーブル内のすべての Field オブジェクトの Type プロパティの値に対応する定数名を表示して、Type プロパティの機能を示します。このプロシージャを実行するには、FieldType 関数が必要です。

import java.io.*;
import com.ms.wfc.data.*;

public class TypeX
{

    // The main entry point of the application.

    public static void main (String[] args)
    {
        TypeX();
        System.exit(0);
    }
    // TypeX Function

    static void TypeX()
    {
        // Define ADO Objects.
        Recordset rstEmployees = null;
        Field fldLoop = null;

        // Declarations.
        String strCnn = "Provider=sqloledb;Data Source=srv;"+
                     "Initial Catalog = Pubs;User Id=sa;Password=;";
        int intLoop;
        int intRecordCount = 0;
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            // Open the Recordset with data from Employees table.
            rstEmployees = new Recordset();
            rstEmployees.open("employee", strCnn,
                AdoEnums.CursorType.FORWARDONLY, AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE);

            System.out.println("Fields in the Employees table:\n");

            // Enumerate fields collection of Employees table.
            for(intLoop = 0;intLoop <
                rstEmployees.getFields().getCount();intLoop++)
            {
                intRecordCount++;
                // Loop needed for display of records
                if((intRecordCount % 6)==0)
                {
                    System.out.println("Press <Enter> to continue..");
                    in.readLine();
                }

                fldLoop = rstEmployees.getFields().getItem(intLoop);
                System.out.println("  Name:" + fldLoop.getName() + "\n"+
                    "  Type:" + FieldType(fldLoop.getType()) + "\n");

            }
            System.out.println("Press <Enter> to continue");
            in.readLine();
        }
        catch(AdoException ae)
        {
            // Notify the user of any errors that result from ADO.

            // As passing a Recordset, check for the null pointer first.
            if(rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // System read requires this catch.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
    }
    // FieldType Function
    static String FieldType( int intType )
    {
        String strLoop = null;

            switch(intType)
            {
            case AdoEnums.DataType.CHAR:
                strLoop = "adChar";
                break;
            case AdoEnums.DataType.VARCHAR:
                strLoop ="adVarChar";
                break;
            case AdoEnums.DataType.SMALLINT:
                strLoop = "adSmallInt";
                break;
            case AdoEnums.DataType.UNSIGNEDTINYINT:
                strLoop = "adUnsignedTinyInt" ;
                break;
            case AdoEnums.DataType.DBTIMESTAMP:
                strLoop = "adDBTimeStamp";
                break;
            default:
                break;
            }

        return strLoop;
    }

    // PrintProviderError Function
    static void PrintProviderError(Connection cnn1)
    {
        // Print Provider Errors from Connection Object.
        // ErrItem is an item object in the Connection’s Errors Collection.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if ( nCount > 0)
        {
            // Collection ranges from 0 to nCount-1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError Function
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Type プロパティの例 (Property) (VJ++)

この例では、Type プロパティの機能を示します。これは、Properties や Fields などのコレクションの名前と種類を一覧表示するユーティリティ モデルです。

Properties コレクションにアクセスするために Recordset を開く必要はありません。Properties コレクションは、Recordset オブジェクトのインスタンスが作成されると使用可能になります。ただし、CursorLocation プロパティを adUseClient に設定すると、Recordset オブジェクトの Properties コレクションにいくつかのダイナミック プロパティが追加されるため、この例は多少興味深いものになっています。例をわかりやすくするために、ここでは明示的に Item プロパティを使用して、各 Property オブジェクトにアクセスします。

import com.ms.wfc.data.*;
import java.io.* ;

public class TypeX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        TypeX();
        System.exit(0);
    }

    // TypeX  function

    static void TypeX()
    {
        // Define ADO Objects.
        Recordset rst = null;
        AdoProperty prop = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";
        String strMsg;
        int intIndex;
        int intDisplaysize = 15;

        try
        {
            rst = new Recordset();
            rst.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            for(intIndex = 0;
                intIndex <= rst.getProperties().getCount() - 1;intIndex++)
            {
                prop = rst.getProperties().getItem(intIndex);
                switch(prop.getType())
                {
                case AdoEnums.DataType.BIGINT :
                        strMsg = "adBigInt";
                        break;
                case AdoEnums.DataType.BINARY :
                        strMsg = "adBinary";
                        break;
                case AdoEnums.DataType.BOOLEAN :
                        strMsg = "adBoolean";
                        break;
                case AdoEnums.DataType.BSTR :
                        strMsg = "adBSTR";
                        break;
                case AdoEnums.DataType.CHAPTER :
                        strMsg = "adChapter";
                        break;
                case AdoEnums.DataType.CHAR :
                        strMsg = "adChar";
                        break;
                case AdoEnums.DataType.CURRENCY :
                        strMsg = "adCurrency";
                        break;
                case AdoEnums.DataType.DATE :
                        strMsg = "adDate";
                        break;
                case AdoEnums.DataType.DBDATE :
                        strMsg = "adDBDate";
                        break;
                case AdoEnums.DataType.DBTIME :
                        strMsg = "adDBTime";
                        break;
                case AdoEnums.DataType.DBTIMESTAMP :
                        strMsg = "adDBTimeStamp";
                        break;
                case AdoEnums.DataType.DECIMAL :
                        strMsg = "adDecimal";
                        break;
                case AdoEnums.DataType.DOUBLE :
                        strMsg = "adDouble";
                        break;
                case AdoEnums.DataType.EMPTY :
                        strMsg = "adEmpty";
                        break;
                case AdoEnums.DataType.ERROR :
                        strMsg = "adError";
                        break;
                case AdoEnums.DataType.FILETIME :
                        strMsg = "adFileTime";
                        break;
                case AdoEnums.DataType.GUID :
                        strMsg = "adGUID";
                        break;
                case AdoEnums.DataType.IDISPATCH :
                        strMsg = "adIDispatch";
                        break;
                case AdoEnums.DataType.INTEGER :
                        strMsg = "adInteger";
                        break;
                case AdoEnums.DataType.IUNKNOWN :
                        strMsg = "adIUnknown";
                        break;
                case AdoEnums.DataType.LONGVARBINARY :
                        strMsg = "adLongVarBinary";
                        break;
                case AdoEnums.DataType.LONGVARCHAR :
                        strMsg = "adLongVarChar";
                        break;
                case AdoEnums.DataType.LONGVARWCHAR :
                        strMsg = "adLongVarWChar";
                        break;
                case AdoEnums.DataType.NUMERIC :
                        strMsg = "adNumeric";
                        break;
                case AdoEnums.DataType.PROPVARIANT :
                        strMsg = "adPropVariant";
                        break;
                case AdoEnums.DataType.SINGLE :
                        strMsg = "adSingle";
                        break;
                case AdoEnums.DataType.SMALLINT :
                        strMsg = "adSmallInt";
                        break;
                case AdoEnums.DataType.TINYINT :
                        strMsg = "adTinyInt";
                        break;
                case AdoEnums.DataType.UNSIGNEDBIGINT :
                        strMsg = "adUnsignedBigInt";
                        break;
                case AdoEnums.DataType.UNSIGNEDINT :
                        strMsg = "adUnsignedInt";
                        break;
                case AdoEnums.DataType.UNSIGNEDSMALLINT :
                        strMsg = "adUnsignedSmallInt";
                        break;
                case AdoEnums.DataType.UNSIGNEDTINYINT :
                        strMsg = "adUnsignedTinyInt";
                        break;
                case AdoEnums.DataType.USERDEFINED :
                        strMsg = "adUserDefined";
                        break;
                case AdoEnums.DataType.VARBINARY :
                        strMsg = "adVarBinary";
                        break;
                case AdoEnums.DataType.VARCHAR :
                        strMsg = "adVarChar";
                        break;
                case AdoEnums.DataType.VARIANT :
                        strMsg = "adVariant";
                        break;
                case AdoEnums.DataType.VARNUMERIC :
                        strMsg = "adVarNumeric";
                        break;
                case AdoEnums.DataType.VARWCHAR :
                        strMsg = "adVarWChar";
                        break;
                case AdoEnums.DataType.WCHAR :
                        strMsg = "adWChar";
                        break;
                default:
                        strMsg = "*UNKNOWN*";
                        break;
                }
                System.out.println("Property " +
                                   Integer.toString(intIndex) +
                                   " : " +
                                   prop.getName() +
                                   ", Type = " +
                                   strMsg);
                if(intIndex % intDisplaysize == 0 && intIndex != 0)
                {
                    System.out.println("\nPress <Enter> to continue..");
                    in.readLine();
                }
            }

            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rst != null)
            {
                PrintProviderError(rst.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function
    static void PrintProviderError(Connection cnn1)
    {
        // Print Provider Errors from Connection Object.
        // ErrItem is an item object in the Connection’s Errors Collection.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if ( nCount > 0)
        {
            // Collection ranges from 0 to nCount-1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError Function
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Update、CancelUpdate メソッドの例 (VJ++)

この例では、Update メソッドの機能を、関連する CancelUpdate メソッドと共に示します。

import java.io.*;
import com.ms.wfc.data.*;

public class UpdateX
{
    // The main entry point of the application.

    public static void main (String[] args)
    {
        UpdateX();
        UpdateX2();
        System.exit(0);
    }
    // UpdateX Function

    static void UpdateX()
    {
        // Define ADO objects.
        Recordset rstEmployees = null;

        // Declarations.
        String strCnn = "Provider=sqloledb;Data Source=srv;"+
                        "Initial Catalog=Pubs;User Id=sa;Password=;";
        String strOldFirst;
        String strOldLast;
        String strMessage;
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            // Open Recordset with names from Employees table.
            rstEmployees = new Recordset();
            rstEmployees.setCursorType(AdoEnums.CursorType.KEYSET);
            rstEmployees.setLockType(AdoEnums.LockType.OPTIMISTIC);
            rstEmployees.open("SELECT fname,lname FROM Employee " +
                "ORDER BY lname", strCnn, AdoEnums.CursorType.KEYSET,
                AdoEnums.LockType.OPTIMISTIC, AdoEnums.CommandType.TEXT);

            // Store Original data.
            strOldFirst = rstEmployees.getField("fname").getString();
            strOldLast = rstEmployees.getField("lname").getString();

            // Change data in edit buffer.
            rstEmployees.getField("fname").setString("Linda");
            rstEmployees.getField("lname").setString("Kobara");

            // Show contents of buffer and get user input.
            strMessage = "Edit in Progress :\n" +
                "\tOriginal Data = " + strOldFirst + "  " + strOldLast +
                "\n\tData in Buffer = " +
                rstEmployees.getField("fname").getString() + " " +
                rstEmployees.getField("lname").getString() + "\n\n" +
                 "Use Update to replace the original data with " +
                "the buffered data in the Recordset?Enter (Y/N)";

            System.out.println(strMessage);
            if(in.readLine().trim().equalsIgnoreCase("Y"))
                rstEmployees.update();
            else
                rstEmployees.cancelUpdate();

            // Show the resulting data.
            System.out.println("Data in Recordset = " +
                rstEmployees.getField("fname").getString() +
                "  " + rstEmployees.getField("lname").getString()+ "\n");

            // Restore original data because this is a demonstration.
            if(!(strOldFirst.equals(
                rstEmployees.getField("fname").getString()) &&
                strOldLast.equals(
                rstEmployees.getField("lname").getString())))
            {
                rstEmployees.getField("fname").setString(strOldFirst);
                rstEmployees.getField("lname").setString(strOldLast);
                rstEmployees.update();
            }
            // Cleanup Objects before exit.
            rstEmployees.close();

            System.out.println("Press <Enter> to continue..");
            in.readLine();

        }
        catch(AdoException ae)
        {
            // Notify the user of any errors that result from ADO.

            // As passing a recordset, check for null pointer first.
            if(rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: "+ ae.getMessage());
            }
        }
        // System read requires this catch.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
    }
    // UpdateX2 Function

    static void UpdateX2()
    {
        // This example demonstrates the Update method in conjunction
        // with the AddNew method.

        // Define ADO Objects.
        Connection cnn1 = null;
        Recordset rstEmployees = null;

        // Declarations.
        String strCnn = "Provider=sqloledb;Data Source=srv;"+
                        "Initial Catalog=Pubs;User Id=sa;Password=;";
        String strEmpID;
        String strOldFirst;
        String strOldLast;
        String strMessage;
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            // Open a connection.
            cnn1 = new Connection();
            cnn1.open(strCnn);

            // Open Recordset with data from Employees table.
            rstEmployees = new Recordset();
            rstEmployees.setCursorType(AdoEnums.CursorType.KEYSET);
            rstEmployees.setLockType(AdoEnums.LockType.OPTIMISTIC);
            rstEmployees.open("employee", cnn1, AdoEnums.CursorType.KEYSET,
                AdoEnums.LockType.OPTIMISTIC, AdoEnums.CommandType.TABLE);

            rstEmployees.addNew();
            strEmpID="B-S55555M";
            rstEmployees.getField("emp_id").setString(strEmpID);
            rstEmployees.getField("fname").setString("Bill");
            rstEmployees.getField("lname").setString("Sornsin");

            // Show contents of buffer and get user input.
            strMessage = "AddNew in progress : " + "\n" +
                "\tData in Buffer = " +
                rstEmployees.getField("emp_id").getString() +
                "  " + rstEmployees.getField("fname").getString() + "  " +
                rstEmployees.getField("lname").getString()+ "\n\n" +
                "Use Update to save buffer to recordset?Enter (Y/N)";
            System.out.println(strMessage);
            if(in.readLine().trim().equalsIgnoreCase("Y"))
            {
                rstEmployees.update();
                // Go to the new record and show the resulting data.
                System.out.println("Data in recordset = " +
                    rstEmployees.getField("emp_id").getString()+
                    "  " + rstEmployees.getField("fname").getString() +
                    "  " + rstEmployees.getField("lname").getString() + "\n");
            }
            else
            {
                rstEmployees.cancelUpdate();
                System.out.println("No new Record added.\n");
            }
            // Delete new data because this is a demonstration.
            cnn1.execute(
                "DELETE FROM employee WHERE emp_id='" + strEmpID +"'");

            // Cleanup Objects before exit
            rstEmployees.close();

            System.out.println("Press <Enter> to continue..");
            in.readLine();
        }
        catch(AdoException ae)
        {
            // Notify the user of any errors that result from ADO.

            // As passing a recordset, check for null pointer first.
            if(rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: "+ ae.getMessage());
            }
        }
        // System read requires this catch.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
    }
    // PrintProviderError Function
    static void PrintProviderError(Connection cnn1)
    {
        // Print Provider Errors from Connection Object.
        // ErrItem is an item object in the Connection’s Errors Collection.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if ( nCount > 0)
        {
            // Collection ranges from 0 to nCount-1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError Function
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


UpdateBatch、CancelBatch メソッドの例 (VJ++)

この例では、UpdateBatch メソッドの機能を、関連する CancelBatch メソッドと共に示します。

import java.io.*;
import com.ms.wfc.data.*;

public class UpdateBatchX
{
    // The main entry point of the application.
    public static void main (String[] args)
    {
        UpdateBatchX();
        System.exit(0);
    }
    // UpdateBatchX Function

    static void UpdateBatchX()
    {
        // Define ADO Objects.
        Recordset rstTitles = null;

        // Declarations.
        String strCnn = "Provider=sqloledb;Data Source=srv;"+
                        "Initial Catalog=Pubs;User Id=sa;Password=;";
        String strTitle;
        String strMessage;
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            rstTitles = new Recordset();
            rstTitles.setCursorType(AdoEnums.CursorType.KEYSET);
            rstTitles.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
            rstTitles.open("Titles", strCnn, AdoEnums.CursorType.KEYSET,
                AdoEnums.LockType.BATCHOPTIMISTIC,
                AdoEnums.CommandType.TABLE);

            rstTitles.moveFirst();

            // Loop through recordset and ask user if she wants
            // to change the type for the specified table.
            while(!rstTitles.getEOF())
            {
                if(rstTitles.getField("Type").getString().
                    trim().equalsIgnoreCase("psychology"))
                {
                    strTitle = rstTitles.getField("Title").getString();
                    strMessage = "Title: "+ strTitle + "\n" +
                        "Change type to self_help?Enter (Y/N)";
                    System.out.println(strMessage);
                    if(in.readLine().trim().equalsIgnoreCase("Y"))
                        rstTitles.getField("type").setString("self_help");
                }
                rstTitles.moveNext();
            }
            // Ask the user if she wants to commit to all the
            // changes made above.
            System.out.println("Save all changes?Enter (Y/N)");
            if(in.readLine().trim().equalsIgnoreCase("Y"))
                rstTitles.updateBatch();
            else
                rstTitles.cancelBatch();

            // Print current data in recordset.
            rstTitles.requery();
            rstTitles.moveFirst();
            while(!rstTitles.getEOF())
            {
            System.out.println(rstTitles.getField("title").getString() +
                " - " + rstTitles.getField("type").getString());
            rstTitles.moveNext();
            }

            // Restore original values because this is a demonstration.
            rstTitles.moveFirst();
            while(!rstTitles.getEOF())
            {
                if(rstTitles.getField("type").getString().
                    trim().equalsIgnoreCase("self_help"))
                    rstTitles.getField("type").setString("psychology");
                rstTitles.moveNext();
            }
            rstTitles.updateBatch();

            // Clean up objects before exit.
            rstTitles.close();

            System.out.println("Press <Enter> to continue..");
            in.readLine();

        }
        catch(AdoException ae)
        {
            // Notify the user of any errors that result from ADO.

            // As passing a recordset, check for null pointer first.
            if(rstTitles != null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // System read requires this catch.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function
    static void PrintProviderError(Connection cnn1)
    {
        // Print Provider Errors from Connection Object.
        // ErrItem is an item object in the Connection’s Errors Collection.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if ( nCount > 0)
        {
            // Collection ranges from 0 to nCount-1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError Function
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Value プロパティの例 (VJ++)

この例では、Field および Property オブジェクトを使って、Employees テーブルのフィールドとプロパティの値を表示することによって、Value プロパティの機能を示します。

import java.io.*;
import com.ms.wfc.data.*;
import com.ms.com.*;

public class ValueX
{
    // Main Function
    public static void main (String[] args)
    {
        ValueX();
        System.exit(0);
    }
    static void ValueX()
    {
        // Define ADO Objects.
        Recordset rstEmployees = null;
        Field    fldLoop     = null;
        AdoProperty  prpLoop   = null;

        // Declarations.
        String strCnn = "Provider=sqloledb; Data Source= srv;" +
            "Initial Catalog=Pubs; User Id=sa; Password=;";
        int intLoop;
        BufferedReader in = new
            BufferedReader(new InputStreamReader(System.in));
        Variant varPropertyValue;
        String strMessage;

        try
        {
            // Open a Recordset with data from Employees table.
            rstEmployees = new Recordset();
            rstEmployees.open("employee", strCnn,
                AdoEnums.CursorType.FORWARDONLY, AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE);

            System.out.println("Field values in rstEmployees\n");

            // Enumerate the Fields collection of the Employees
            // table.
            for(intLoop = 0;
                intLoop<rstEmployees.getFields().getCount();intLoop++)
            {
                fldLoop = rstEmployees.getFields().getItem(intLoop);
                // Because Value is the default property of a
                // Field object, the use of the actual keyword
                // here is optional.
                System.out.println("\t" + fldLoop.getName() + " = " +
                    fldLoop.getValue());
            }
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
            System.out.println("Property values in rstEmployees\n");

            // Enumerate the Properties collection of the
            // Recordset object.
            int intCount = 0;
            for(intLoop = 0;
                intLoop<rstEmployees.getProperties().getCount();intLoop++)
            {
                prpLoop = rstEmployees.getProperties().getItem(intLoop);
                // Because Value is the default property of a
                // Field object, the use of the actual keyword
                // here is optional.
                strMessage = "\t" + prpLoop.getName() + " =  ";
                varPropertyValue = prpLoop.getValue();
                short vttype =varPropertyValue.getvt();
                switch (vttype)
                {
                case Variant.VariantBoolean :
                    {
                        if (varPropertyValue.getBoolean())
                            strMessage +="True";
                        else
                            strMessage +="False";
                    }
                    break;
                case Variant.VariantInt :
                    strMessage += varPropertyValue.getInt();
                    break;
                default :
                    break;
                }
                System.out.println(strMessage);
                intCount++;
                // Loop used to display records
                if (intCount % 15 == 0)
                {
                    System.out.println("\nPress <Enter> to continue..");
                    in.readLine();
                    intCount = 0;
                }

            }
            // Cleanup objects before exit.
            rstEmployees.close();
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        // System read requires this catch.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
        catch(AdoException ae)
        {
            // Notify the user of any errors that result from ADO.

            // As passing a recordset, check for null pointer first.
            if(rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

    }
    // PrintProviderError Function
    static void PrintProviderError(Connection cnn1)
    {
        // Print Provider Errors from Connection Object.
        // ErrItem is an item object in the Connection’s Errors Collection.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if ( nCount > 0)
        {
            // Collection ranges from 0 to nCount-1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError Function
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Version プロパティの例 (VJ++)

この例では、Connection オブジェクトの Version プロパティを使って、現在の ADO のバージョンを表示します。また、いくつかのダイナミック プロパティを使って、次の項目を表示します。

  • 現在の DBMS の名前およびバージョン

  • OLE DB のバージョン

  • プロバイダの名前およびバージョン

  • ODBC のバージョン

  • ODBC ドライバの名前およびバージョン
import com.ms.wfc.data.*;
import java.io.*;

public class VersionX
{
    // The main entry point of the application.
    public static void main (String[] args)
    {
        VersionX();
        System.exit(0);
    }
    // VersionX Function
    static void VersionX()
    {
        // Define ADO Objects.
        Connection cnn1 = null;

        // Declarations.
        String strCnn = "Driver={SQL Server};Server=srv;" +
                        "User Id=sa; Password=;database=Pubs;";
        String strVersionInfo;
        BufferedReader in = new
            BufferedReader(new InputStreamReader(System.in));
        try
        {
            // Open connection.
            cnn1 = new Connection();
            cnn1.open(strCnn);

            strVersionInfo = "\tADO Version:\t\t" +
                cnn1.getVersion().toString()+"\n"+
                "\tDBMS Name:\t\t" +
                cnn1.getProperties().getItem("DBMS Name").getString() +"\n"+
                "\tDBMS Version:\t\t"+
                cnn1.getProperties().getItem("DBMS Version").getString() +
                "\n" + "\tOLE DB Version:\t\t" +
                cnn1.getProperties().getItem("OLE DB Version").getString()+
                "\n" + "\tProvider Name:\t\t" +
                cnn1.getProperties().getItem("Provider Name").getString() +
                "\n" + "\tProvider Version:\t" +
                cnn1.getProperties().getItem("Provider Version").
                getString() + "\n" + "\tDriver Name:\t\t" +
                cnn1.getProperties().getItem("Driver Name").getString() +
                "\n" + "\tDriver Version:\t\t" +
                cnn1.getProperties().getItem("Driver Version").getString()+
                "\n" + "\tDriver ODBC Version:\t" +
                cnn1.getProperties().getItem(
                "Driver ODBC Version").getString()+ "\n";
            System.out.println("\n\n" + strVersionInfo);

            // Cleanup Objects before exit.
            cnn1.close();
            System.out.println("Press <Enter> to continue..");
            in.readLine();
        }
        // System read requires this catch.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
        catch(AdoException ae)
        {
            // Notify the user of any errors that result from ADO.

            // As passing a recordset, check for null pointer first.
            if(cnn1!= null)
            {
                PrintProviderError(cnn1);
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

    }
    // PrintProviderError Function
    static void PrintProviderError(Connection cnn1)
    {
        // Print Provider Errors from Connection Object.
        // ErrItem is an item object in the Connection’s Errors Collection.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if ( nCount > 0)
        {
            // Collection ranges from 0 to nCount-1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError Function
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


ADO でのプロバイダの使用

ここでは、データ プロバイダ、サービス プロバイダ、およびサービス コンポーネントの 3 種類のプロバイダについて説明しています。プロバイダは、データを提供するものとサービスを提供するものの 2 つのカテゴリに大別することができます。"データ プロバイダ" は、独自のデータを所有し、そのデータをテーブル形式でユーザーのアプリケーションに表示します。"サービス プロバイダ" は、データの作成と利用の処理をカプセル化して、ADO アプリケーションの機能を強化します。サービス プロバイダは、さらに、ほかのサービス プロバイダまたはサービス コンポーネントと連携して動作する "サービス コンポーネント" として定義されることもあります。

データ プロバイダ

ADO は高性能で柔軟性に富んでおり、使用するプロバイダの機能にかかわらず、どんな種類のデータ プロバイダに接続しても同じプログラミング モデルを提供することができます。

ただし、各データ プロバイダはそれぞれ異なっているため、使用するアプリケーションと ADO の間でどのようなやり取りが行われるかは、データ プロバイダごとに少しづつ異なります。その相違点は、通常、次の 3つのカテゴリに分類されます。

  • ConnectionString プロパティの接続パラメータ

  • Command オブジェクトの使用方法

  • プロバイダ固有の Recordset の動作

Microsoft から現在入手可能な各データ プロバイダの詳細については、次の各トピックを参照してください。

適用対象 | トピック
ODBC データベース | Microsoft OLE DB Provider for ODBC
Microsoft Indexing Service | Microsoft OLE DB Provider for Microsoft Indexing Service
Microsoft Active Directory Service | Microsoft OLE DB Provider for Microsoft Active Directory Service
Microsoft Jet データベース | OLE DB Provider for Microsoft Jet
Microsoft SQL Server | Microsoft OLE DB Provider for SQL Server
Oracle データベース | Microsoft OLE DB Provider for Oracle
Internet Publishing | Microsoft OLE DB Provider for Internet Publishing

プロバイダ固有のダイナミック プロパティ

Connection オブジェクト、Command オブジェクト、および Recordset オブジェクトの Properties コレクションには、プロバイダ固有のダイナミック プロパティがあります。これらのプロパティは、ADO がサポートする組み込みプロパティにはない、各プロバイダに固有の機能に関する情報を提供します。

接続を確立してこれらのオブジェクトを作成した後、そのオブジェクトの Properties コレクションで Refresh メソッドを使用すると、プロバイダ固有のプロパティを取得できます。プロバイダ固有のダイナミック プロパティの詳細については、各プロバイダのマニュアル、および「OLE DB Programmer's Reference」を参照してください。

サービス プロバイダ

サービス プロバイダを使用するには、キーワードを入力する必要があります。また、各サービス プロバイダに関連付けられたプロバイダ固有のダイナミック プロパティについて理解する必要があります。Microsoft から現在入手可能な各サービス プロバイダの詳細については、次の各トピックを参照してください。

  • Microsoft Data Shaping Service for OLE DB

  • Microsoft OLE DB Persistence Provider

  • Microsoft OLE DB Remoting Provider

サービス コンポーネント

Microsoft Cursor Service for OLE DB サービス コンポーネントは、データ プロバイダのカーソル サポート機能を追加します。また、サービス コンポーネントは、キーワードを必要とし、ダイナミック プロパティを持ちます。

関連項目 プロバイダの詳細については、Microsoft® Data Access Components SDK の Microsoft OLE DB のマニュアル、または Microsoft Universal Data Access の Web サイトを参照してください。


Microsoft OLE DB Provider for ODBC

ADO または RDS のプログラマーにとって、すべてのデータ ソースで OLE DB インターフェイスが公開され、ADO でデータ ソースを直接呼び出すことができれば理想的です。OLE DB インターフェイスを実装するデータベース提供者が増えていますが、まだこの方法がとられていないデータ ソースもあります。ただし、現在使用できる実質上のすべての DBMS システムでは、ODBC によるアクセスが可能です。

ODBC ドライバは、Oracle などのMicrosoft 以外のデータベース製品だけでなく、Microsoft® SQL Server™、Microsoft® Access (Microsoft Jet データベース エンジン)、Microsoft® FoxPro® など、現在使用できる主な DBMS のすべてで利用できます。

ただし、この Microsoft ODBC Provider を利用すると、ADO からすべての ODBC データ ソースに接続できます。このプロバイダは、フリースレッドであり、Unicode を使用できます。

このプロバイダは、トランザクションをサポートしています。ただし、DBMS エンジンの種類によって、サポートするトランザクションの種類が異なります。たとえば、Microsoft Access は、5 レベルまでのネストされたトランザクションをサポートします。

このプロバイダは、ADO の既定プロバイダであり、プロバイダに依存するすべての ADO プロパティおよび ADO メソッドをサポートします。

接続文字列パラメータ

このプロバイダに接続するには、ConnectionString プロパティの Provider= 引数を次のように設定します。

MSDASQL

Provider プロパティを取得した場合も、この文字列が返されます。

接続文字列の例

このプロバイダの代表的な接続文字列を次に示します。

"Provider=MSDASQL;DSN=dsnName;UID=userName;PWD=userPassword;"

この接続文字列は、次に示すキーワードで構成されています。

キーワード | 説明
Provider | OLE DB Provider for ODBC を指定します。
DSN | データ ソース名を指定します。
UID | ユーザー名を指定します。
PWD | ユーザー パスワードを指定します。

OLE DB Provider for ODBC は ADO の既定プロバイダであり、接続文字列で Provider= パラメータを省略した場合は、このプロバイダへの接続の確立が試行されます。

このプロバイダは、ADO で定義された接続パラメータ以外の独自の接続パラメータはサポートしません。ADO 以外の接続パラメータが指定されている場合は、そのパラメータを ODBC ドライバ マネージャに渡します。

Provider パラメータを省略できるので、同じデータ ソースに対して ODBC 接続文字列とまったく同じ ADO 接続文字列を作成できます。ODBC 接続文字列を作成する場合と同じパラメータ名 (DRIVER=、DATABASE=、DSN= など)、パラメータ値、および構文を使用してください。定義済みのデータ ソース名 (DSN) または FileDSN を指定してもしなくても、接続することができます。

DSN または FileDSN を指定する場合の構文:

"[Provider=MSDASQL;] { DSN=name | FileDSN=filename } ; [DATABASE=database;] UID=user; PWD=password"

DSN を指定しない場合の構文 (DSN なしの接続):

"[Provider=MSDASQL;] DRIVER=driver; SERVER=server; DATABASE=database; UID=user; PWD=password"

DSN または FileDSN を使用する場合は、Windows のコントロール パネルの [ODBC データ ソース アドミニストレータ] で定義しておく必要があります。Microsoft Windows 2000 では、ODBC アドミニストレータは管理ツールに含まれています。以前のバージョンの Windows では、ODBC アドミニストレータのアイコンは [32 ビット ODBC] または [ODBC] という名前で表示されています。

DSN を設定する別の方法として、"SQL Server" などの ODBC ドライバ (DRIVER=)、サーバー名 (SERVER=)、およびデータベース名 (DATABASE=) を指定することもできます。

また、ユーザー アカウント名 (UID=) と、そのユーザー アカウント用のパスワード (PWD=) を、ODBC 用のパラメータ、または ADO で定義されている標準の User ID パラメータと Password パラメータに指定することができます。

DSN の定義にデータベースが指定されている場合でも、DSN に加えて DATABASE パラメータを指定すると、別のデータベースに接続することができます。DSN を使用するときは、必ず DATABASE パラメータを指定することをお勧めします。そうすることで、最後に DSN の定義を確認した後で別のユーザーが既定のデータベースのパラメータを変更している場合でも、目的のデータベースに確実に接続することができます。

プロバイダ固有の接続プロパティ

OLE DB provider for ODBC は、Connection オブジェクトの Properties コレクションに各種のプロパティを追加します。次の表は、このプロバイダに固有のプロパティの一覧です。かっこ内に、対応する OLE DB プロパティ名を示しています。

プロパティ名 | 説明
Accessible Procedures (KAGPROP_ACCESSIBLEPROCEDURES) | ユーザーがストアド プロシージャにアクセス可能かどうかを示します。
Accessible Tables (KAGPROP_ACCESSIBLETABLES) | ユーザーがデータベース テーブルに対して SELECT ステートメントを実行する権限があるかどうかを示します。
Active Statements (KAGPROP_ACTIVESTATEMENTS) | ODBC ドライバが 1 つの接続でサポートできる処理数を示します。
Driver Name (KAGPROP_DRIVERNAME) | ODBC ドライバのファイル名を示します。
Driver ODBC Version (KAGPROP_DRIVERODBCVER) | このドライバがサポートする ODBC のバージョンを示します。
File Usage (KAGPROP_FILEUSAGE) | ドライバがデータ ソースのファイルをテーブルとして扱うか、またはカタログとして扱うかを示します。
Like Escape Clause (KAGPROP_LIKEESCAPECLAUSE) | ドライバが、WHERE 句の LIKE 述語でパーセント記号 (%) および下線記号 (_) のエスケープ文字を定義および使用できるかどうかを示します。
Max Columns in Group By (KAGPROP_MAXCOLUMNSINGROUPBY) | SELECT ステートメントの GROUP BY 句に記述できる最大列数を示します。
Max Columns in Index (KAGPROP_MAXCOLUMNSININDEX) | インデックスに格納できる最大列数を示します。
Max Columns in Order By (KAGPROP_MAXCOLUMNSINORDERBY) | SELECT ステートメントの ORDER BY 句に記述できる最大列数を示します。
Max Columns in Select (KAGPROP_MAXCOLUMNSINSELECT) | SELECT ステートメントの SELECT 部分に記述できる最大列数を示します。
Max Columns in Table (KAGPROP_MAXCOLUMNSINTABLE) | テーブルの最大列数を示します。
Numeric Functions (KAGPROP_NUMERICFUNCTIONS) | ODBC ドライバがサポートする数値関数を示します。このビットマスクで使用される関数名とそれに関連付けられた値の一覧については、ODBC のマニュアルの「Appendix E: Scalar Functions」を参照してください。
Outer Join Capabilities (KAGPROP_OJCAPABILITY) | プロバイダがサポートする OUTER JOIN の種類を示します。
Outer Joins (KAGPROP_OUTERJOINS) | プロバイダが OUTER JOIN をサポートするかどうかを示します。
Special Characters (KAGPROP_SPECIALCHARACTERS) | ODBC ドライバで特別な意味を持つ文字を示します。
Stored Procedures (KAGPROP_PROCEDURES) | この ODBC ドライバでストアド プロシージャを使用できるかどうかを示します。
String Functions (KAGPROP_STRINGFUNCTIONS) | ODBC ドライバがサポートする文字列関数を示します。このビットマスクで使用される関数名とそれに関連付けられた値の一覧については、ODBC のマニュアルの「Appendix E: Scalar Functions」を参照してください。
System Functions (KAGPROP_SYSTEMFUNCTIONS) | ODBC ドライバがサポートするシステム関数を示します。このビットマスクで使用される関数名とそれに関連付けられた値の一覧については、ODBC のマニュアルの「Appendix E: Scalar Functions」を参照してください。
Time/Date Functions (KAGPROP_TIMEDATEFUNCTIONS) | ODBC ドライバがサポートする時刻/日付関数を示します。このビットマスクで使用される関数名とそれに関連付けられた値の一覧については、ODBC のマニュアルの「Appendix E: Scalar Functions」を参照してください。
SQL Grammar Support (KAGPROP_ODBCSQLCONFORMANCE) | ODBC ドライバがサポートする SQL 文法を示します。

プロバイダ固有のレコードセットとコマンドのプロパティ

OLE DB Provider for ODBC は、Recordset オブジェクトおよび Command オブジェクトの Properties コレクションに各種のプロパティを追加します。次の表は、このプロバイダに固有のプロパティの一覧です。かっこ内に、対応する OLE DB プロパティ名を示しています。

プロパティ名 | 説明
Query Based Updates/Deletes/Inserts (KAGPROP_QUERYBASEDUPDATES) | 更新、削除、および挿入を SQL クエリを使って実行できるかどうかを示します。
ODBC Concurrency Type (KAGPROP_CONCURRENCY) | 2 人のユーザーがデータ ソースの同じデータに同時にアクセスしようとしたときに発生する問題を減らすための方法を示します。
BLOB accessibility on Forward-Only cursor (KAGPROP_BLOBSONFOCURSOR) | 前方スクロールのみのカーソルの使用時に BLOB Fields にアクセスできるかどうかを示します。
Include SQL_FLOAT, SQL_DOUBLE, and SQL_REAL in QBU WHERE clauses (KAGPROP_INCLUDENONEXACT) | SQL_FLOAT、SQL_DOUBLE、および SQL_REAL の値を QBU WHERE 句に含めることができるかどうかを示します。
Position on the last row after insert (KAGPROP_POSITIONONNEWROW) | 新規レコードをテーブルに追加した後、テーブルの最後の行がカレント行になるかどうかを示します。
IRowsetChangeExtInfo (KAGPROP_IROWSETCHANGEEXTINFO) | IRowsetChange インターフェイスが拡張情報を提供するかどうかを示します。
ODBC Cursor Type (KAGPROP_CURSOR) | Recordset で使用されるカーソル タイプを示します。
Generate a Rowset that can be marshaled (KAGPROP_MARSHALLABLE) | ODBC ドライバがマーシャリング可能なレコードセットを生成することを示します。

コマンド テキスト

Command オブジェクトの使用方法は、データ ソース、および受け入れるクエリまたはコマンド ステートメントの種類によって大きく異なります。

ODBC には、ストアド プロシージャを呼び出すための専用の構文があります。Command オブジェクトの CommandText プロパティ、Connection オブジェクトの Execute メソッドの CommandText 引数、または Recordset オブジェクトの Open メソッドの Source 引数の場合は、次の構文で文字列を渡します。

"{ [ ? = ] call procedure [ ( ? [, ? [ , ? ]] ) ] }"

構文中の ? は、Parameters コレクションのオブジェクトを参照します。最初の ? は Parameters(0) を参照し、次の ? は Parameters(1) を参照し、以下同様に続きます。

パラメータの参照は省略可能であり、ストアド プロシージャの構造に依存します。パラメータを定義していないストアド プロシージャを呼び出す場合の構文は、次のようになります。

"{ call procedure }"

2 つのクエリ パラメータを持つ場合は、次のようになります。

"{ call procedure ( ?, ? ) }"

ストアド プロシージャが値を返す場合、戻り値は別のパラメータとして扱われます。クエリ パラメータがなく、戻り値がある場合は、次のようになります。

"{ ? = call procedure }"

戻り値があり、2 つのクエリ パラメータがある場合は、次のようになります。

"{ ? = call procedure ( ?, ? ) }"

Recordset の動作

次の表は、このプロバイダで開いた Recordset オブジェクトで利用可能な標準の ADO メソッドおよび ADO プロパティの一覧です。

プロバイダの設定による Recordset の動作の詳細については、Supports メソッドを実行し、Recordset の Properties コレクションを列挙して、プロバイダ固有のダイナミック プロパティがあるかどうかを確認します。

標準 ADO Recordset プロパティの有用性:

プロパティ | 前方のみ | 動的 | キーセット | 静的
AbsolutePage | 利用不可 | 利用不可 | 読み取り/書き込み | 読み取り/書き込み
AbsolutePosition | 利用不可 | 利用不可 | 読み取り/書き込み | 読み取り/書き込み
ActiveConnection | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み
BOF | 読み取り専用 | 読み取り専用 | 読み取り専用 | 読み取り専用
Bookmark | 利用不可 | 利用不可 | 読み取り/書き込み | 読み取り/書き込み
CacheSize | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み
CursorLocation | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み
CursorType | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み
EditMode | 読み取り専用 | 読み取り専用 | 読み取り専用 | 読み取り専用
Filter | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み
LockType | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み
MarshalOptions | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み
MaxRecords | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み
PageCount | 読み取り/書き込み | 利用不可 | 読み取り専用 | 読み取り専用
PageSize | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み
RecordCount | 読み取り/書き込み | 利用不可 | 読み取り専用 | 読み取り専用
Source | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み | 読み取り/書き込み
State | 読み取り専用 | 読み取り専用 | 読み取り専用 | 読み取り専用
Status | 読み取り専用 | 読み取り専用 | 読み取り専用 | 読み取り専用

バージョン 1.0 の Microsoft OLE DB Provider for ODBC を ADO で使用する場合は、AbsolutePosition プロパティおよび AbsolutePage プロパティは書き込み専用になります。

標準 ADO Recordset メソッドの有用性:

メソッド | 前方のみ | 動的 | キーセット | 静的
AddNew | 可能 | 可能 | 可能 | 可能
Cancel | 可能 | 可能 | 可能 | 可能
CancelBatch | 可能 | 可能 | 可能 | 可能
CancelUpdate | 可能 | 可能 | 可能 | 可能
Clone | 不可 | 不可 | 可能 | 可能
Close | 可能 | 可能 | 可能 | 可能
Delete | 可能 | 可能 | 可能 | 可能
GetRows | 可能 | 可能 | 可能 | 可能
Move | 可能 | 可能 | 可能 | 可能
MoveFirst | 可能 | 可能 | 可能 | 可能
MoveLast | 不可 | 可能 | 可能 | 可能
MoveNext | 可能 | 可能 | 可能 | 可能
MovePrevious | 不可 | 可能 | 可能 | 可能
NextRecordset* | 可能 | 可能 | 可能 | 可能
Open | 可能 | 可能 | 可能 | 可能
Requery | 可能 | 可能 | 可能 | 可能
Resync | 不可 | 不可 | 可能 | 可能
Supports | 可能 | 可能 | 可能 | 可能
Update | 可能 | 可能 | 可能 | 可能
UpdateBatch | 可能 | 可能 | 可能 | 可能

* Microsoft Access データベースではサポートされていません。

ダイナミック プロパティ

Microsoft OLE DB Provider for ODBC は、開かれていない Connection オブジェクト、Recordset オブジェクト、および Command オブジェクトの Properties コレクションに各種のダイナミック プロパティを追加します。

次の表は、各ダイナミック プロパティの ADO プロパティ名および対応する OLE DB プロパティ名の一覧です。「OLE DB Programmer's Reference」では、「Description」で ADO プロパティ名について触れています。これらのプロパティの詳細については、「OLE DB Programmer's Reference」の「Index」で OLE DB プロパティ名を検索するか、または「Appendix C: OLE DB Properties」を参照してください。

Connection ダイナミック プロパティ

次に示すプロパティが、Connection オブジェクトの Properties コレクションに追加されます。

ADO プロパティ名 | OLE DB プロパティ名
Active Sessions | DBPROP_ACTIVESESSIONS
Asynchable Abort | DBPROP_ASYNCTXNABORT
Asynchable Commit | DBPROP_ASYNCTNXCOMMIT
Autocommit Isolation Levels | DBPROP_SESS_AUTOCOMMITISOLEVELS
Catalog Location | DBPROP_CATALOGLOCATION
Catalog Term | DBPROP_CATALOGTERM
Column Definition | DBPROP_COLUMNDEFINITION
Connect Timeout | DBPROP_INIT_TIMEOUT
Current Catalog | DBPROP_CURRENTCATALOG
Data Source | DBPROP_INIT_DATASOURCE
Data Source Name | DBPROP_DATASOURCENAME
Data Source Object Threading Model | DBPROP_DSOTHREADMODEL
DBMS Name | DBPROP_DBMSNAME
DBMS Version | DBPROP_DBMSVER
Extended Properties | DBPROP_INIT_PROVIDERSTRING
GROUP BY Support | DBPROP_GROUPBY
Heterogeneous Table Support | DBPROP_HETEROGENEOUSTABLES
Identifier Case Sensitivity | DBPROP_IDENTIFIERCASE
Initial Catalog | DBPROP_INIT_CATALOG
Isolation Levels | DBPROP_SUPPORTEDTXNISOLEVELS
Isolation Retention | DBPROP_SUPPORTEDTXNISORETAIN
Locale Identifier | DBPROP_INIT_LCID
Location | DBPROP_INIT_LOCATION
Maximum Index Size | DBPROP_MAXINDEXSIZE
Maximum Row Size | DBPROP_MAXROWSIZE
Maximum Row Size Includes BLOB | DBPROP_MAXROWSIZEINCLUDESBLOB
Maximum Tables in SELECT | DBPROP_MAXTABLESINSELECT
Mode | DBPROP_INIT_MODE
Multiple Parameter Sets | DBPROP_MULTIPLEPARAMSETS
Multiple Results | DBPROP_MULTIPLERESULTS
Multiple Storage Objects | DBPROP_MULTIPLESTORAGEOBJECTS
Multi-Table Update | DBPROP_MULTITABLEUPDATE
NULL Collation Order | DBPROP_NULLCOLLATION
NULL Concatenation Behavior | DBPROP_CONCATNULLBEHAVIOR
OLE DB Services | DBPROP_INIT_OLEDBSERVICES
OLE DB Version | DBPROP_PROVIDEROLEDBVER
OLE Object Support | DBPROP_OLEOBJECTS
Open Rowset Support | DBPROP_OPENROWSETSUPPORT
ORDER BY Columns in Select List | DBPROP_ORDERBYCOLUMNSINSELECT
Output Parameter Availability | DBPROP_OUTPUTPARAMETERAVAILABILITY
Password | DBPROP_AUTH_PASSWORD
Pass By Ref Accessors | DBPROP_BYREFACCESSORS
Persist Security Info | DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO
Persistent ID Type | DBPROP_PERSISTENTIDTYPE
Prepare Abort Behavior | DBPROP_PREPAREABORTBEHAVIOR
Prepare Commit Behavior | DBPROP_PREPARECOMMITBEHAVIOR
Procedure Term | DBPROP_PROCEDURETERM
Prompt | DBPROP_INIT_PROMPT
Provider Friendly Name | DBPROP_PROVIDERFRIENDLYNAME
Provider Name | DBPROP_PROVIDERFILENAME
Provider Version | DBPROP_PROVIDERVER
Read-Only Data Source | DBPROP_DATASOURCEREADONLY
Rowset Conversions on Command | DBPROP_ROWSETCONVERSIONSONCOMMAND
Schema Term | DBPROP_SCHEMATERM
Schema Usage | DBPROP_SCHEMAUSAGE
SQL Support | DBPROP_SQLSUPPORT
Structured Storage | DBPROP_STRUCTUREDSTORAGE
Subquery Support | DBPROP_SUBQUERIES
Table Term | DBPROP_TABLETERM
Transaction DDL | DBPROP_SUPPORTEDTXNDDL
User ID | DBPROP_AUTH_USERID
User Name | DBPROP_USERNAME
Window Handle | DBPROP_INIT_HWND

Recordset ダイナミック プロパティ

次に示すプロパティが、Recordset オブジェクトの Properties コレクションに追加されます。

ADO プロパティ名 | OLE DB プロパティ名
Access Order | DBPROP_ACCESSORDER
Blocking Storage Objects | DBPROP_BLOCKINGSTORAGEOBJECTS
Bookmark Type | DBPROP_BOOKMARKTYPE
Bookmarkable | DBPROP_IROWSETLOCATE
Change Inserted Rows | DBPROP_CHANGEINSERTEDROWS
Column Privileges | DBPROP_COLUMNRESTRICT
Column Set Notification | DBPROP_NOTIFYCOLUMNSET
Delay Storage Object Updates | DBPROP_DELAYSTORAGEOBJECTS
Fetch Backwards | DBPROP_CANFETCHBACKWARDS
Hold Rows | DBPROP_CANHOLDROWS
IAccessor | DBPROP_IAccessor
IColumnsInfo | DBPROP_IColumnsInfo
IColumnsRowset | DBPROP_IColumnsRowset
IConnectionPointContainer | DBPROP_IConnectionPointContainer
IConvertType | DBPROP_IConvertType
Immobile Rows | DBPROP_IMMOBILEROWS
IRowset | DBPROP_IRowset
IRowsetChange | DBPROP_IRowsetChange
IRowsetIdentity | DBPROP_IRowsetIdentity
IRowsetInfo | DBPROP_IRowsetInfo
IRowsetLocate | DBPROP_IRowsestLocate
IRowsetResynch |
IRowsetUpdate | DBPROP_IRowsetUpdate
ISequentialStream | DBPROP_ISequentialStream
ISupportErrorInfo | DBPROP_ISupportErrorInfo
Literal Bookmarks | DBPROP_LITERALBOOKMARKS
Literal Row Identity | DBPROP_LITERALIDENTITY
Maximum Open Rows | DBPROP_MAXOPENROWS
Maximum Pending Rows | DBPROP_MAXPENDINGROWS
Maximum Rows | DBPROP_MAXROWS
Notification Granularity | DBPROP_NOTIFICATIONGRANULARITY
Notification Phases | DBPROP_NOTIFICATIONPHASES
Objects Transacted | DBPROP_TRANSACTEDOBJECT
Own Changes Visible | DBPROP_OWNUPDATEDELETE
Own Inserts Visible | DBPROP_OWNINSERT
Preserve on Abort | DBPROP_ABORTPRESERVE
Preserve on Commit | DBPROP_COMMITPRESERVE
Quick Restart | DBPROP_QUICKRESTART
Reentrant Events | DBPROP_REENTRANTEVENTS
Remove Deleted Rows | DBPROP_REMOVEDELETED
Report Multiple Changes | DBPROP_REPORTMULTIPLECHANGES
Return Pending Inserts | DBPROP_RETURNPENDINGINSERTS
Row Delete Notification | DBPROP_NOTIFYROWDELETE
Row First Change Notification | DBPROP_NOTIFYROWFIRSTCHANGE
Row Insert Notification | DBPROP_NOTIFYROWINSERT
Row Privileges | DBPROP_ROWRESTRICT
Row Resynchronization Notification | DBPROP_NOTIFYROWRESYNCH
Row Threading Model | DBPROP_ROWTHREADMODEL
Row Undo Change Notification | DBPROP_NOTIFYROWUNDOCHANGE
Row Undo Delete Notification | DBPROP_NOTIFYROWUNDODELETE
Row Undo Insert Notification | DBPROP_NOTIFYROWUNDOINSERT
Row Update Notification | DBPROP_NOTIFYROWUPDATE
Rowset Fetch Position Change Notification | DBPROP_NOTIFYROWSETFETCHPOSISIONCHANGE
Rowset Release Notification | DBPROP_NOTIFYROWSETRELEASE
Scroll Backwards | DBPROP_CANSCROLLBACKWARDS
Skip Deleted Bookmarks | DBPROP_BOOKMARKSKIPPED
Strong Row Identity | DBPROP_STRONGITDENTITY
Unique Rows | DBPROP_UNIQUEROWS
Updatability | DBPROP_UPDATABILITY
Use Bookmarks | DBPROP_BOOKMARKS

Command ダイナミック プロパティ

次に示すプロパティが、Command オブジェクトの Properties コレクションに追加されます。

ADO プロパティ名 | OLE DB プロパティ名
Access Order | DBPROP_ACCESSORDER
Blocking Storage Objects | DBPROP_BLOCKINGSTORAGEOBJECTS
Bookmark Type | DBPROP_BOOKMARKTYPE
Bookmarkable | DBPROP_IROWSETLOCATE
Change Inserted Rows | DBPROP_CHANGEINSERTEDROWS
Column Privileges | DBPROP_COLUMNRESTRICT
Column Set Notification | DBPROP_NOTIFYCOLUMNSET
Delay Storage Object Updates | DBPROP_DELAYSTORAGEOBJECTS
Fetch Backwards | DBPROP_CANFETCHBACKWARDS
Hold Rows | DBPROP_CANHOLDROWS
IAccessor | DBPROP_IAccessor
IColumnsInfo | DBPROP_IColumnsInfo
IColumnsRowset | DBPROP_IColumnsRowset
IConnectionPointContainer | DBPROP_IConnectionPointContainer
IConvertType | DBPROP_IConvertType
Immobile Rows | DBPROP_IMMOBILEROWS
IRowset | DBPROP_IRowset
IRowsetChange | DBPROP_IRowsetChange
IRowsetIdentity | DBPROP_IRowsetIdentity
IRowsetInfo | DBPROP_IRowsetInfo
IRowsetLocate | DBPROP_IRowsetLocate
IRowsetResynch |
IRowsetUpdate | DBPROP_IRowsetUpdate
ISequentialStream | DBPROP_ISequentialStream
ISupportErrorInfo | DBPROP_ISupportErrorInfo
Literal Bookmarks | DBPROP_LITERALBOOKMARKS
Literal Row Identity | DBPROP_LITERALIDENTITY
Maximum Open Rows | DBPROP_MAXOPENROWS
Maximum Pending Rows | DBPROP_MAXPENDINGROWS
Maximum Rows | DBPROP_MAXROWS
Notification Granularity | DBPROP_NOTIFICATIONGRANULARITY
Notification Phases | DBPROP_NOTIFICATIONPHASES
Objects Transacted | DBPROP_TRANSACTEDOBJECT
Own Changes Visible | DBPROP_OWNUPDATEDELETE
Own Inserts Visible | DBPROP_OWNINSERT
Preserve on Abort | DBPROP_ABORTPRESERVE
Preserve on Commit | DBPROP_COMMITPRESERVE
Quick Restart | DBPROP_QUICKRESTART
Reentrant Events | DBPROP_REENTRANTEVENTS
Remove Deleted Rows | DBPROP_REMOVEDELETED
Report Multiple Changes | DBPROP_REPORTMULTIPLECHANGES
Return Pending Inserts | DBPROP_RETURNPENDINGINSERTS
Row Delete Notification | DBPROP_NOTIFYROWDELETE
Row First Change Notification | DBPROP_NOTIFYROWFIRSTCHANGE
Row Insert Notification | DBPROP_NOTIFYROWINSERT
Row Privileges | DBPROP_ROWRESTRICT
Row Resynchronization Notification | DBPROP_NOTIFYROWRESYNCH
Row Threading Model | DBPROP_ROWTHREADMODEL
Row Undo Change Notification | DBPROP_NOTIFYROWUNDOCHANGE
Row Undo Delete Notification | DBPROP_NOTIFYROWUNDODELETE
Row Undo Insert Notification | DBPROP_NOTIFYROWUNDOINSERT
Row Update Notification | DBPROP_NOTIFYROWUPDATE
Rowset Fetch Position Change Notification | DBPROP_NOTIFYROWSETFETCHPOSITIONCHANGE
Rowset Release Notification | DBPROP_NOTIFYROWSETRELEASE
Scroll Backwards | DBPROP_CANSCROLLBACKWARDS
Skip Deleted Bookmarks | DBPROP_BOOKMARKSKIP
Strong Row Identity | DBPROP_STRONGIDENTITY
Updatability | DBPROP_UPDATABILITY
Use Bookmarks | DBPROP_BOOKMARKS

関連項目 Microsoft OLE DB Provider for ODBC の実際の使用方法および機能に関する情報については、Microsoft OLE DB Provider for ODBC のマニュアルおよび MDAC SDK の「Microsoft OLE DB Programmer's Reference」を参照するか、Microsoft Universal Data Access の Web サイトを参照してください。


Microsoft OLE DB Provider for Microsoft Indexing Service

Microsoft OLE DB Provider for Microsoft Indexing Service を利用すると、Microsoft Indexing Service でインデックスが作成されたファイル システムおよび Web データに対して、プログラムによる読み取り専用アクセスが可能になります。ADO アプリケーションでは、SQL クエリを発行してコンテンツおよびファイルのプロパティ情報を取得できます。

このプロバイダは、フリースレッドであり、Unicode を使用できます。

接続文字列パラメータ

このプロバイダに接続するには、ConnectionString プロパティの Provider= 引数を次のように設定します。

MSIDXS

Provider プロパティを取得した場合も、この文字列が返されます。

接続文字列の例

このプロバイダの代表的な接続文字列を次に示します。

"Provider=MSIDXS;Data Source=myCatalog;Locale Identifier=nnnn;"

この接続文字列は、次に示すキーワードで構成されています。

キーワード | 説明
Provider | Microsoft OLE DB Provider for Microsoft Indexing Service を指定します。通常、この接続文字列ではこのキーワードのみを指定します。
Data Source | Indexing Service のカタログ名を指定します。このキーワードを指定しない場合は、既定のシステム カタログが使用されます。
Locale Identifier | ユーザーの言語に関する設定を定義する一意の 32 ビット番号 (たとえば、1033 など) を指定します。これらの設定は、日付と時刻の表示形式、アルファベット順のソート方法、文字列の比較方法などを示します。このキーワードを指定しない場合は、既定のロケール識別子が使用されます。

コマンド テキスト

Indexing Service の SQL クエリ構文は、SQL-92 SELECT ステートメントおよびその FROM 句と WHERE 句の拡張機能で構成されます。クエリの結果は、OLE DB の行セットを通して返されます。この結果を ADO で利用し、Recordset オブジェクトとして操作することができます。

正確に一致する単語や語句を検索したり、ワイルドカードを使ってパターン検索または語幹検索を行うことができます。検索ロジックは、真偽判定、語の重要度、またはほかの語との類似性を基準にすることができます。また、"フリー テキスト" による検索も可能で、正確に一致する語ではなく、意味の一致するものを探すことができます。

コマンドの文法については、「Microsoft Indexing Service Reference」で詳しく説明しています。

このプロバイダは、ストアド プロシージャの呼び出しまたは単一のテーブル名 (たとえば、CommandType プロパティが常に adCmdText の場合など) を受け入れません。

Recordset の動作

次の表は、このプロバイダによって開かれた Recordset オブジェクトで利用できるプロパティの一覧です。利用できるカーソル タイプは、静的カーソル (adOpenStatic) のみです。

プロバイダの設定による Recordset の動作の詳細については、Supports メソッドを実行し、Recordset の Properties コレクションを列挙して、プロバイダ固有のダイナミック プロパティがあるかどうかを確認します。

標準 ADO Recordset プロパティの有用性:

プロパティ | 有用性
AbsolutePage | 読み取り/書き込み
AbsolutePosition | 読み取り/書き込み
ActiveConnection | 読み取り専用
BOF | 読み取り専用
Bookmark* | 読み取り/書き込み
CacheSize | 読み取り/書き込み
CursorLocation | 常に adUseServer
CursorType | 常に adOpenStatic
EditMode | 常に adEditNone
EOF | 読み取り専用
Filter | 読み取り/書き込み
LockType | 読み取り/書き込み
MarshalOptions | 利用不可
MaxRecords | 読み取り/書き込み
PageCount | 読み取り専用
PageSize | 読み取り/書き込み
RecordCount | 読み取り専用
Source | 読み取り/書き込み
State | 読み取り専用
Status | 読み取り専用

*このプロパティが Recordset に存在するためには、このプロバイダでブックマークを利用可能にする必要があります。

標準 ADO Recordset メソッドの有用性:

メソッド | 有用性
AddNew | 不可
Cancel | 可能
CancelBatch | 不可
CancelUpdate | 不可
Clone | 可能
Close | 可能
Delete | 不可
GetRows | 可能
Move | 可能
MoveFirst | 可能
NextRecordset | 可能
Open | 可能
Requery | 可能
Resync | 可能
Supports | 可能
Update | 不可
UpdateBatch | 不可

関連項目 Microsoft OLE DB Provider for Microsoft Indexing Service の実際の使用方法および機能に関する情報については、「Microsoft OLE DB Programmer's Reference」および Microsoft Indexing Service のマニュアルを参照するか、Microsoft Internet Information Services の Web サイトを参照してください。


Microsoft OLE DB Provider for Microsoft Active Directory Service

Microsoft Active Directory Service Interfaces (ADSI) Provider を利用すると、ADO から、ADSI を通して異種ディレクトリ サービスに接続できます。このため、ADO アプリケーションで、Microsoft® Windows NT® 4.0 および Microsoft Windows 2000 のディレクトリ サービス、LDAP 規格のすべてのディレクトリ サービス、および Novell Directory Services に対する読み取り専用のアクセスが可能になります。ADSI 自体がプロバイダ モデルをベースにしているので、新規プロバイダで別のディレクトリへのアクセスを提供する場合も、ADO アプリケーションからそのディレクトリにシームレスにアクセスできます。ADSI プロバイダは、フリースレッドであり、Unicode を使用できます。

接続文字列パラメータ

このプロバイダに接続するには、ConnectionString プロパティの Provider 引数を次のように設定します。

ADSDSOObject

Provider プロパティを取得した場合も、この文字列が返されます。

接続文字列の例

このプロバイダの代表的な接続文字列を次に示します。

"Provider=ADSDSOObject;User ID=userName;Password=userPassword;"

この接続文字列は、次に示すキーワードで構成されています。

キーワード | 説明
Provider | OLE DB Provider for Microsoft Active Directory Service を指定します。
User ID | ユーザー名を指定します。このキーワードを省略すると、現在のログオンが使用されます。
Password | ユーザー パスワードを指定します。このキーワードを省略すると、現在のログオンが使用されます。

コマンド テキスト

このプロバイダが認識するコマンド テキストの文字列は 4 つの値からなり、その構文は次のとおりです。

"Root; Filter; Attributes[; Scope]"

値 | 説明
Root | 検索を開始する ADsPath オブジェクト、つまり、検索のルートを示します。
Filter | RFC 960 形式の検索フィルタを示します。
Attributes | 返される属性をカンマ区切りの一覧で示します。
Scope 省略可能です。検索の範囲を指定する文字列です。次の中から 1 つを選択できます。
  • Base - ベース オブジェクト (検索のルート) のみを検索します。

  • OneLevel - 1 レベルのみを検索します。

  • Subtree - サブツリー全体を検索します。

次に、例を示します。

"<LDAP://DC=ArcadiaBay,DC=COM>;(objectClass=*);sn, givenName; subtree"

このプロバイダは、コマンド テキストの SQL SELECT もサポートしています。その例を次に示します。

"SELECT title, telephoneNumber From 'LDAP://DC=Microsoft, DC=COM' WHERE objectClass='user' AND objectCategory='Person'"

このプロバイダは、ストアド プロシージャの呼び出しまたは単一のテーブル名 (たとえば、CommandType プロパティが常に adCmdText の場合など) を受け入れません。コマンド テキストの要素の詳細については、Active Directory Service Interfaces のマニュアルを参照してください。

Recordset の動作

次の表は、このプロバイダで開かれた Recordset オブジェクトで利用可能なプロパティの一覧です。利用できるカーソル タイプは、静的カーソル (adOpenStatic) のみです。

プロバイダの設定による Recordset の動作の詳細については、Supports メソッドを実行し、Recordset の Properties コレクションを列挙して、プロバイダ固有のダイナミック プロパティがあるかどうかを確認します。

標準 ADO Recordset プロパティの有用性:

プロパティ | 有用性
AbsolutePage | 読み取り/書き込み
AbsolutePosition | 読み取り/書き込み
ActiveConnection | 読み取り専用
BOF | 読み取り専用
Bookmark | 読み取り/書き込み
CacheSize | 読み取り/書き込み
CursorLocation | 常に adUseServer
CursorType | 常に adOpenStatic
EditMode | 常に adEditNone
EOF | 読み取り専用
Filter | 読み取り/書き込み
LockType | 読み取り/書き込み
MarshalOptions | 利用不可
MaxRecords | 読み取り/書き込み
PageCount | 読み取り専用
PageSize | 読み取り/書き込み
RecordCount | 読み取り専用
Source | 読み取り/書き込み
State | 読み取り専用
Status | 読み取り専用

標準 ADO Recordset メソッドの有用性:

メソッド | 有用性
AddNew | 不可
Cancel | 不可
CancelBatch | 不可
CancelUpdate | 不可
Clone | 可能
Close | 可能
Delete | 不可
GetRows | 可能
Move | 可能
MoveFirst | 可能
MoveLast | 可能
MoveNext | 可能
MovePrevious | 可能
NextRecordset | 可能
Open | 可能
Requery | 可能
Resync | 可能
Supports | 可能
Update | 不可
UpdateBatch | 不可

関連項目 ADSI に関する一般情報および ADSI プロバイダの詳細については、Active Directory Service Interfaces のマニュアル、または ADSI の Web サイトを参照してください。


OLE DB Provider for Microsoft Jet

OLE DB Provider for Microsoft Jet を利用すると、ADO から Microsoft Jet データベースにアクセスできます。

接続文字列パラメータ

このプロバイダに接続するには、ConnectionString プロパティの Provider 引数を次のように設定します。

Microsoft.Jet.OLEDB.4.0

Provider プロパティを取得した場合も、この文字列が返されます。

接続文字列の例

このプロバイダの代表的な接続文字列を次に示します。

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassword;"

この接続文字列は、次に示すキーワードで構成されています。

キーワード | 説明
Provider | OLE DB Provider for Microsoft Jet を指定します。
Data Source | データベースのパスとファイル名 (たとえば、c:\Northwind.mdb など) を指定します。
User ID | ユーザー名を指定します。このキーワードを指定しない場合、既定では、"admin" が使用されます。
Password | ユーザー パスワードを指定します。このキーワードを指定しない場合、既定では、空文字列 ("") が使用されます。

プロバイダ固有の接続パラメータ

OLE DB Provider for Microsoft Jet は、ADO で定義されたプロパティのほかに、プロバイダ固有の各種のダイナミック プロパティをサポートしています。プロバイダ固有のパラメータは、ほかのすべての接続パラメータと同様に、Connection オブジェクトの Properties コレクションで設定するか、接続文字列の一部として設定することができます。

次の表は、このプロバイダ固有のパラメータの一覧です。かっこ内に、対応する OLE DB プロパティ名を示しています。

パラメータ | 説明
Jet OLEDB:Compact Reclaimed Space Amount (DBPROP_JETOLEDB_COMPACTFREESPACESIZE) | データベースの最適化によって取り戻すことができる空きスペースの推定量をバイト単位で示します。この値は、データベースの接続が確立した後でのみ有効です。
Jet OLEDB:Connection Control (DBPROP_JETOLEDB_CONNECTIONCONTROL) | ユーザーがデータベースに接続できるかどうかを示します。
Jet OLEDB:Create System Database (DBPROP_JETOLEDB_CREATESYSTEMDATABASE) | 新規データ ソースの作成時にシステム データベースを作成するかどうかを示します。
Jet OLEDB:Database Locking Mode (DBPROP_JETOLEDB_DATABASELOCKMODE) | このデータベースのロック モードを示します。データベースを最初に開くユーザーが、そのデータベースが開かれているときに使用されるモードを決定します。
Jet OLEDB:Database Password (DBPROP_JETOLEDB_DATABASEPASSWORD) | データベースのパスワードを示します。
Jet OLEDB:Don't Copy Locale on Compact (DBPROP_JETOLEDB_COMPACT_DONTCOPYLOCALE) | データベースの最適化時にロケール情報をコピーするかどうかを示します。
Jet OLEDB:Encrypt Database (DBPROP_JETOLEDB_ENCRYPTDATABASE) | 最適化したデータベースを暗号化するかどうかを指定します。このプロパティを設定しない場合、元のデータベースが暗号化されていれば、最適化後のデータベースも暗号化されます。
Jet OLEDB:Engine Type (DBPROP_JETOLEDB_ENGINE) | 現在のデータ ストアで使用される記憶エンジンを示します。
Jet OLEDB:Exclusive Async Delay (DBPROP_JETOLEDB_EXCLUSIVEASYNCDELAY) | データベースが排他的に開かれている場合に、ディスクへの非同期の書き込みで許容される最長遅延時間をミリ秒単位で示します。 Jet OLEDB:Flush Transaction Timeout が 0 に設定されていなければ、このプロパティは無視されます。
Jet OLEDB:Flush Transaction Timeout (DBPROP_JETOLEDB_FLUSHTRANSACTIONTIMEOUT) | 非同期の書き込み用にキャッシュに保存されたデータが実際にディスクに書き込まれるまでの待ち時間を示します。この設定は、Jet OLEDB:Shared Async Delay および Jet OLEDB:Exclusive Async Delay の値よりも優先されます。
Jet OLEDB:Global Bulk Transactions (DBPROP_JETOLEDB_GLOBALBULKNOTRANSACTIONS) | SQL 一括トランザクションが処理されるかどうかを示します。
Jet OLEDB:Global Partial Bulk Ops (DBPROP_JETOLEDB_GLOBALBULKPARTIAL) | データベースを開くときに使用されるパスワードを示します。
Jet OLEDB:Implicit Commit Sync (DBPROP_JETOLEDB_IMPLICITCOMMITSYNC) | 暗黙の内部トランザクションに加えられた変更が同期モードで書き込まれるか非同期モードで書き込まれるかを示します。
Jet OLEDB:Lock Delay (DBPROP_JETOLEDB_LOCKDELAY) | ロックの取得に失敗した場合の、再試行までの待ち時間をミリ秒単位で示します。
Jet OLEDB:Lock Retry (DBPROP_JETOLEDB_LOCKRETRY) | ロックされたページへのアクセスの試行を何回まで繰り返すかを示します。
Jet OLEDB:Max Buffer Size (DBPROP_JETOLEDB_MAXBUFFERSIZE) | ディスクへの反映を開始するまでに、変更を保存しておくことができる最大メモリ量をキロバイト単位で示します。
Jet OLEDB:Max Locks Per File (DBPROP_JETOLEDB_MAXLOCKSPERFILE) | データベースに設定できる最大ロック数を示します。既定値は 9500 です。
Jet OLEDB:New Database Password (DBPROP_JETOLEDB_NEWDATABASEPASSWORD) | このデータベースに設定する新しいパスワードを示します。元のパスワードは Jet OLEDB:Database Password に保存されます。
Jet OLEDB:ODBC Command Time Out (DBPROP_JETOLEDB_ODBCCOMMANDTIMEOUT) | Jeｔ からのリモート ODBC クエリがタイムアウトになるまでの時間をミリ秒単位で示します。
Jet OLEDB:Page Locks to Table Lock (DBPROP_JETOLEDB_PAGELOCKSTOTABLELOCK) | ロックがテーブル ロックへの昇格を試行するまでに、トランザクション内でロックされる必要があるページ数を示します。この値が 0 の場合、そのロックは昇格されません。
Jet OLEDB:Page Timeout (DBPROP_JETOLEDB_PAGETIMEOUT) | キャッシュの内容が古くなっていないかどうかを確認するためにデータベース ファイルと照合するまでの待ち時間をミリ秒単位で示します。
Jet OLEDB:Recycle Long-Valued Pages (DBPROP_JETOLEDB_RECYCLELONGVALUEPAGES) | BLOB ページが解放されるときに、それらのページの再取得を強制的に試行するかどうかを示します。
Jet OLEDB:Registry Path (DBPROP_JETOLEDB_REGPATH) | Jet データベース エンジン用の値を格納する Windows レジストリ キーを示します。
Jet OLEDB:Reset ISAM Stats (DBPROP_JETOLEDB_RESETISAMSTATS) | パフォーマンス情報を返した後で、スキーマ Recordset DBSCHEMA_JETOLEDB_ISAMSTATS のパフォーマンス カウンタをリセットするかどうかを示します。
Jet OLEDB:Shared Async Delay (DBPROP_JETOLEDB_SHAREDASYNCDELAY) | データベースがマルチユーザー モードで開かれている場合に、ディスクへの非同期の書き込みで許容される最長遅延時間をミリ秒単位で示します。
Jet OLEDB:System Database (DBPROP_JETOLEDB_SYSDBPATH) | ワークグループ情報ファイル (システム データベース) 用のパスおよびファイル名を示します。
Jet OLEDB:Transaction Commit Mode (DBPROP_JETOLEDB_TXNCOMMITMODE) | トランザクションのコミット時に、ディスクへのデータの書き込みを同期で実行するか非同期で実行するかを示します。
Jet OLEDB:User Commit Sync (DBPROP_JETOLEDB_USERCOMMITSYNC) | トランザクションに加えられた変更を同期モードで書き込むか非同期モードで書き込むかを示します。

プロバイダ固有のレコードセットとコマンドのプロパティ

Jet プロバイダも、Recordset および Command に関するプロバイダ固有の各種プロパティをサポートしています。これらのプロパティの取得および設定は、Recordset オブジェクトまたは Command オブジェクトの Properties コレクションを通して行います。次の表は、このプロバイダに固有の ADO プロパティ名の一覧です。かっこ内に、対応する OLE DB プロパティ名を示しています。

プロパティ名 | 説明
Jet OLEDB:Bulk Transactions (DBPROP_JETOLEDB_BULKNOTRANSACTIONS) | SQL の一括操作が処理されるかどうかを示します。大量の一括操作は、リソースの遅延のために、処理に失敗する場合があります。
Jet OLEDB:Enable Fat Cursors (DBPROP_JETOLEDB_ENABLEFATCURSOR) | リモートの行ソースのレコードセットの作成時に、複数の行をキャッシュするかどうかを示します。
Jet OLEDB:Fat Cursor Cache Size (DBPROP_JETOLEDB_FATCURSORMAXROWS) | リモート データ ストアの行キャッシュを使用するときにキャッシュする行数を示します。Jet OLEDB:Enable Fat Cursors が True でなければ、この値は無視されます。
Jet OLEDB:Inconsistent (DBPROP_JETOLEDB_INCONSISTENT) | クエリの結果で、矛盾した更新を許容するかどうかを示します。
Jet OLEDB:Locking Granularity (DBPROP_JETOLEDB_LOCKGRANULARITY) | テーブルが、行レベルのロックを使って開かれているかどうかを示します。
Jet OLEDB:ODBC Pass-Through Statement (DBPROP_JETOLEDB_ODBCPASSTHROUGH) | Command オブジェクトの SQL テキストをそのままバックエンドに渡すかどうかを示します。
Jet OLEDB:Partial Bulk Ops (DBPROP_JETOLEDB_BULKPARTIAL) | SQL DML の操作が失敗したときの Jet の動作を示します。
Jet OLEDB:Pass Through Query Bulk-Op (DBPROP_JETOLEDB_PASSTHROUGHBULKOP) | Recordset を返さないクエリをそのままデータ ソースに渡すかどうかを示します。
Jet OLEDB:Pass Through Query Connect String (DBPROP_JETOLEDB_ODBCPASSTHROUGHCONNECTSTRING) | リモート データ ストアへの接続に使用される Jet 接続文字列を示します。Jet OLEDB:ODBC Pass-Through Statement が True でなければ、この値は無視されます。
Jet OLEDB:Stored Query (DBPROP_JETOLEDB_STOREDQUERY) | コマンド テキストを、SQL コマンドではなく、ストアド クエリと解釈するかどうかを示します。
Jet OLEDB:Validate Rules On Set (DBPROP_JETOLEDB_VALIDATEONSET) | 列のデータを設定するとき、または変更をデータベースに反映するときに、Jet の入力規則を評価するかどうかを示します。

既定では、OLE DB Provider for Microsoft Jet は、Microsoft Jet データベースを読み取り/書き込みモードで開きます。読み取り専用モードでデータベースを開くには、ADO Connection オブジェクトの Mode プロパティを adModeRead に設定します。

Command オブジェクトの使用方法

Command オブジェクトのコマンド テキストでは、Jet SQL 文法を使用します。コマンド テキストには、行を返すクエリ、アクション クエリ、およびテーブル名を指定できますが、ストアド プロシージャは、サポートされていないので指定できません。

Recordset の動作

Microsoft Jet データベース エンジンは、動的カーソルをサポートしていません。したがって、OLE DB Provider for Microsoft Jet は、adLockDynamic のカーソル タイプをサポートしていません。動的カーソルが要求された場合、プロバイダはキーセット カーソルを返し、CursorType プロパティを、返された Recordset のタイプを示す値に設定し直します。また、更新可能な Recordset が要求された場合 (LockType が adLockOptimistic、adLockBatchOptimistic、または adLockPessimistic の場合) も、プロバイダはキーセット カーソルを返し、CursorType プロパティを設定し直します。

ダイナミック プロパティ

OLE DB Provider for Microsoft Jet は、開かれていない Connection オブジェクト、Recordset オブジェクト、および Command オブジェクトの Properties コレクションに各種のダイナミック プロパティを追加します。

次の表は、各ダイナミック プロパティの ADO プロパティ名と OLE DB プロパティ名の一覧です。「OLE DB Programmer's Reference」では、「Description」で ADO プロパティ名について触れています。これらのプロパティの詳細については、「OLE DB Programmer's Reference」の「Index」で OLE DB プロパティ名を検索するか、「Appendix C: OLE DB Properties」を参照してください。

Connection ダイナミック プロパティ

次に示すプロパティが、Connection オブジェクトの Properties コレクションに追加されます。

ADO プロパティ名 | OLE DB プロパティ名
Active Sessions | DBPROP_ACTIVESESSIONS
Asynchable Abort | DBPROP_ASYNCTXNABORT
Asynchable Commit | DBPROP_ASYNCTNXCOMMIT
Autocommit Isolation Levels | DBPROP_SESS_AUTOCOMMITISOLEVELS
Catalog Location | DBPROP_CATALOGLOCATION
Catalog Term | DBPROP_CATALOGTERM
Column Definition | DBPROP_COLUMNDEFINITION
Current Catalog | DBPROP_CURRENTCATALOG
Data Source | DBPROP_INIT_DATASOURCE
Data Source Name | DBPROP_DATASOURCENAME
Data Source Object Threading Model | DBPROP_DSOTHREADMODEL
DBMS Name | DBPROP_DBMSNAME
DBMS Version | DBPROP_DBMSVER
GROUP BY Support | DBPROP_GROUPBY
Heterogeneous Table Support | DBPROP_HETEROGENEOUSTABLES
Identifier Case Sensitivity | DBPROP_IDENTIFIERCASE
Isolation Levels | DBPROP_SUPPORTEDTXNISOLEVELS
Isolation Retention | DBPROP_SUPPORTEDTXNISORETAIN
Locale Identifier | DBPROP_INIT_LCID
Maximum Index Size | DBPROP_MAXINDEXSIZE
Maximum Row Size | DBPROP_MAXROWSIZE
Maximum Row Size Includes BLOB | DBPROP_MAXROWSIZEINCLUDESBLOB
Maximum Tables in SELECT | DBPROP_MAXTABLESINSELECT
Mode | DBPROP_INIT_MODE
Multiple Parameter Sets | DBPROP_MULTIPLEPARAMSETS
Multiple Results | DBPROP_MULTIPLERESULTS
Multiple Storage Objects | DBPROP_MULTIPLESTORAGEOBJECTS
Multi-Table Update | DBPROP_MULTITABLEUPDATE
NULL Collation Order | DBPROP_NULLCOLLATION
NULL Concatenation Behavior | DBPROP_CONCATNULLBEHAVIOR
OLE DB Version | DBPROP_PROVIDEROLEDBVER
OLE Object Support | DBPROP_OLEOBJECTS
Open Rowset Support | DBPROP_OPENROWSETSUPPORT
ORDER BY Columns in Select List | DBPROP_ORDERBYCOLUMNSINSELECT
Output Parameter Availability | DBPROP_OUTPUTPARAMETERAVAILABILITY
Pass By Ref Accessors | DBPROP_BYREFACCESSORS
Password | DBPROP_AUTH_PASSWORD
Persistent ID Type | DBPROP_PERSISTENTIDTYPE
Prepare Abort Behavior | DBPROP_PREPAREABORTBEHAVIOR
Prepare Commit Behavior | DBPROP_PREPARECOMMITBEHAVIOR
Procedure Term | DBPROP_PROCEDURETERM
Prompt | DBPROP_INIT_PROMPT
Provider Friendly Name | DBPROP_PROVIDERFRIENDLYNAME
Provider Name | DBPROP_PROVIDERFILENAME
Provider Version | DBPROP_PROVIDERVER
Read-Only Data Source | DBPROP_DATASOURCEREADONLY
Rowset Conversions on Command | DBPROP_ROWSETCONVERSIONSONCOMMAND
Schema Term | DBPROP_SCHEMATERM
Schema Usage | DBPROP_SCHEMAUSAGE
SQL Support | DBPROP_SQLSUPPORT
Structured Storage | DBPROP_STRUCTUREDSTORAGE
Subquery Support | DBPROP_SUBQUERIES
Table Term | DBPROP_TABLETERM
Transaction DDL | DBPROP_SUPPORTEDTXNDDL
User ID | DBPROP_AUTH_USERID
User Name | DBPROP_USERNAME
Window Handle | DBPROP_INIT_HWND

Recordset ダイナミック プロパティ

次に示すプロパティが、Recordset オブジェクトの Properties コレクションに追加されます。

ADO プロパティ名 | OLE DB プロパティ名
Access Order | DBPROP_ACCESSORDER
Append-Only Rowset | DBPROP_APPENDONLY
Blocking Storage Objects | DBPROP_BLOCKINGSTORAGEOBJECTS
Bookmark Type | DBPROP_BOOKMARKTYPE
Bookmarkable | DBPROP_IROWSETLOCATE
Bookmarks Ordered | DBPROP_ORDEREDBOOKMARKS
Cache Deferred Columns | DBPROP_CACHEDEFERRED
Change Inserted Rows | DBPROP_CHANGEINSERTEDROWS
Column Privileges | DBPROP_COLUMNRESTRICT
Column Set Notification | DBPROP_NOTIFYCOLUMNSET
Column Writable | DBPROP_MAYWRITECOLUMN
Defer Column | DBPROP_DEFERRED
Delay Storage Object Updates | DBPROP_DELAYSTORAGEOBJECTS
Fetch Backwards | DBPROP_CANFETCHBACKWARDS
Hold Rows | DBPROP_CANHOLDROWS
IAccessor | DBPROP_IAccessor
IColumnsInfo | DBPROP_IColumnsInfo
IColumnsRowset | DBPROP_IColumnsRowset
IConnectionPointContainer | DBPROP_IConnectionPointContainer
IConvertType | DBPROP_IConvertType
ILockBytes | DBPROP_ILockBytes
Immobile Rows | DBPROP_IMMOBILEROWS
IRowset | DBPROP_IRowset
IRowsetChange | DBPROP_IRowsetChange
IRowsetIdentity | DBPROP_IRowsetIdentity
IRowsetIndex | DBPROP_IRowsetIndex
IRowsetInfo | DBPROP_IRowsetInfo
IRowsetLocate | DBPROP_IRowsestLocate
IRowsetResynch |
IRowsetScroll | DBPROP_IRowsetScroll
IRowsetUpdate | DBPROP_IRowsetUpdate
ISequentialStream | DBPROP_ISequentialStream
IStorage | DBPROP_IStorage
IStream | DBPROP_IStream
ISupportErrorInfo | DBPROP_ISupportErrorInfo
Literal Bookmarks | DBPROP_LITERALBOOKMARKS
Literal Row Identity | DBPROP_LITERALIDENTITY
Maximum Open Rows | DBPROP_MAXOPENROWS
Maximum Pending Rows | DBPROP_MAXPENDINGROWS
Maximum Rows | DBPROP_MAXROWS
Memory Usage | DBPROP_MEMORYUSAGE
Notification Granularity | DBPROP_NOTIFICATIONGRANULARITY
Notification Phases | DBPROP_NOTIFICATIONPHASES
Objects Transacted | DBPROP_TRANSACTEDOBJECT
Others' Changes Visible | DBPROP_OTHERUPDATEDELETE
Others' Inserts Visible | DBPROP_OTHERINSERT
Own Changes Visible | DBPROP_OWNUPDATEDELETE
Own Inserts Visible | DBPROP_OWNINSERT
Preserve on Abort | DBPROP_ABORTPRESERVE
Preserve on Commit | DBPROP_COMMITPRESERVE
Quick Restart | DBPROP_QUICKRESTART
Reentrant Events | DBPROP_REENTRANTEVENTS
Remove Deleted Rows | DBPROP_REMOVEDELETED
Report Multiple Changes | DBPROP_REPORTMULTIPLECHANGES
Return Pending Inserts | DBPROP_RETURNPENDINGINSERTS
Row Delete Notification | DBPROP_NOTIFYROWDELETE
Row First Change Notification | DBPROP_NOTIFYROWFIRSTCHANGE
Row Insert Notification | DBPROP_NOTIFYROWINSERT
Row Privileges | DBPROP_ROWRESTRICT
Row Resynchronization Notification | DBPROP_NOTIFYROWRESYNCH
Row Threading Model | DBPROP_ROWTHREADMODEL
Row Undo Change Notification | DBPROP_NOTIFYROWUNDOCHANGE
Row Undo Delete Notification | DBPROP_NOTIFYROWUNDODELETE
Row Undo Insert Notification | DBPROP_NOTIFYROWUNDOINSERT
Row Update Notification | DBPROP_NOTIFYROWUPDATE
Rowset Fetch Position Change Notification | DBPROP_NOTIFYROWSETFETCHPOSISIONCHANGE
Rowset Release Notification | DBPROP_NOTIFYROWSETRELEASE
Scroll Backwards | DBPROP_CANSCROLLBACKWARDS
Skip Deleted Bookmarks | DBPROP_BOOKMARKSKIPPED
Strong Row Identity | DBPROP_STRONGITDENTITY
Updatability | DBPROP_UPDATABILITY
Use Bookmarks | DBPROP_BOOKMARKS

Command ダイナミック プロパティ

次に示すプロパティが、Command オブジェクトの Properties コレクションに追加されます。

ADO プロパティ名 | OLE DB プロパティ名
Access Order | DBPROP_ACCESSORDER
Append-Only Rowset | DBPROP_APPENDONLY
Blocking Storage Objects | DBPROP_BLOCKINGSTORAGEOBJECTS
Bookmark Type | DBPROP_BOOKMARKTYPE
Bookmarkable | DBPROP_IROWSETLOCATE
Change Inserted Rows | DBPROP_CHANGEINSERTEDROWS
Column Privileges | DBPROP_COLUMNRESTRICT
Column Set Notification | DBPROP_NOTIFYCOLUMNSET
Defer Column | DBPROP_DEFERRED
Delay Storage Object Updates | DBPROP_DELAYSTORAGEOBJECTS
Fetch Backwards | DBPROP_CANFETCHBACKWARDS
Hold Rows | DBPROP_CANHOLDROWS
IAccessor | DBPROP_IAccessor
IColumnsInfo | DBPROP_IColumnsInfo
IColumnsRowset | DBPROP_IColumnsRowset
IConnectionPointContainer | DBPROP_IConnectionPointContainer
IConvertType | DBPROP_IConvertType
ILockBytes | DBPROP_ILockBytes
Immobile Rows | DBPROP_IMMOBILEROWS
IRowset | DBPROP_IRowset
IRowsetChange | DBPROP_IRowsetChange
IRowsetIdentity | DBPROP_IRowsetIdentity
IRowsetIndex | DBPROP_IRowsetIndex
IRowsetInfo | DBPROP_IRowsetInfo
IRowsetLocate | DBPROP_IRowsetLocate
IRowsetResynch |
IRowsetScroll | DBPROP_IRowsetScroll
IRowsetUpdate | DBPROP_IRowsetUpdate
ISequentialStream | DBPROP_ISequentialStream
IStorage | DBPROP_IStorage
IStream | DBPROP_IStream
ISupportErrorInfo | DBPROP_ISupportErrorInfo
Literal Bookmarks | DBPROP_LITERALBOOKMARKS
Literal Row Identity | DBPROP_LITERALIDENTITY
Lock Mode | DBPROP_LOCKMODE
Maximum Open Rows | DBPROP_MAXOPENROWS
Maximum Pending Rows | DBPROP_MAXPENDINGROWS
Maximum Rows | DBPROP_MAXROWS
Notification Granularity | DBPROP_NOTIFICATIONGRANULARITY
Notification Phases | DBPROP_NOTIFICATIONPHASES
Objects Transacted | DBPROP_TRANSACTEDOBJECT
Others' Changes Visible | DBPROP_OTHERUPDATEDELETE
Others' Inserts Visible | DBPROP_OTHERINSERT
Own Changes Visible | DBPROP_OWNUPDATEDELETE
Own Inserts Visible | DBPROP_OWNINSERT
Preserve on Abort | DBPROP_ABORTPRESERVE
Preserve on Commit | DBPROP_COMMITPRESERVE
Quick Restart | DBPROP_QUICKRESTART
Reentrant Events | DBPROP_REENTRANTEVENTS
Remove Deleted Rows | DBPROP_REMOVEDELETED
Report Multiple Changes | DBPROP_REPORTMULTIPLECHANGES
Return Pending Inserts | DBPROP_RETURNPENDINGINSERTS
Row Delete Notification | DBPROP_NOTIFYROWDELETE
Row First Change Notification | DBPROP_NOTIFYROWFIRSTCHANGE
Row Insert Notification | DBPROP_NOTIFYROWINSERT
Row Privileges | DBPROP_ROWRESTRICT
Row Resynchronization Notification | DBPROP_NOTIFYROWRESYNCH
Row Threading Model | DBPROP_ROWTHREADMODEL
Row Undo Change Notification | DBPROP_NOTIFYROWUNDOCHANGE
Row Undo Delete Notification | DBPROP_NOTIFYROWUNDODELETE
Row Undo Insert Notification | DBPROP_NOTIFYROWUNDOINSERT
Row Update Notification | DBPROP_NOTIFYROWUPDATE
Rowset Fetch Position Change Notification | DBPROP_NOTIFYROWSETFETCHPOSITIONCHANGE
Rowset Release Notification | DBPROP_NOTIFYROWSETRELEASE
Scroll Backwards | DBPROP_CANSCROLLBACKWARDS
Server Data on Insert | DBPROP_SERVERDATAONINSERT
Skip Deleted Bookmarks | DBPROP_BOOKMARKSKIP
Strong Row Identity | DBPROP_STRONGIDENTITY
Updatability | DBPROP_UPDATABILITY
Use Bookmarks | DBPROP_BOOKMARKS

関連項目 OLE DB Provider for Microsoft Jet の実際の使用方法および機能に関する情報については、MDAC SDK の OLE DB Provider for Microsoft Jet のマニュアルを参照してください。


Microsoft OLE DB Provider for SQL Server

Microsoft OLE DB Provider for SQL Server (SQLOLEDB) を利用すると、ADO から Microsoft SQL Server にアクセスできます。

接続文字列パラメータ

このプロバイダに接続するには、ConnectionString プロパティの Provider 引数を次のように設定します。

SQLOLEDB

この値の設定または取得には、Provider プロパティを使用します。

接続文字列の例

このプロバイダの代表的な接続文字列を次に示します。

"Provider=SQLOLEDB;Data Source=serverName;Initial Catalog=databaseName; User ID=userName;Password=userPassword;"

この接続文字列は、次に示すキーワードで構成されています。

キーワード | 説明
Provider | OLE DB Provider for SQL Serverを指定します。
Data Source または Server | サーバー名を指定します。
Initial Catalog または Database | サーバー上のデータベース名を指定します。
User ID または uid | SQL Server 認証用のユーザー名を指定します。
Password または pwd | SQL Server 認証用のユーザー パスワードを指定します。

プロバイダ固有の接続パラメータ

このプロバイダは、ADO で定義されたパラメータのほかに、プロバイダ固有の各種の接続パラメータをサポートしています。プロバイダ固有のプロパティは、ADO で定義されている接続プロパティと同様に、Connection オブジェクトの Properties コレクションで設定するか、ConnectionString の一部として設定することができます。

パラメータ | 説明
Trusted_Connection | ユーザー認証モードを示します。Yes または No に設定できます。既定値は No です。このプロパティが Yes に設定されている場合、SQLOLEDB は、Microsoft Windows NT 認証モードを使用して、Location プロパティおよび Datasource プロパティの値で指定された SQL Server データベースへのユーザー アクセスを認可します。このプロパティが No に設定されている場合、SQLOLEDB は、混在モードを使用して SQL Server データベースへのユーザー アクセスを認可します。SQL Server のログイン名およびパスワードは、User Id プロパティおよび Password プロパティで指定します。
Current Language | SQL Server の言語名を示します。システム メッセージおよびフォーマットで使用する言語を識別します。指定する言語は、SQL Server にインストールされている必要があります。インストールされていない場合は、その接続を開くことはできません。
Network Address | Location プロパティで指定された SQL Server のネットワーク アドレスを示します。
Network Library | SQL Server との通信に使用するネットワーク ライブラリ (DLL) 名を示します。この名前には、パスまたは .dll 拡張子を含めないでください。既定値は、SQL Server クライアントの設定から取得されます。
Use Procedure for Prepare | Prepared プロパティによって Commands が用意されている場合に、SQL Server が一時的なストアド プロシージャを作成するかどうかを決定します。
Auto Translate | OEM/ANSI 文字変換を実行するかどうかを示します。このプロパティは、True または False に設定できます。既定値は True です。このプロパティを True に設定すると、複数バイト文字による文字列を SQL Server とやり取りするときに、OEM/ANSI 文字変換が実行されます。このプロパティを False に設定すると、複数バイト文字による文字列データの OEM/ANSI 文字変換は実行されません。
Packet Size | ネットワーク パケット サイズをバイト単位で示します。このプロパティ値は、512 ～ 32767 の値にする必要があります。SQLOLEDB のネットワーク パケット サイズの既定値は 4096 です。
Application Name | クライアント アプリケーション名を示します。
Workstation ID | ワークステーションを識別する文字列です。

Command オブジェクトの使用方法

SQLOLEDB は、ODBC、ANSI、および SQL Server 固有の Transact-SQL が混在する構文を、有効な構文として受け入れます。たとえば、次の SQL ステートメントでは、ODBC SQL エスケープ シーケンスを使って文字列関数の LCASE を指定しています。

SELECT customerid={fn LCASE(CustomerID)} FROM Customers

LCASE は、大文字をすべて小文字に変換した文字列を返します。ANSI SQL 文字列関数の LOWER は、LCASE と同じ処理を実行します。次の SQL ステートメントでは、前に示した ODBC によるステートメントと同じ操作を ANSI によって指定しています。

SELECT customerid=LOWER(CustomerID) FROM Customers

コマンドのテキストとして指定されている場合、SQLOLEDB は、どちらの形式のステートメントも正しく処理します。

ストアド プロシージャ

SQLOLEDB のコマンドを使って SQL Server ストアド プロシージャを実行するときは、コマンド テキストで、ODBC プロシージャ呼び出しエスケープ シーケンスを使用してください。SQLOLEDB は、SQL Server のリモート プロシージャ呼び出しのメカニズムを使用してコマンド処理を最適化します。たとえば、次の ODBC SQL ステートメントと、後の Transact-SQL 形式のステートメントでは、ODBC SQL 形式の方をお勧めします。

ODBC SQL

{call SalesByCategory('Produce', '1995')}

Transact-SQL

EXECUTE SalesByCategory 'Produce', '1995'

Recordset の動作

SQLOLEDB では、多くのコマンドによって生成される複数の結果をサポートする SQL Server カーソルを使用できません。SQL Server カーソルのサポートを必要とするレコードセットを要求した場合、そのコマンド テキストの結果として 1 つ以上のレコードセットが生成されると、エラーが発生します。

スクロール可能な SQLOLEDB レコードセットは、SQL Server カーソルによってサポートされます。SQL Server では、データベースの別のユーザーによって変更される可能性があるカーソルに制限を加えています。特に、一部のカーソルでは行を並べ替えることができず、SQL の ORDER BY 句を含むコマンドによるレコードセットの作成に失敗することがあります。

ダイナミック プロパティ

Microsoft OLE DB Provider for SQL Server は、開かれていない Connection オブジェクト、Recordset オブジェクト、および Command オブジェクトの Properties コレクションに各種のダイナミック プロパティを追加します。

次の表は、各ダイナミック プロパティの ADO プロパティ名および対応する OLE DB プロパティ名の一覧です。「OLE DB Programmer's Reference」では、「Description」で ADO プロパティ名について触れています。これらのプロパティの詳細については、「OLE DB Programmer's Reference」の「Index」で OLE DB プロパティ名を検索するか、「Appendix C: OLE DB Properties」を参照してください。.

Connection ダイナミック プロパティ

次に示すプロパティが、Connection オブジェクトの Properties コレクションに追加されます。

ADO プロパティ名 | OLE DB プロパティ名
Active Sessions | DBPROP_ACTIVESESSIONS
Asynchable Abort | DBPROP_ASYNCTXNABORT
Asynchable Commit | DBPROP_ASYNCTNXCOMMIT
Autocommit Isolation Levels | DBPROP_SESS_AUTOCOMMITISOLEVELS
Catalog Location | DBPROP_CATALOGLOCATION
Catalog Term | DBPROP_CATALOGTERM
Column Definition | DBPROP_COLUMNDEFINITION
Connect Timeout | DBPROP_INIT_TIMEOUT
Current Catalog | DBPROP_CURRENTCATALOG
Data Source | DBPROP_INIT_DATASOURCE
Data Source Name | DBPROP_DATASOURCENAME
Data Source Object Threading Model | DBPROP_DSOTHREADMODEL
DBMS Name | DBPROP_DBMSNAME
DBMS Version | DBPROP_DBMSVER
Extended Properties | DBPROP_INIT_PROVIDERSTRING
GROUP BY Support | DBPROP_GROUPBY
Heterogeneous Table Support | DBPROP_HETEROGENEOUSTABLES
Identifier Case Sensitivity | DBPROP_IDENTIFIERCASE
Initial Catalog | DBPROP_INIT_CATALOG
Isolation Levels | DBPROP_SUPPORTEDTXNISOLEVELS
Isolation Retention | DBPROP_SUPPORTEDTXNISORETAIN
Locale Identifier | DBPROP_INIT_LCID
Maximum Index Size | DBPROP_MAXINDEXSIZE
Maximum Row Size | DBPROP_MAXROWSIZE
Maximum Row Size Includes BLOB | DBPROP_MAXROWSIZEINCLUDESBLOB
Maximum Tables in SELECT | DBPROP_MAXTABLESINSELECT
Multiple Parameter Sets | DBPROP_MULTIPLEPARAMSETS
Multiple Results | DBPROP_MULTIPLERESULTS
Multiple Storage Objects | DBPROP_MULTIPLESTORAGEOBJECTS
Multi-Table Update | DBPROP_MULTITABLEUPDATE
NULL Collation Order | DBPROP_NULLCOLLATION
NULL Concatenation Behavior | DBPROP_CONCATNULLBEHAVIOR
OLE DB Version | DBPROP_PROVIDEROLEDBVER
OLE Object Support | DBPROP_OLEOBJECTS
Open Rowset Support | DBPROP_OPENROWSETSUPPORT
ORDER BY Columns in Select List | DBPROP_ORDERBYCOLUMNSINSELECT
Output Parameter Availability | DBPROP_OUTPUTPARAMETERAVAILABILITY
Pass By Ref Accessors | DBPROP_BYREFACCESSORS
Password | DBPROP_AUTH_PASSWORD
Persist Security Info | DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO
Persistent ID Type | DBPROP_PERSISTENTIDTYPE
Prepare Abort Behavior | DBPROP_PREPAREABORTBEHAVIOR
Prepare Commit Behavior | DBPROP_PREPARECOMMITBEHAVIOR
Procedure Term | DBPROP_PROCEDURETERM
Prompt | DBPROP_INIT_PROMPT
Provider Friendly Name | DBPROP_PROVIDERFRIENDLYNAME
Provider Name | DBPROP_PROVIDERFILENAME
Provider Version | DBPROP_PROVIDERVER
Read-Only Data Source | DBPROP_DATASOURCEREADONLY
Rowset Conversions on Command | DBPROP_ROWSETCONVERSIONSONCOMMAND
Schema Term | DBPROP_SCHEMATERM
Schema Usage | DBPROP_SCHEMAUSAGE
SQL Support | DBPROP_SQLSUPPORT
Structured Storage | DBPROP_STRUCTUREDSTORAGE
Subquery Support | DBPROP_SUBQUERIES
Table Term | DBPROP_TABLETERM
Transaction DDL | DBPROP_SUPPORTEDTXNDDL
User ID | DBPROP_AUTH_USERID
User Name | DBPROP_USERNAME
Window Handle | DBPROP_INIT_HWND

Recordset ダイナミック プロパティ

次に示すプロパティが、Recordset オブジェクトの Properties コレクションに追加されます。

ADO プロパティ名 | OLE DB プロパティ名
Access Order | DBPROP_ACCESSORDER
Blocking Storage Objects | DBPROP_BLOCKINGSTORAGEOBJECTS
Bookmark Type | DBPROP_BOOKMARKTYPE
Bookmarkable | DBPROP_IROWSETLOCATE
Change Inserted Rows | DBPROP_CHANGEINSERTEDROWS
Column Privileges | DBPROP_COLUMNRESTRICT
Column Set Notification | DBPROP_NOTIFYCOLUMNSET
Command Time Out | DBPROP_COMMANDTIMEOUT
Defer Column | DBPROP_DEFERRED
Delay Storage Object Updates | DBPROP_DELAYSTORAGEOBJECTS
Fetch Backwards | DBPROP_CANFETCHBACKWARDS
Hold Rows | DBPROP_CANHOLDROWS
IAccessor | DBPROP_IAccessor
IColumnsInfo | DBPROP_IColumnsInfo
IColumnsRowset | DBPROP_IColumnsRowset
IConnectionPointContainer | DBPROP_IConnectionPointContainer
IConvertType | DBPROP_IConvertType
Immobile Rows | DBPROP_IMMOBILEROWS
IRowset | DBPROP_IRowset
IRowsetChange | DBPROP_IRowsetChange
IRowsetIdentity | DBPROP_IRowsetIdentity
IRowsetInfo | DBPROP_IRowsetInfo
IRowsetLocate | DBPROP_IRowsestLocate
IRowsetResynch |
IRowsetScroll | DBPROP_IRowsetScroll
IRowsetUpdate | DBPROP_IRowsetUpdate
ISequentialStream | DBPROP_ISequentialStream
ISupportErrorInfo | DBPROP_ISupportErrorInfo
Literal Bookmarks | DBPROP_LITERALBOOKMARKS
Literal Row Identity | DBPROP_LITERALIDENTITY
Maximum Open Rows | DBPROP_MAXOPENROWS
Maximum Pending Rows | DBPROP_MAXPENDINGROWS
Maximum Rows | DBPROP_MAXROWS
Notification Granularity | DBPROP_NOTIFICATIONGRANULARITY
Notification Phases | DBPROP_NOTIFICATIONPHASES
Objects Transacted | DBPROP_TRANSACTEDOBJECT
Others' Changes Visible | DBPROP_OTHERUPDATEDELETE
Others' Inserts Visible | DBPROP_OTHERINSERT
Own Changes Visible | DBPROP_OWNUPDATEDELETE
Own Inserts Visible | DBPROP_OWNINSERT
Preserve on Abort | DBPROP_ABORTPRESERVE
Preserve on Commit | DBPROP_COMMITPRESERVE
Quick Restart | DBPROP_QUICKRESTART
Reentrant Events | DBPROP_REENTRANTEVENTS
Remove Deleted Rows | DBPROP_REMOVEDELETED
Report Multiple Changes | DBPROP_REPORTMULTIPLECHANGES
Return Pending Inserts | DBPROP_RETURNPENDINGINSERTS
Row Delete Notification | DBPROP_NOTIFYROWDELETE
Row First Change Notification | DBPROP_NOTIFYROWFIRSTCHANGE
Row Insert Notification | DBPROP_NOTIFYROWINSERT
Row Privileges | DBPROP_ROWRESTRICT
Row Resynchronization Notification | DBPROP_NOTIFYROWRESYNCH
Row Threading Model | DBPROP_ROWTHREADMODEL
Row Undo Change Notification | DBPROP_NOTIFYROWUNDOCHANGE
Row Undo Delete Notification | DBPROP_NOTIFYROWUNDODELETE
Row Undo Insert Notification | DBPROP_NOTIFYROWUNDOINSERT
Row Update Notification | DBPROP_NOTIFYROWUPDATE
Rowset Fetch Position Change Notification | DBPROP_NOTIFYROWSETFETCHPOSISIONCHANGE
Rowset Release Notification | DBPROP_NOTIFYROWSETRELEASE
Scroll Backwards | DBPROP_CANSCROLLBACKWARDS
Server Cursor | DBPROP_SERVERCURSOR
Skip Deleted Bookmarks | DBPROP_BOOKMARKSKIPPED
Strong Row Identity | DBPROP_STRONGITDENTITY
Unique Rows | DBPROP_UNIQUEROWS
Updatability | DBPROP_UPDATABILITY
Use Bookmarks | DBPROP_BOOKMARKS

Command ダイナミック プロパティ

次に示すプロパティが、Command オブジェクトの Properties コレクションに追加されます。

ADO プロパティ名 | OLE DB プロパティ名
Access Order | DBPROP_ACCESSORDER
Blocking Storage Objects | DBPROP_BLOCKINGSTORAGEOBJECTS
Bookmark Type | DBPROP_BOOKMARKTYPE
Bookmarkable | DBPROP_IROWSETLOCATE
Change Inserted Rows | DBPROP_CHANGEINSERTEDROWS
Column Privileges | DBPROP_COLUMNRESTRICT
Column Set Notification | DBPROP_NOTIFYCOLUMNSET
Defer Column | DBPROP_DEFERRED
Delay Storage Object Updates | DBPROP_DELAYSTORAGEOBJECTS
Fetch Backwards | DBPROP_CANFETCHBACKWARDS
Hold Rows | DBPROP_CANHOLDROWS
IAccessor | DBPROP_IAccessor
IColumnsInfo | DBPROP_IColumnsInfo
IColumnsRowset | DBPROP_IColumnsRowset
IConnectionPointContainer | DBPROP_IConnectionPointContainer
IConvertType | DBPROP_IConvertType
Immobile Rows | DBPROP_IMMOBILEROWS
IRowset | DBPROP_IRowset
IRowsetChange | DBPROP_IRowsetChange
IRowsetIdentity | DBPROP_IRowsetIdentity
IRowsetInfo | DBPROP_IRowsetInfo
IRowsetLocate | DBPROP_IRowsetLocate
IRowsetResynch |
IRowsetScroll | DBPROP_IRowsetScroll
IRowsetUpdate | DBPROP_IRowsetUpdate
ISequentialStream | DBPROP_ISequentialStream
ISupportErrorInfo | DBPROP_ISupportErrorInfo
Literal Bookmarks | DBPROP_LITERALBOOKMARKS
Literal Row Identity | DBPROP_LITERALIDENTITY
Lock Mode | DBPROP_LOCKMODE
Maximum Open Rows | DBPROP_MAXOPENROWS
Maximum Pending Rows | DBPROP_MAXPENDINGROWS
Maximum Rows | DBPROP_MAXROWS
Notification Granularity | DBPROP_NOTIFICATIONGRANULARITY
Notification Phases | DBPROP_NOTIFICATIONPHASES
Objects Transacted | DBPROP_TRANSACTEDOBJECT
Others' Changes Visible | DBPROP_OTHERUPDATEDELETE
Others' Inserts Visible | DBPROP_OTHERINSERT
Own Changes Visible | DBPROP_OWNUPDATEDELETE
Own Inserts Visible | DBPROP_OWNINSERT
Preserve on Abort | DBPROP_ABORTPRESERVE
Preserve on Commit | DBPROP_COMMITPRESERVE
Quick Restart | DBPROP_QUICKRESTART
Reentrant Events | DBPROP_REENTRANTEVENTS
Remove Deleted Rows | DBPROP_REMOVEDELETED
Report Multiple Changes | DBPROP_REPORTMULTIPLECHANGES
Return Pending Inserts | DBPROP_RETURNPENDINGINSERTS
Row Delete Notification | DBPROP_NOTIFYROWDELETE
Row First Change Notification | DBPROP_NOTIFYROWFIRSTCHANGE
Row Insert Notification | DBPROP_NOTIFYROWINSERT
Row Privileges | DBPROP_ROWRESTRICT
Row Resynchronization Notification | DBPROP_NOTIFYROWRESYNCH
Row Threading Model | DBPROP_ROWTHREADMODEL
Row Undo Change Notification | DBPROP_NOTIFYROWUNDOCHANGE
Row Undo Delete Notification | DBPROP_NOTIFYROWUNDODELETE
Row Undo Insert Notification | DBPROP_NOTIFYROWUNDOINSERT
Row Update Notification | DBPROP_NOTIFYROWUPDATE
Rowset Fetch Position Change Notification | DBPROP_NOTIFYROWSETFETCHPOSITIONCHANGE
Rowset Release Notification | DBPROP_NOTIFYROWSETRELEASE
Scroll Backwards | DBPROP_CANSCROLLBACKWARDS
Server Data on Insert | DBPROP_SERVERDATAONINSERT
Server Cursor | DBPROP_SERVERCURSOR
Skip Deleted Bookmarks | DBPROP_BOOKMARKSKIP
Strong Row Identity | DBPROP_STRONGIDENTITY
Updatability | DBPROP_UPDATABILITY
Use Bookmarks | DBPROP_BOOKMARKS

関連項目 Microsoft OLE DB Provider for SQL Server の実際の使用方法および機能に関する情報については、MDAC SDK の OLE DB Provider for SQL Server のマニュアルを参照してください。


Microsoft OLE DB Provider for Oracle

Microsoft OLE DB Provider for Oracle を利用すると、ADO から Oracle データベースにアクセスできます。

接続文字列パラメータ

このプロバイダに接続するには、ConnectionString プロパティの Provider 引数を次のように設定します。

MSDAORA

Provider プロパティを取得した場合も、この文字列が返されます。

キーセット カーソルまたは動的カーソルによる結合クエリを Oracle データベースで実行すると、エラーが発生します。Oracle では、読み取り専用の静的カーソルのみをサポートしています。

接続文字列の例

このプロバイダの代表的な接続文字列を次に示します。

"Provider=MSDAORA;Data Source=serverName;User ID=userName; Password=userPassword;"

この接続文字列は、次に示すキーワードで構成されています。

キーワード | 説明
Provider | OLE DB Provider for Oracle を指定します。
Data Source | サーバー名を指定します。
User ID | ユーザー名を指定します。
Password | ユーザー パスワードを指定します。

プロバイダ固有の接続パラメータ

このプロバイダは、ADO で定義されたパラメータのほかに、プロバイダ固有の各種の接続パラメータをサポートしています。プロバイダ固有のプロパティは、ADO で定義されている接続プロパティと同様に、Connection オブジェクトの Properties コレクションで設定するか、ConnectionString の一部として設定することができます。

これらのパラメータについては、「OLE DB Programmer's Reference」で詳細に説明しています。「ADO ダイナミック プロパティ インデックス」で、これらのパラメータと、それに対応する OLE DB プロパティの相互参照を提供しています。

パラメータ | 説明
Window Handle | 追加情報の入力を促すために使用するウィンドウ ハンドルを示します。
Locale Identifier | ユーザーの言語に関する設定を定義する一意の 32 ビット番号 (たとえば、1033 など) を示します。これらの設定は、日付と時刻の表示形式、アルファベット順のソート方法、文字列の比較方法などを示します。
OLE DB Services | OLE DB サービスを有効にするか無効にするかを指定するビットマスクを示します。
Prompt | 接続が確立されているときに、ユーザーに入力を促すかどうかを示します。
Extended Properties | プロバイダ固有の拡張接続情報を表す文字列です。通常のプロパティでは記述できないプロバイダ固有の接続情報についてのみ、このプロパティを使用してください。


Microsoft OLE DB Provider for Internet Publishing

Microsoft OLE DB Provider for Internet Publishing を利用すると、ADO から、Microsoft FrontPage または Microsoft Internet Information Services が提供するリソースにアクセスできます。このリソースには、HTML ファイルなどの Web ソース ファイルや、Windows 2000 の Web フォルダも含まれます。

接続文字列パラメータ

このプロバイダに接続するには、ConnectionString プロパティの Provider 引数を次のように設定します。

MSDAIPP.DSO

この値の設定または取得には、Provider プロパティを使用します。

接続文字列の例

このプロバイダの代表的な接続文字列を次に示します。

"Provider=MSDAIPP.DSO;Data Source=ResourceURL;User ID=userName;Password=userPassword;"

これと同じ内容を、次のように記述することもできます。

"URL=ResourceURL;User ID=userName;Password=userPassword;"

この接続文字列は、次に示すキーワードで構成されています。

キーワード | 説明
Provider | OLE DB Provider for Internet Publishing を指定します。
Data Source または Server | Web フォルダに公開されているファイルまたはディレクトリの URL を指定します。
User ID | ユーザー名を指定します。
Password | ユーザー パスワードを指定します。

接続文字列の "URL=" の ResourceURL を無効な値に設定すると、既定では、有効な値の入力を求めるダイアログ ボックスが表示されます。この動作は、アプリケーションの中間層に位置するコンポーネントには不適切です。ダイアログ ボックスが閉じられるまでプログラムの実行が中断されるので、クライアントは、そのコンポーネントから応答が返されないために、フリーズ状態になります。

注意 接続文字列の Provider キーワード、または Provider プロパティのどちらかでプロバイダの値として明示的に MSDAIPP.DSO が指定されると、接続文字列に "URL=" を使用することはできません。使用すると、エラーが発生します。その場合は、「OLE DB Provider for Internet Publishing を用いた ADO の使用」に示されているように、URL のみを指定してください。


Microsoft Data Shaping Service for OLE DB (ADO サービス プロバイダ)

Microsoft Data Shaping Service for OLE DB

Microsoft Data Shaping Service for OLE DB サービス プロバイダは、データ プロバイダの階層 (シェイプされた) Recordset オブジェクトの構築をサポートします。

プロバイダ キーワード

Data Shaping Service for OLE DB を呼び出すには、接続文字列のキーワードと値を次のように指定します。

"Provider=MSDataShape"

ダイナミック プロパティ

このサービス プロバイダを呼び出すと、次に示すダイナミック プロパティが、Connection オブジェクトの Properties コレクションに追加されます。

ダイナミック プロパティ名 | 説明
Unique Reshape Names | Name プロパティの値が重複する Recordset オブジェクトを作成できるかどうかを示します。このダイナミック プロパティが True の場合、既存の Recordset と同じ名前で新しく Recordset を作成すると、新規 Recordset オブジェクトの名前は、一意の名前になるように修正されます。このプロパティが False の場合、既存の Recordset と同じ名前で新しく Recordset を作成すると、両方の Recordset オブジェクトは、同じ名前を持ちます。したがって、両方のレコードセットが存在する限り、どちらの Recordset もリシェイプされません。 このプロパティの既定値は False です。
Data Provider | シェイプする行を提供するプロバイダ名を示します。

書き込み可能なダイナミック プロパティを設定するには、そのプロパティ名を接続文字列のキーワードとして指定します。たとえば、Microsoft Visual Basic で、Data Provider ダイナミック プロパティを "MSDASQL" に設定するには、次のように指定します。

Dim cn as New ADODB.Connection
cn.Open "Provider=MSDataShape;Data Provider=MSDASQL"

ダイナミック プロパティを設定または取得するには、そのプロパティ名を Properties プロパティのインデックスとして指定します。たとえば、Data Provider ダイナミック プロパティの現在の値を取得して表示し、その後で新しい値を設定するには、次のように指定します。

Debug.Print cn.Properties("Data Provider")
cn.Properties("Data Provider") = "MSDASQL"

データ シェイプの詳細については、「データ シェイプ」を参照してください。


Microsoft OLE DB Persistence Provider (ADO サービス プロバイダ)

Microsoft OLE DB Persistence Provider

Microsoft OLE DB Persistence Provider を利用すると、Recordset オブジェクトをファイルに保存し、後で、その Recordset オブジェクトをファイルから復元することができます。スキーマ情報、データ、および保留中の変更が保持されます。

Recordset オブジェクトは、Microsoft の ADTG (Advanced Data Table Gram) 形式、または公開されている XML (Extensible Markup Language) 形式で保存することができます。

プロバイダ キーワード

このプロバイダを呼び出すには、接続文字列のキーワードと値を次のように指定します。

"Provider=MSPersist"

エラー

次に示すエラーがこのプロバイダで発生し、アプリケーション内で検出されることがあります。

定数 | 説明
E_BADSTREAM | 開かれたファイルの形式が有効ではありません。つまり、ADTG 形式または XML 形式ではありません。
E_CANTPERSISTROWSET | 保存する Recordset オブジェクトは、保存の妨げになる特性を持っています。

解説

Microsoft OLE DB Persistence Provider では、ダイナミック プロパティは公開されていません。

現在、パラメータ化された階層 Recordset オブジェクトは保存できません。

Recordset オブジェクトの永続的保存の詳細については、「Recordset の永続化」を参照してください。


Microsoft OLE DB Remoting Provider (ADO サービス プロバイダ)

Microsoft OLE DB Remoting Provider

Microsoft OLE DB Remoting Provider を利用すると、クライアント コンピュータのローカル ユーザーは、リモート コンピュータのデータ プロバイダを呼び出すことができます。リモート コンピュータのローカル ユーザーと同じように、リモート コンピュータのデータ プロバイダ パラメータを指定してください。次に、リモート コンピュータにアクセスするために Remoting Provider で使用するパラメータを指定してください。その結果、ローカル ユーザーと同じように、リモート コンピュータにアクセスすることができます。

プロバイダ キーワード

OLE DB Remoting Provider を呼び出すには、接続文字列のキーワードと値を次のように指定します。プロバイダ名の "MS" と "Remote" の間のスペースに注意してください。

"Provider=MS Remote"

その他のキーワード

このサービス プロバイダを呼び出す場合には、次に示すキーワードも指定できます。

キーワード | 説明
Data Source | リモート データ ソース名を示します。この値は、OLE DB Remoting Provider に渡されて処理されます。 このキーワードは、RDS.DataControl オブジェクトの Connect プロパティと同等です。

ダイナミック プロパティ

このサービス プロバイダを呼び出すと、次に示すダイナミック プロパティが、Connection オブジェクトの Properties コレクションに追加されます。

ダイナミック プロパティ名 | 説明
DFMode DataFactory モードを示します。サーバー上の、DataFactory オブジェクトのバージョンを指定する文字列です。接続を開く前に、このプロパティを設定し、DataFactory の特定のバージョンを要求してください。要求したバージョンを利用できない場合は、その前のバージョンの使用が試行されます。前のバージョンが存在しない場合は、エラーが発生します。DFMode が、利用可能なバージョンよりも前のバージョンの場合は、エラーが発生します。このプロパティは、接続の確立後は読み取り専用になります。

次の文字列値の 1 つを指定できます。

  • "25" - Version 2.5 (既定)

  • "21" - Version 2.1

  • "20" - Version 2.0

  • "15" - Version 1.5
Current DFMode サーバー上の DataFactory の実際のバージョン番号を示します。DFMode プロパティで要求したバージョンが受け付けられたかどうかを調べるには、このプロパティを確認してください。

次の長整数型 (Long) の値の 1 つを指定できます。

  • 25 - Version 2.5 (既定)

  • 21 - Version 2.1

  • 20 - Version 2.0

  • 15 - Version 1.5

MSRemote プロバイダを使用するときに、接続文字列に "DFMode=20;" を追加すると、データ更新時のサーバーのパフォーマンスを向上させることができます。この設定では、そのサーバー上の RDSServer.DataFactory オブジェクトは、リソースの使用の集中度が低いモードを使用します。ただし、この設定では、次の機能は利用できません。

  • パラメータ クエリを使用する。

  • Execute メソッドを呼び出す前に、パラメータまたは列の情報を取得する。

  • Transact Updates を True に設定する。

  • 行のステータスを取得する。

  • Resync メソッドを呼び出す。

  • Update Resync プロパティによって更新する (明示的または自動的)。

  • Command または Recordset のプロパティを設定する。

  • adCmdTableDirect を使用する。
Handler | RDSServer.DataFactory の機能を拡張するサーバー側のカスタマイズ プログラム (ハンドラ) の名前、およびそのハンドラで使用されるパラメータを示します。プログラム (ハンドラ) 名とパラメータは、すべてカンマ (",") で区切られます。文字列型 (String) の値です。
Internet Timeout | 要求がサーバーとの間を行き来するときの最大待機時間をミリ秒単位で示します。既定は 5 分です。
Remote Provider | リモート サーバーで使用されるデータ プロバイダ名を示します。
Remote Server | この接続で使用されるサーバー名および通信プロトコルを示します。このプロパティは、RDS.DataControl オブジェクトの Server プロパティと同等です。

書き込み可能なダイナミック プロパティを設定するには、そのプロパティ名を接続文字列のキーワードとして指定します。たとえば、Internet Timeout ダイナミック プロパティを 5 秒に設定するには、次のように指定します。

Dim cn as New ADODB.Connection
cn.Open "Provider=MS Remote;Internet Timeout=5000"

ダイナミック プロパティを設定または取得するには、そのプロパティ名を Properties プロパティのインデックスとして指定します。たとえば、Internet Timeout ダイナミック プロパティの現在の値を取得して表示し、その後で新しい値を設定するには、次のように指定します。

Debug.Print cn.Properties("Internet Timeout")
cn.Properties("Internet Timeout") = 5000

解説

ADO 2.0 では、OLE DB Remoting Provider は、Recordset オブジェクトの Open メソッドの ActiveConnection パラメータでのみ指定できます。ADO 2.1 以降では、Connection オブジェクトの Open メソッドの ConnectionString パラメータでも指定できます。

RDS.DataControl オブジェクトの SQL プロパティと同等のダイナミック プロパティはありません。その代わりに、Recordset オブジェクトの Open メソッドの Source 引数を使用します。

"...;Remote Provider=MS Remote;..." のように指定すると 4 層構造になりますが、3 層を超える場合については、テストは行われておらず、必要になることもないはずです。

例

この例では、YourServer というサーバー上の pubs データベースの authors テーブルに対してクエリを実行します。リモート データ ソース名およびリモート サーバー名は、Connection オブジェクトの Open メソッドで指定し、SQL クエリは、Recordset オブジェクトの Open メソッドで指定します。Recordset オブジェクトが返され、編集されて、データ ソースの更新に使用されます。

Dim rs as New ADODB.Recordset
Dim cn as New ADODB.Connection
cn.Open  "Provider=MS Remote;Data Source=pubs;" & _
         "Remote Server=http://YourServer"
rs.Open "SELECT * FROM authors", cn
...                'Edit the recordset
rs.UpdateBatch     'Equivalent of RDS SubmitChanges
...


Microsoft Cursor Service for OLE DB (ADO サービス コンポーネント)

Microsoft Cursor Service for OLE DB

Microsoft Cursor Service for OLE DB は、データ プロバイダのカーソル サポート機能を追加します。その結果、ユーザーは、すべてのデータ プロバイダで一貫した機能性を得ることができます。

Cursor Service は、ダイナミック プロパティを使用可能にして特定のメソッドの動作を強化します。たとえば、Optimize ダイナミック プロパティを使用すると、一時的なインデックスの作成が可能になり、Find メソッドなどの特定の操作が容易になります。

Cursor Serviceを使用すると、あらゆる場合のバッチ更新が可能になります。また、静的カーソルのような低機能のカーソルのみを提供するデータ プロバイダでも、動的カーソルのような、より機能的なカーソル タイプを利用できます。

キーワード

このサービス コンポーネントを呼び出すには、Recordset オブジェクトまたは Connection オブジェクトの CursorLocation プロパティを adUseClient に設定します。

connection.CursorLocation=adUseClient
recordset.CursorLocation=adUseClient

ダイナミック プロパティ

Cursor Service for OLE DB を呼び出すと、次に示すダイナミック プロパティが、Recordset オブジェクトの Properties コレクションに追加されます。Connection オブジェクトおよび Recordset オブジェクトのダイナミック プロパティの一覧は、「ADO ダイナミック プロパティ インデックス」に示されています。対応する OLE DB プロパティ名がある場合は、ADO プロパティ名の後のかっこ内に示されています。

Cursor Service を呼び出した後は、一部のダイナミック プロパティの変更が、基になるデータ ソースに表示されません。たとえば、Recordset で Command Time out プロパティを設定しても、基になるデータ プロバイダには表示されません。

?
Recordset1.CursorLocation = adUseClient     'invokes cursor service
Recordset1.Open "authors", _
    "Provider=SQLOLEDB;Data Source=DBServer;User Id=usr;" & _
    "Password=pwd;Initial Catalog=pubs;",,,adCmdTable
Recordset1.Properties.Item("Command Time out") = 50
' 'Command Time out' property on DBServer is still default (30).
?

使用するアプリケーションが Cursor Service を必要とし、基になるプロバイダのダイナミック プロパティを設定する必要がある場合は、Cursor Service を呼び出す前にダイナミック プロパティを設定してください。コマンド オブジェクトのプロパティの設定値は、カーソルの位置に関係なく、常に、基になるデータ プロバイダに渡されます。したがって、いつでも、コマンド オブジェクトを使ってプロパティを設定することもできます。

プロパティ名 | 説明
Auto Recalc (DBPROP_ADC_AUTORECALC) | Data Shaping Service で作成されたレコードセットの場合、この値は、計算列および総計列の計算頻度を示します。この値が 1 (既定値) の場合は、Data Shaping Service で値の変更が確認されるたびに再計算が行われます。この値が 0 の場合は、階層が最初に構築されたときにのみ計算列または総計列が計算されます。
Batch Size (DBPROP_ADC_BATCHSIZE) | データ ストアに送信するまでにバッチ処理できる更新ステートメント数を示します。1 回のバッチ処理に含めるステートメント数が多いほど、データ ストアとの往復動作が少なくなります。
Cache Child Rows (DBPROP_ADC_CACHECHILDROWS) | Data Shaping Service で作成されたレコードセットの場合、この値は、子レコードセットを後で使用できるようにキャッシュに保存しておくかどうかを示します。
Cursor Engine Version (DBPROP_ADC_CEVER) | 使用する Cursor Service のバージョンを示します。
Maintain Change Status (DBPROP_ADC_MAINTAINCHANGESTATUS) | 複数テーブルの結合で、1 行または複数行を再同期化するために使用するコマンドのテキストを示します。
Optimize | インデックスを作成するかどうかを示します。True に設定すると、特定の操作の実行速度を上げるための一時的なインデックスの作成を許可します。
Reshape Name | Recordset の名前を示します。現在の、または次のデータ シェイプ コマンド内で参照される場合があります。
Resync Command | Unique Table プロパティが有効の場合に、Resync メソッドで使用されるカスタム コマンド文字列を示します。
Unique Catalog | Unique Table プロパティで参照されるテーブルを含むデータベースの名前を示します。
Unique Schema | Unique Table プロパティで参照されるテーブルの所有者の名前を示します。
Unique Table | 挿入、更新、または削除による変更が可能な複数のテーブルから作成された Recordset に含まれる 1 つのテーブル名を示します。
Update Criteria (DBPROP_ADC_UPDATECRITERIA) | 更新時に発生する競合を処理するために使用する WHERE 句のフィールドを示します。
Update Resync (DBPROP_ADC_UPDATERESYNC) | Unique Table プロパティが有効の場合に、UpdateBatch メソッドの終了後に Resync メソッドを暗黙的に呼び出すかどうかを示します。

ダイナミック プロパティを設定または取得するには、そのプロパティ名を Properties プロパティのインデックスとして指定します。たとえば、Optimize ダイナミック プロパティの現在の値を取得して表示し、その後で新しい値を設定するには、次のように指定します。

Debug.Print rs.Properties("Optimize")
rs.Properties("Optimize") = True

組み込みプロパティの動作

Cursor Service for OLE DB は、特定の組み込みプロパティの動作にも影響を与えます。

プロパティ名 | 説明
CursorType | Recordset で利用可能なカーソルのタイプを追加します。
LockType | Recordset で利用可能なロックのタイプを追加します。バッチ更新を有効にします。
Sort | Recordset のソート基準にする 1 つまたは複数のフィールド名、および昇順または降順のどちらでソートするかを指定します。

メソッドの動作

Cursor Service for OLE DB は、Field オブジェクトの Append メソッドと、Recordset オブジェクトの Open メソッド、Resync メソッド、UpdateBatch メソッド、および Save メソッドの動作を有効にするか、またはその動作に影響を与えます。


ADO 用語集

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z あ か さ た な は ま や ら わ

A

ActiveX コントロール

ADISAPI

B

C

CLSID

COM

COM コンポーネント

D

DCOM

DDL

DLL

DML

DSN

E

F

G

H

I

ISAPI

J

K

L

M

MIME

Multi-purpose Internet Mail Extension

N

O

ODBC

OLE DB

P

ProgID

Q

R

S

T

U

Uniform Resource Locator

URL

V

W

Web サーバー

X

Y

Z

あ

アドバンスド データ インターネット サーバー アプリケーション プログラミング インターフェイス

アパートメント スレッド

イベント

イベント ハンドラ

インターネット サーバー アプリケーション プログラミング インターフェイス

永続化

エイリアス

オープン データベース コネクティビティ

オブジェクト変数

親

親エイリアス

親子関係

か

カーソル

階層

階層 Recordset

キー

既定ストリーム

行セット

兄弟

共有的ロック

クライアント層

クラス識別子

計算式

子

子エイリアス

コンポーネント

コンポーネント オブジェクト モデル

さ

サービス プロバイダ

サブノード

シェイプされた Recordset

集計関数

序数値

スキーマ

スタブ

ストアド プロシージャ

接続されていない Recordset

絶対 URL

相対 URL

た

ダイナミック プロパティ

ダイナミック リンク ライブラリ

チャプタ

チャプタ エイリアス

中間層

ツリー

定数

データ シェイプ

データ操作言語

データ ソース層

データ ソース名

データ定義言語

データ バインディング

データ プロバイダ

適用範囲

同期操作

ドキュメント ソース プロバイダ

な

ノード

は

排他的ロック

バインディング エントリ

パラメータ化コマンド

ハンドラ

比較演算子

ビジネス オブジェクト

ビジネス ルール

ビットマスク

非同期操作

プール

複合ファイル

ブックマーク

プロキシ

プログラム識別子

分散アプリケーション

分散コンポーネント オブジェクト モデル

ま

マーシャリング

文字セット

や

ら

リソース レコード

リモート データ ソース

ルート

列挙

わ


Microsoft ADO プログラマーズ リファレンス

Microsoft ADOX プログラマーズ リファレンス

Microsoft® ActiveX® Data Objects Extensions for Data Definition Language and Security (ADOX) は、ADO オブジェクトおよびプログラミング モデルの拡張機能です。ADOX は、セキュリティに加え、スキーマの作成および修正のためのオブジェクトを含みます。ADOX ではオブジェクト ベースでスキーマ操作が行われるため、多種多様なデータ ソースに対してそれぞれの構文の違いに関係なく動作するコードを記述できます。

ADOX は、コア ADO オブジェクトに付随するライブラリです。これは、テーブルやプロシージャなどのスキーマ オブジェクトの作成、修正、および削除のための追加オブジェクトを提供します。また、ユーザーおよびグループを保持し、オブジェクトに対する権限を与えたり取り消すためのセキュリティ オブジェクトも含みます。

開発ツールで ADOX を使用するには、ADOX タイプ ライブラリへの参照を確立する必要があります。[参照設定] ダイアログ ボックスで [Microsoft ADO Ext. 2.5 for DDL and Security] を選択します。ADOX ライブラリのファイル名は Msadox.dll で、プログラム ID (ProgID) は "ADOX" です。ライブラリへの参照確立に関する詳細については、開発ツールのマニュアルを参照してください。

Microsoft OLE DB Provider for Microsoft Jet Database Engine は、ADOX を完全にサポートします。データ プロバイダによっては、ADOX の特定の機能をサポートしていない場合があります。Microsoft OLE DB Provider for ODBC、Microsoft OLE DB Provider for Oracle、または Microsoft SQL Server OLE DB Provider がサポートしている機能に関する詳細については、MDAC の Readme ファイルを参照してください。

このドキュメントは、Microsoft® Visual Basic® を使用できる知識および ADO に関する一般的な知識を持っていることを前提としています。ADO の詳細については、「Microsoft ADO プログラマーズ リファレンス」を参照してください。ADOX に関する概要については、次のトピックを参照してください。

  • ADOX オブジェクト モデル

  • ADOX オブジェクト

  • ADOX コレクション

  • ADOX プロパティ

  • ADOX メソッド

  • ADOX コードの例


ADOX の最新情報

ADOX コードの例

例には、Microsoft Visual C++® のコード例が追加されました。また、Microsoft Visual Basic の追加例がさらに加わりました。これらのコード例をコピーして、使用するエディタに貼り付けることができます。


ADOX API リファレンス

このセクションには、ADOX オブジェクト、コレクション、メソッド、およびプロパティのそれぞれのトピックに加え、必要に応じてサンプル コードを含んでいます。詳細については、特定のトピックをキーワードで検索するか、次のトピックを参照してください。

  • ADOX オブジェクト

  • ADOX コレクション

  • ADOX プロパティ

  • ADOX メソッド

  • ADOX 列挙定数

  • ADOX コードの例


ADOX オブジェクト モデル

次の図に、ADOX でオブジェクトがどのように表され、関連付けられているかを示します。特定のオブジェクトやコレクションの詳細については、各トピックの「参照」項目、または「ADOX オブジェクト」および「ADOX コレクション」を参照してください。

また、Table、Index、および Column オブジェクトにも、標準 ADO Properties コレクションが存在します。


ADOX オブジェクト

ADOX オブジェクトの概要

オブジェクト | 説明
Catalog | データ ソースのスキーマ カタログを表すコレクションを含みます。
Column | テーブル、インデックス、またはキーの列を表します。
Group | 保護されているデータベースへのアクセス権を持つグループ アカウントを表します。
Index | データベース テーブルのインデックスを表します。
Key | データベース テーブルの主、外部、または一意のキー フィールドを表します。
Procedure | ストアド プロシージャを表します。
Table | 列、インデックス、およびキーを含むデータベース テーブルを表します。
User | 保護されているデータベースへのアクセス権を持つユーザー アカウントを表します。
View | 抽出されたレコードのセットまたは仮想テーブルを表します。

これらのオブジェクト間の関係については、「ADOX オブジェクト モデル」を参照してください。

それぞれのオブジェクトは、対応するコレクションに格納することができます。たとえば、Table オブジェクトは、Tables コレクションに格納することができます。詳細については、「ADOX コレクション」、またはコレクションの特定の項目を参照してください。


Catalog オブジェクト (ADOX)

Catalog オブジェクト

データ ソースのスキーマ カタログを表すコレクション (Tables、Views、Users、Groups、および Procedures) を含みます。

解説

オブジェクトを追加または削除して、あるいは既にあるオブジェクトを修正することで、Catalog オブジェクトを修正できます。プロバイダによっては、Catalog オブジェクトの一部をサポートしているもの、またはスキーマ情報の表示のみをサポートしているものもあります。

Catalog オブジェクトのプロパティおよびメソッドを使用すると、次のことができます。

  • ActiveConnection プロパティに ADO Connection オブジェクトまたは有効な接続文字列を設定して、カタログを開きます。

  • Create メソッドで、新規カタログを作成します。

  • GetObjectOwner および SetObjectOwner メソッドで、Catalog 内のオブジェクトの所有者を決定します。


Column オブジェクト (ADOX)

Column オブジェクト

テーブル、インデックス、またはキーの列を表します。

解説

次のコードは、新規 Column を作成します。

Dim obj As New Column

Column オブジェクトのプロパティおよびコレクションを使用すると、次のことができます。

  • Name プロパティで、列を識別します。

  • Type プロパティで、列のデータ型を指定します。

  • Attributes プロパティで、列が固定長かどうか、または列が Null 値を持つことができるかどうかを決定します。

  • DefinedSize プロパティで、列の最大サイズを指定します。

  • 数値型 (Numeric) のデータ値に対して、NumericScale プロパティで、小数部桁数を指定します。

  • 数値型 (Numeric) のデータ値に対して、Precision プロパティで、最大有効桁数を指定します。

  • ParentCatalog プロパティで、列を所有する Catalog を指定します。

  • キー列に対して、RelatedColumn プロパティで、連結テーブルにある連結する列の名前を指定します。

  • インデックス列に対して、SortOrder プロパティで、ソート順序が昇順か降順かを指定します。

  • Properties コレクションで、プロバイダに固有のプロパティにアクセスします。

    注意 Column オブジェクトのプロパティによっては、データ プロバイダがサポートしていないことがあります。プロバイダがサポートしていないプロパティの値を設定した場合、エラーが発生します。新規 Column オブジェクトの場合、オブジェクトがコレクションに追加されたときにエラーが発生します。既存のオブジェクトについては、プロパティの設定時にエラーが発生します。

    Column オブジェクトの作成時、オプションのプロパティに対する適切な既定値が存在していても、プロバイダがプロパティをサポートしているとは限りません。プロバイダによってサポートされているプロパティについては、利用するプロバイダのマニュアルを参照してください。


Group オブジェクト (ADOX)

Group オブジェクト

保護されているデータベースへのアクセス権を持つグループ アカウントを表します。

解説

Catalog の Groups コレクションは、カタログのすべてのグループ アカウントを表します。User の Groups コレクションは、ユーザーが属するグループのみを表します。

Group オブジェクトのプロパティ、コレクション、およびメソッドを使用すると、次のことができます。

  • Name プロパティで、グループを識別します。

  • GetPermissions および SetPermissions メソッドで、グループに読み取り、書き込み、または削除の権限があるかどうかを決定します。

  • Users コレクションで、グループにメンバシップを持つユーザー アカウントにアクセスします。


Index オブジェクト (ADOX)

Index オブジェクト

データベース テーブルのインデックスを表します。

解説

次のコードは、新規 Index を作成します。

Dim obj As New Index

Index オブジェクトのプロパティおよびコレクションを使用すると、次のことができます。

  • Name プロパティで、インデックスを識別します。

  • Columns コレクションで、データベースのインデックス列にアクセスします。

  • Unique プロパティで、インデックス キーが一意であるべきかどうかを指定します。

  • PrimaryKey プロパティで、インデックスをテーブルの主キーにするかどうかを指定します。

  • IndexNulls プロパティで、インデックス フィールドに Null 値を持つレコードに、インデックスへのエントリを持たせるかどうかを指定します。

  • Clustered プロパティで、インデックスをクラスタ化するかどうかを指定します。

  • Properties コレクションで、プロバイダに固有のインデックス プロパティにアクセスします。

    注意 Index の Columns コレクションに Column を追加するときに、Tables コレクションに既に追加した Table オブジェクトに Column がまだ存在していない場合は、エラーが発生します。

    Index オブジェクトのプロパティによっては、データ プロバイダがサポートしていないことがあります。プロバイダがサポートしていないプロパティの値を設定した場合、エラーが発生します。新規 Index オブジェクトについては、オブジェクトがコレクションに追加されたときにエラーが発生します。既存のオブジェクトについては、プロパティの設定時にエラーが発生します。

    Index オブジェクトの作成時、オプションのプロパティに対する適切な既定値が存在していても、プロバイダがプロパティをサポートしているとは限りません。プロバイダによってサポートされているプロパティについては、利用するプロバイダのマニュアルを参照してください。


Key オブジェクト (ADOX)

Key オブジェクト

データベース テーブルの主、外部、または一意のキー フィールドを表します。

解説

次のコードは新規 Key を作成します。

Dim obj As New Key

Key オブジェクトのプロパティおよびコレクションを使用すると、次のことができます。

  • Name プロパティで、キーを識別します。

  • Type プロパティで、キーが主、外部、または一意のキーのうちのどれであるかを決定します。

  • Columns コレクションで、データベースのキー列にアクセスします。

  • RelatedTable プロパティで、関連するテーブルの名前を指定します。

  • DeleteRule および UpdateRule プロパティで、主キーの削除または更新時の動作を決定します。


Procedure オブジェクト (ADOX)

Procedure オブジェクト

ストアド プロシージャを表します。ADO の Command オブジェクトと連動して使用すると、Procedure オブジェクトは、ストアド プロシージャの追加、削除、または修正に使用できます。

解説

Procedure オブジェクトによって、プロバイダの "CREATE PROCEDURE" 構文の使い方を知らなくても、ストアド プロシージャを作成できます。

Procedure オブジェクトのプロパティを使用すると、次のことができます。

  • Name プロパティで、プロシージャを識別します。

  • Command プロパティで、プロシージャの作成または実行に使用できる ADO の Command オブジェクトを指定します。

  • DateCreated および DateModified プロパティは、日付情報を返します。


Table オブジェクト (ADOX)

Table オブジェクト

列、インデックス、およびキーを含むデータベース テーブルを表します。

解説

次のコードは、新規 Table を作成します。

Dim obj As New Table

Table オブジェクトのプロパティおよびコレクションを使用すると、次のことができます。

  • Name プロパティで、テーブルを識別します。

  • Type プロパティで、テーブルの種類を決定します。

  • Columns コレクションで、データベースのテーブルの列にアクセスします。

  • Indexes コレクションで、テーブルのインデックスにアクセスします。

  • Keys コレクションで、テーブルのキーにアクセスします。

  • ParentCatalog プロパティで、テーブルを所有する Catalog を指定します。

  • DateCreated および DateModified プロパティで、日付情報を返します。

  • Properties コレクションで、プロバイダに固有のテーブル プロパティにアクセスします。

    注意 Table オブジェクトのプロパティによっては、データ プロバイダがサポートしていないことがあります。プロバイダがサポートしていないプロパティの値を設定した場合、エラーが発生します。新規 Table オブジェクトについては、オブジェクトがコレクションに追加されたときにエラーが発生します。既存のオブジェクトについては、プロパティの設定時にエラーが発生します。

    Table オブジェクトの作成時、オプションのプロパティに対する適切な既定値が存在していても、プロバイダがプロパティをサポートしているとは限りません。プロバイダによってサポートされているプロパティについては、利用するプロバイダのマニュアルを参照してください。


User オブジェクト (ADOX)

User オブジェクト

保護されているデータベースのへのアクセス権を持つユーザー アカウントを表します。

解説

Catalog の Users コレクションは、カタログのすべてのユーザーを表します。Group の Users コレクションは、特定のグループのユーザーのみを表します。

User オブジェクトのプロパティ、コレクション、およびメソッドを使用すると、次のことができます。

  • Name プロパティで、名前を識別します。

  • ChangePassword メソッドで、ユーザーのパスワードを変更します。

  • GetPermissions および SetPermissions メソッドで、ユーザーに読み取り、書き込み、または削除の権限があるかどうかを決定します。

  • Groups コレクションで、ユーザーが属するグループにアクセスします。


View オブジェクト (ADOX)

View オブジェクト

抽出されたレコードのセットまたは仮想テーブルを表します。ADO の Command オブジェクトと連動して使用すると、View オブジェクトはビューの追加、削除、または修正に使用できます。

解説

ビューは、ほかのデータベース テーブルまたはビューから作成された仮想テーブルです。View オブジェクトによって、プロバイダの "CREATE VIEW" 構文の使い方を知らなくても、ビューを作成できます。

View オブジェクトのプロパティを使用すると、次のことができます。

  • Name プロパティで、ビューを識別します。

  • Command プロパティで、ビューの追加、削除、または修正に使用できる ADO の Command オブジェクトを指定します。

  • DateCreated および DateModified プロパティで、日付情報を返します。


ADOX コレクション

ADOX コレクションの概要

コレクション | 説明
Columns | テーブル、インデックス、またはキーのすべての Column オブジェクトを含みます。
Groups | カタログまたはユーザーのすべての格納された Group オブジェクトを含みます。
Indexes | テーブルのすべての Index オブジェクトを含みます。
Keys | テーブルのすべての Key オブジェクトを含みます。
Procedures | カタログのすべての Procedure オブジェクトを含みます。
Tables | カタログのすべての Table オブジェクトを含みます。
Users | カタログまたはグループのすべての格納された User オブジェクトを含みます。
Views | カタログのすべての View オブジェクトを含みます。


Columns コレクション (ADOX)

Columns コレクション

テーブル、インデックス、またはキーのすべての Column オブジェクトを含みます。

解説

Columns コレクションの Append メソッドは、ADOX 独自のものです。次のことができます。

  • Append メソッドで、コレクションに新規に列を追加します。

その他のプロパティおよびメソッドは、ADO コレクションで標準的なものです。次のことができます。

  • Item プロパティで、コレクションの列にアクセスします。

  • Count プロパティで、コレクションに含まれる列の数を返します。

  • Delete メソッドで、コレクションから列を削除します。

  • Refresh メソッドで、コレクションのオブジェクトを更新して、現在のデータベースのスキーマを反映します。

    注意 Column を Index の Columns コレクションに追加するときに、Tables コレクションに既に追加された Table にまだ Column が存在していない場合は、エラーが発生します。


Groups コレクション (ADOX)

Groups コレクション

カタログまたはユーザーのすべての格納された Group オブジェクトを含みます。

解説

Catalog の Groups コレクションは、カタログのすべてのグループ アカウントを表します。User の Groups コレクションは、ユーザーが属するグループのみを表します。

Groups コレクションの Append メソッドは、ADOX 独自のものです。次のことができます。

  • Append メソッドで、コレクションに新規セキュリティ グループを追加します。

その他のプロパティおよびメソッドは、ADO コレクションで標準的なものです。次のことができます。

  • Item プロパティで、コレクションのグループにアクセスします。

  • Count プロパティで、コレクションに含まれるグループの数を返します。

  • Delete メソッドで、コレクションからグループを削除します。

  • Refresh メソッドで、コレクションのオブジェクトを更新して、現在のデータベースのスキーマを反映します。

    注意 Group オブジェクトを User オブジェクトの Groups コレクションに追加する前に、追加するものと同じ Name を持つ Group オブジェクトが、あらかじめ Catalog の Groups コレクションに存在している必要があります。


Indexes コレクション (ADOX)

Indexes コレクション

テーブルのすべての Index オブジェクトを含みます。

解説

Indexes コレクションの Append メソッドは、ADOX 独自のものです。次のことができます。

  • Append メソッドで、コレクションに新規にインデックスを追加します。

その他のプロパティおよびメソッドは、ADO コレクションで標準的なものです。次のことができます。

  • Item プロパティで、コレクションのインデックスにアクセスします。

  • Count プロパティで、コレクションに含まれるインデックスの数を返します。

  • Delete メソッドで、コレクションからインデックスを削除します。

  • Refresh メソッドで、コレクションのオブジェクトを更新して、現在のデータベースのスキーマを反映します。


Keys コレクション (ADOX)

Keys コレクション

テーブルのすべての Key オブジェクトを含みます。

解説

Keys コレクションの Append メソッドは、ADOX 独自のものです。次のことができます。

  • Append メソッドで、コレクションに新規にキーを追加します。

その他のプロパティおよびメソッドは、ADO コレクションで標準的なものです。次のことができます。

  • Item プロパティで、コレクションのキーにアクセスします。

  • Count プロパティで、コレクションに含まれるキーの数を返します。

  • Delete メソッドで、コレクションからキーを削除します。

  • Refresh メソッドで、コレクションのオブジェクトを更新して、現在のデータベースのスキーマを反映します。


Procedures コレクション (ADOX)

Procedures コレクション

カタログのすべての Procedure オブジェクトを含みます。

解説

Procedures コレクションの Append メソッドは、ADOX 独自のものです。次のことができます。

  • Append メソッドで、コレクションに新規にプロシージャを追加します。

その他のプロパティおよびメソッドは、ADO コレクションで標準的なものです。次のことができます。

  • Item プロパティで、コレクションのプロシージャにアクセスします。

  • Count プロパティで、コレクションに含まれるプロシージャの数を返します。

  • Delete メソッドで、コレクションからプロシージャを削除します。

  • Refresh メソッドで、コレクションのオブジェクトを更新して、現在のデータベースのスキーマを反映します。


Tables コレクション (ADOX)

Tables コレクション

カタログのすべての Table オブジェクトを含みます。

解説

Tables コレクションの Append メソッドは、ADOX 独自のものです。次のことができます。

  • Append メソッドで、コレクションに新規にテーブルを追加します。

その他のプロパティおよびメソッドは、ADO コレクションで標準的なものです。次のことができます。

  • Item プロパティで、コレクションのテーブルにアクセスします。

  • Count プロパティで、コレクションに含まれるテーブルの数を返します。

  • Delete メソッドで、コレクションからテーブルを削除します。

  • Refresh メソッドで、コレクションのオブジェクトを更新して、現在のデータベースのスキーマを反映します。

プロバイダによっては、Tables コレクションの View などのその他のスキーマ オブジェクトを返すものもあります。したがって、複数の ADOX コレクションに同じオブジェクトへの参照が含まれることがあります。オブジェクトを 1 つのコレクションから削除すると、Refresh メソッドがコレクション上で呼び出されるまで、その変更は削除されたオブジェクトを参照するほかのコレクションでは表示されません。たとえば、OLE DB Provider for Microsoft Jet では、ビューは Tables コレクションと一緒に返されます。View を削除した場合、コレクションに変更を反映するには Tables コレクションを更新する必要があります。


Users コレクション (ADOX)

Users コレクション

カタログまたはグループのすべての格納された User オブジェクトを含みます。

解説

Catalog の Users コレクションは、すべてのカタログのユーザーを表します。Group の Users コレクションは、特定のグループのメンバシップを持つユーザーのみを表します。

Users コレクションの Append メソッドは、ADOX 独自のものです。次のことができます。

  • Append メソッドで、コレクションに新規にユーザーを追加します。

その他のプロパティおよびメソッドは、ADO コレクションで標準的なものです。次のことができます。

  • Item プロパティで、コレクションのユーザーにアクセスします。

  • Count プロパティで、コレクションに含まれるユーザーの数を返します。

  • Delete メソッドで、コレクションからユーザーを削除します。

  • Refresh メソッドで、コレクションのオブジェクトを更新して、現在のデータベースのスキーマを反映します。

    注意 User オブジェクトを Group オブジェクトの Users コレクションに追加する前に、追加するものと同じ Name を持つ User オブジェクトが、あらかじめ Catalog の Users コレクションに存在している必要があります。


Views コレクション (ADOX)

Views コレクション

カタログのすべての View オブジェクトを含みます。

解説

Views コレクションの Append メソッドは、ADOX 独自のものです。次のことができます。

  • Append メソッドで、コレクションに新規にビューを追加します。

その他のプロパティおよびメソッドは、ADO コレクションで標準的なものです。次のことができます。

  • Item プロパティで、コレクションのビューにアクセスします。

  • Count プロパティで、コレクションに含まれるビューの数を返します。

  • Delete メソッドで、コレクションからビューを削除します。

  • Refresh メソッドで、コレクションのオブジェクトを更新して、現在のデータベースのスキーマを反映します。


ADOX プロパティ

ADOX プロパティの概要

プロパティ | 説明
ActiveConnection | カタログが属する ADO の Connection オブジェクトを示します。
Attributes | 列の属性を表します。
Clustered | インデックスがクラスタ化しているかどうかを示します。
Command | プロシージャの作成または実行に使用できる ADO の Command オブジェクトを指定します。
Count | コレクション内のオブジェクト数を示します。
DateCreated | オブジェクトが作成された日付を示します。
DateModified | オブジェクトが最後に修正された日付を示します。
DefinedSize | 列の指定された最大サイズを示します。
DeleteRule | 主キーが削除されたときに実行される動作を示します。
IndexNulls | インデックス フィールドの Null 値を持つレコードがインデックスへのエントリを持つかどうかを示します。
Name | オブジェクトの名前を示します。
NumericScale | 列中の数値型 (Numeric) の値の小数点以下の桁数を示します。
ParentCatalog | プロバイダに固有のプロパティへのアクセスを提供するために、テーブルまたは列の親カタログを指定します。
Precision | 列中のデータ値の最大有効桁数を示します。
PrimaryKey | インデックスがテーブルの主キーを表しているかどうかを示します。
RelatedColumn | 連結テーブルにある連結する列の名前を示します (キー列のみ)。
RelatedTable | 連結するテーブルの名前を示します。
SortOrder | 列のソート順を示します (インデックス列のみ)。
Type (Column) | 列のデータ型を示します。
Type (Key) | キーのデータ型を示します。
Type (Table) | テーブルの種類を示します。
Unique | インデックス キーが一意であるべきかどうかを示します。
UpdateRule | 主キーが更新されたときに実行される動作を示します。


ActiveConnection プロパティ (ADOX)

ActiveConnection プロパティ

Catalog が属する ADO の Connection オブジェクトを示します。

設定値と戻り値

Connection オブジェクト、または接続の定義を持つ文字列型 (String) を設定します。アクティブな Connection オブジェクトを返します。

解説

既定値は、Null オブジェクトへの参照です。


Attributes プロパティ (ADOX)

Attributes プロパティ

列の属性を表します。

設定値と戻り値

長整数型 (Long) の値を設定します。また、値の取得も可能です。値は、Column オブジェクトによって表されたテーブルの属性を指定し、ColumnAttributesEnum 定数と組み合わせることができます。既定値は 0 です。adColFixed でも adColNullable でもありません。


Clustered プロパティ (ADOX)

Clustered プロパティ

インデックスがクラスタ化しているかどうかを示します。

設定値と戻り値

ブール型 (Boolean) の値を設定します。また、値の取得も可能です。

解説

既定値は、False です。

このプロパティは、既にコレクションに追加された Index オブジェクトでは読み取り専用です。


Command プロパティ (ADOX)

Command プロパティ

プロシージャの作成または実行に使用できる ADO の Command オブジェクトを指定します。

設定値と戻り値

有効な ADO の Command オブジェクトを設定します。また、値の取得も可能です。

解説

プロバイダが永続的なコマンドをサポートしていない場合は、このプロパティを呼び出して設定するときにエラーが発生します。


DateCreated プロパティ (ADOX)

DateCreated プロパティ

オブジェクトが作成された日付を示します。

戻り値

作成された日付を示すバリアント型 (Variant) の値を返します。DateCreated がプロバイダでサポートされていない場合は、値は Null です。

解説

新しく追加されたオブジェクトの DateCreated プロパティは Null です。新しい View または Procedure を追加した後、Views または Procedures コレクションの Refresh メソッドを呼び出して、DateCreated プロパティの値を取得する必要があります。


DateModified プロパティ (ADOX)

DateModified プロパティ

オブジェクトが最後に修正された日付を示します。

戻り値

修正された日付を示すバリアント型 (Variant) の値を返します。DateModified がプロバイダでサポートされていない場合は、値は Null です。

解説

新しく追加されたオブジェクトの DateModified プロパティは Null です。新しい View または Procedure を追加した後、Views または Procedures コレクションの Refresh メソッドを呼び出して、DateModified プロパティの値を取得する必要があります。


DefinedSize プロパティ (ADOX)

DefinedSize プロパティ

列の一定の最大サイズを示します。

設定値と戻り値

データ値の最大長を長整数型 (Long) の値で設定します。また、値の取得も可能です。

解説

既定値は、0 です。

このプロパティは、既にコレクションに追加された Column オブジェクトでは読み取り専用です。


DeleteRule プロパティ (ADOX)

DeleteRule プロパティ

主キーが削除されたときに実行される動作を示します。

設定値と戻り値

RuleEnum 定数の 1 つである長整数型 (Long) の値を設定します。また、値の取得も可能です。既定値は、adRINone です。

解説

このプロパティは、既にコレクションに追加された Key オブジェクトでは読み取り専用です。


IndexNulls プロパティ (ADOX)

IndexNulls プロパティ

インデックス フィールドの Null 値を持つレコードがインデックスへのエントリを持つかどうかを示します。

設定値と戻り値

AllowNullsEnum 値を設定します。また、値の取得も可能です。既定値は、adIndexNullsDisallow です。

解説

このプロパティは、既にコレクションに追加された Index オブジェクトでは読み取り専用です。


Name プロパティ (ADOX)

Name プロパティ

オブジェクトの名前を示します。

設定値と戻り値

文字列型 (String) の値を設定します。また、値の取得も可能です。

解説

名前は、コレクション内で一意である必要はありません。

Name プロパティは、Column、Group、Key、Index、Table、および User オブジェクトでは読み取り/書き込み可能です。Name プロパティは、Catalog、Procedure、および View オブジェクトでは読み取り専用です。

読み取り/書き込みオブジェクト (Column、Group、Key、Index、Table、および User オブジェクト) では、既定値は空文字列 ("") です。

注意

  • キーの場合、このプロパティは、既にコレクションに追加された Key オブジェクトでは読み取り専用です。

  • テーブルの場合、このプロパティは、既にコレクションに追加された Table オブジェクトでは読み取り専用です。


NumericScale プロパティ (ADOX)

NumericScale プロパティ

列中の数値型 (Numeric) の値の小数点以下の桁数を示します。

設定値と戻り値

Type プロパティが adNumeric または adDecimal の場合、列中のデータ値の小数点以下の桁数をバイト型 (Byte) の値で設定します。また、値の取得も可能です。その他のすべてのデータ値では、NumericScale は無視されます。

解説

既定値は、0 です。

NumericScale は、既にコレクションに追加された Column オブジェクトでは読み取り専用です。


ParentCatalog プロパティ (ADOX)

ParentCatalog プロパティ

プロバイダに固有のプロパティへのアクセスを提供するために、テーブルまたは列の親カタログを指定します。

設定値と戻り値

Catalog オブジェクトを設定します。また、値の取得も可能です。ParentCatalog に開かれた Catalog を設定すると、テーブルまたは列を Catalog コレクションに追加するより前に、プロバイダに固有のプロパティにアクセスすることができます。

解説

いくつかのデータ プロバイダでは、作成時 (テーブルまたは列がその Catalog コレクションに追加されるとき) にのみ、プロバイダに固有のプロパティの値を書き込むことができます。Catalog にこれらのオブジェクトが追加される前にこれらのプロパティにアクセスするには、まず、ParentCatalog プロパティの Catalog を指定します。

テーブルまたは列を ParentCatalog とは異なる Catalog に追加すると、エラーが発生します。


Precision プロパティ (ADOX)

Precision プロパティ

列中のデータ値の最大有効桁数を示します。

設定値と戻り値

Type プロパティが数値型の場合、列中のデータ値の最大有効桁数を長整数型 (Long) の値で設定します。また、値の取得も可能です。その他のデータ型では、Precision は無視されます。

解説

既定値は、0 です。

このプロパティは、既にコレクションに追加された Column オブジェクトでは読み取り専用です。


PrimaryKey プロパティ (ADOX)

PrimaryKey プロパティ

インデックスがテーブルの主キーを表しているかどうかを示します。

設定値と戻り値

ブール型 (Boolean) の値を設定および返します。

解説

既定値は、False です。

このプロパティは、既にコレクションに追加された Index オブジェクトでは読み取り専用です。


RelatedColumn プロパティ (ADOX)

RelatedColumn プロパティ

連結テーブルにある連結する列の名前を示します (キー列のみ)。

設定値と戻り値

連結テーブルにある連結する列の名前を文字列型 (String) の値で設定します。また、値の取得も可能です。

解説

既定値は、空文字列 ("") です。

このプロパティは、既にコレクションに追加された Column オブジェクトでは読み取り専用です。


RelatedTable プロパティ (ADOX)

RelatedTable プロパティ

連結するテーブルの名前を示します。

設定値と戻り値

文字列型 (String) の値を設定します。また、値の取得も可能です。

解説

既定値は、空文字列 ("") です。

キーが外部キーの場合は、RelatedTable はそのキーを持つテーブルの名前になります。


SortOrder プロパティ (ADOX)

SortOrder プロパティ

列のソート順を示します (インデックス列のみ)。

設定値と戻り値

SortOrderEnum 定数の 1 つである長整数型 (Long) の値を設定します。また、値の取得も可能です。既定値は、adSortAscending です。

解説

このプロパティは、Index の Columns コレクションにある Column オブジェクトにのみ適用されます。


Type プロパティ (Column) (ADOX)

Type プロパティ (Column)

列のデータ型を示します。

設定値と戻り値

DataTypeEnum 定数の 1 つである長整数型 (Long) の値を設定します。また、値の取得も可能です。既定値は、adVarWChar です。

解説

このプロパティは、Column オブジェクトがコレクションまたはほかのオブジェクトに追加されるまでは、読み取り/書き込み可能です。追加された後は、読み取り専用になります。


Type プロパティ (Key) (ADOX)

Type プロパティ (Key)

キーの種類を示します。

設定値と戻り値

KeyTypeEnum 定数の 1 つである長整数型 (Long) の値を設定します。また、値の取得も可能です。既定値は、adKeyPrimary です。

解説

このプロパティは、既にコレクションに追加された Key オブジェクトでは読み取り専用です。


Type プロパティ (Table) (ADOX)

Type プロパティ (Table)

テーブルの種類を示します。

戻り値

テーブルの種類を指定する文字列型 (String) の値を返します。たとえば、"TABLE"、"SYSTEM TABLE"、"GLOBAL TEMPORARY" などです。

解説

このプロパティは読み取り専用です。


Unique プロパティ (ADOX)

Unique プロパティ

インデックス キーが一意であるべきかどうかを示します。

設定値と戻り値

ブール型 (Boolean) の値を設定および返します。

解説

既定値は、False です。

このプロパティは、既にコレクションに追加された Index オブジェクトでは読み取り専用です。


UpdateRule プロパティ (ADOX)

UpdateRule プロパティ

主キーが更新されたときに実行される動作を示します。

設定値と戻り値

RuleEnum 定数の 1 つである長整数型 (Long) の値を設定します。また、値の取得も可能です。既定値は、adRINone です。

解説

このプロパティは、既にコレクションに追加された Key オブジェクトでは読み取り専用です。


ADOX メソッド

ADOX メソッドの概要

メソッド | 説明
Append (Columns) | 新規 Column オブジェクトを Columns コレクションに追加します。
Append (Groups) | 新規 Group オブジェクトを Groups コレクションに追加します。
Append (Indexes) | 新規 Index オブジェクトを Indexes コレクションに追加します。
Append (Keys) | 新規 Key オブジェクトを Keys コレクションに追加します。
Append (Procedures) | 新規 Procedure オブジェクトを Procedures コレクションに追加します。
Append (Tables) | 新規 Table オブジェクトを Tables コレクションに追加します。
Append (Users) | 新規 User オブジェクトを Users コレクションに追加します。
Append (Views) | 新規 View オブジェクトを Views コレクションに追加します。
ChangePassword | ユーザー アカウントのパスワードを変更します。
Create | 新規カタログを作成します。
Delete | コレクションからオブジェクトを削除します。
GetObjectOwner | カタログ内のオブジェクトの所有者を返します。
GetPermissions | グループまたはユーザーのオブジェクトに対する権限を返します。
Refresh | コレクションのオブジェクトを更新して、プロバイダから使用可能な、またはプロバイダに固有のオブジェクトを反映させます。
SetObjectOwner | カタログ内のオブジェクトの所有者を指定します。
SetPermissions | グループまたはユーザーにオブジェクトに対する権限を指定します。


Append メソッド (ADOX Columns)

Append メソッド (Columns)

新規 Column オブジェクトを Columns コレクションに追加します。

構文

Columns.Append Column [, Type] [, DefinedSize]

パラメータ

Column 追加する Column オブジェクトを指定します。または、新たに作成し追加する列の名前を指定します。

Type 省略可能です。列のデータ型を指定する長整数型 (Long) の値を指定します。この Type パラメータは、Column オブジェクトの Type プロパティに対応します。

DefinedSize 省略可能です。列のサイズを指定する長整数型 (Long) の値を指定します。この DefinedSize パラメータは、Column オブジェクトの DefinedSize プロパティに対応します。

注意 Column を Index の Columns コレクションに追加するときに、Tables コレクションに追加されている Table にまだ Column が存在していない場合、エラーが発生します。


Append メソッド (ADOX Groups)

Append メソッド (Groups)

新規 Group オブジェクトを Groups コレクションに追加します。

構文

Groups.Append Group

パラメータ

Group 追加する Group オブジェクトを指定します。または、新たに作成し追加するグループの名前を指定します。

解説

Catalog の Groups コレクションは、カタログのすべてのグループ アカウントを表します。User の Groups コレクションは、ユーザーが属するグループのみを表します。

プロバイダがグループの作成をサポートしていない場合は、エラーが発生します。

注意 Group オブジェクトを User オブジェクトの Groups コレクションに追加する前に、追加するものと同じ Name を持つ Group オブジェクトが、あらかじめ Catalog の Groups コレクションに存在している必要があります。


Append メソッド (ADOX Indexes)

Append メソッド (Indexes)

新規 Index オブジェクトを Indexes コレクションに追加します。

構文

Indexes.Append Index [, Columns]

パラメータ

Index 追加する Index オブジェクトを指定します。または、新たに作成し追加するインデックスの名前を指定します。

Columns 省略可能です。インデックスが作成される列の名前を指定するバリアント型 (Variant) の値を指定します。この Columns パラメータは、1 つまたは複数の Column オブジェクトの Name プロパティの値に対応します。

解説

Columns パラメータは、列の名前または列の名前の配列をとります。

プロバイダがインデックスの作成をサポートしていない場合は、エラーが発生します。


Append メソッド (ADOX Keys)

Append メソッド (Keys)

新規 Key オブジェクトを Keys コレクションに追加します。

構文

Keys.Append Key [, KeyType] [, Column] [, RelatedTable] [, RelatedColumn]

パラメータ

Key 追加する Key オブジェクトを指定します。または、新たに作成し追加するキーの名前を指定します。

KeyType 省略可能です。キーの種類を指定する長整数型 (Long) の値を指定します。この Key パラメータは、Key オブジェクトの Type プロパティに対応します。

Column 省略可能です。インデックスが作成される列の名前を指定する文字列型 (String) の値を指定します。この Columns パラメータは、Column オブジェクトの Name プロパティの値に対応します。

RelatedTable 省略可能です。連結するテーブルの名前を指定する文字列型 (String) の値を指定します。この RelatedTable パラメータは、Table オブジェクトの Name プロパティの値に対応します。

RelatedColumn 省略可能です。外部キーの関連する列の名前を指定する文字列型 (String) の値を指定します。この RelatedColumn パラメータは、Column オブジェクトの Name プロパティの値に対応します。

解説

Columns パラメータは、列の名前または列の名前の配列をとります。


Append メソッド (ADOX Procedures)

Append メソッド (Procedures)

新規 Procedure オブジェクトを Procedures コレクションに追加します。

構文

Procedures.Append Name, Command

パラメータ

Name 作成し追加するプロシージャの名前を指定する文字列型 (String) の値を指定します。

Command 作成し追加するプロシージャを表す ADO の Command オブジェクトを指定します。

解説

Command オブジェクトで指定された名前および属性を持つデータ ソースに新規プロシージャを作成します。

ユーザーの指定したコマンド テキストがプロシージャではなくビューを表す場合、動作は使用しているプロバイダによって異なります。プロバイダが永続的なコマンドをサポートしていない場合、Append は失敗します。

注意: OLE DB Provider for Microsoft Jet を使用しているとき、Procedures コレクションの Append メソッドによって Procedure ではなく View を Command パラメータに指定することができます。View がデータ ソースに追加され、Procedures コレクションに追加されます。Append の後、Procedures と Views コレクションが更新された場合、View は Procedures コレクション内に存在しなくなり、Views コレクションに表示されます。


Append メソッド (ADOX Tables)

Append メソッド (Tables)

新規 Table オブジェクトを Tables コレクションに追加します。

構文

Tables.Append Table

パラメータ

Table 追加する Table への参照を示すバリアント型 (Variant) の値、または作成し追加するテーブルの名前を指定します。

解説

プロバイダがテーブルの作成をサポートしていない場合は、エラーが発生します。


Append メソッド (ADOX Users)

Append メソッド (Users)

新規 User オブジェクトを Users コレクションに追加します。

構文

Users.Append User [, Password]

パラメータ

User 追加する User オブジェクトを持つバリアント型 (Variant) の値、または作成し追加するユーザーの名前を指定します。

Password 省略可能です。ユーザーのパスワードを持つ文字列型 (String) の値を指定します。この Password パラメータは、User オブジェクトの ChangePassword メソッドで指定された値に対応します。

解説

Catalog の Users コレクションは、カタログのすべてのユーザーを表します。Group の Users コレクションは、特定のグループのメンバシップを持つメンバのみを表します。

プロバイダがユーザーの作成をサポートしていない場合は、エラーが発生します。

注意 User オブジェクトを Group オブジェクトの Users コレクションに追加する前に、追加するものと同じ Name を持つ User オブジェクトが、あらかじめ Catalog の Users コレクションに存在している必要があります。


Append メソッド (ADOX Views)

Append メソッド (Views)

新規 View オブジェクトを作成して Views コレクションに追加します。

構文

Views.Append Name, Command

パラメータ

Name 作成するビューの名前を指定する文字列型 (String) の値を指定します。

Command 作成するビューを表す ADO の Command オブジェクトを指定します。

解説

Command オブジェクトで指定された名前および属性を持つデータ ソースに新規ビューを作成します。

ユーザーの指定したコマンド テキストがビューではなくプロシージャを表す場合、動作は使用しているプロバイダによって異なります。プロバイダが永続的なコマンドをサポートしていない場合は、Append は失敗します。

注意: OLE DB Provider for Microsoft Jet を使用しているとき、Views コレクションの Append メソッドによって View ではなく Procedure を Command パラメータに指定することができます。Procedure がデータ ソースに追加され、Views コレクションに追加されます。Append の後、Procedures と Views コレクションが更新された場合、Procedure は Views コレクション内に存在しなくなり、Procedures コレクションに表示されます。


ChangePassword メソッド (ADOX)

ChangePassword メソッド

ユーザー アカウントのパスワードを変更します。

構文

User.ChangePassword OldPassword, NewPassword

パラメータ

OldPassword ユーザーが既に持っているパスワードを指定する文字列型 (String) の値を指定します。ユーザーが現在パスワードを持っていない場合は、OldPassword に空文字列 ("") を使用してください。

NewPassword 新規パスワードを指定する文字列型 (String) の値を指定します。

解説

セキュリティ上の理由から、新規パスワードに加え、古いパスワードを指定する必要があります。

プロバイダがトラスティ プロパティの管理をサポートしていない場合は、エラーが発生します。


Create メソッド (ADOX)

Create メソッド

新規カタログを作成します。

構文

Catalog.Create ConnectString

パラメータ

ConnectString データ ソースとの接続に使用される文字列型 (String) の値を指定します。

解説

Create メソッドは、接続文字列で指定したデータ ソースへの新規 ADO Connection を作成し開きます。成功すれば、新規 Connection オブジェクトが ActiveConnection プロパティに割り当てられます。

プロバイダが新規カタログの作成をサポートしていない場合は、エラーが発生します。


Delete メソッド (ADOX Collections)

Delete メソッド (Collections)

コレクションからオブジェクトを削除します。

構文

Collection.Delete Name

パラメータ

Name 削除するオブジェクトの名前または位置 (インデックス) を指定するバリアント型 (Variant) を指定します。

解説

コレクションに Name が存在していない場合は、エラーが発生します。

Tables および Users コレクションでは、プロバイダがテーブルやユーザーの削除をサポートしていない場合は、それぞれエラーが発生します。Procedures および Views コレクションでは、プロバイダが永続的なコマンドをサポートしていない場合、Delete は失敗します。


GetObjectOwner メソッド (ADOX)

GetObjectOwner メソッド

Catalog 内のオブジェクトの所有者を返します。

構文

Owner = Catalog.GetObjectOwner(ObjectName, ObjectType [, ObjectTypeId])

戻り値

オブジェクトを所有する User または Group の Name を示す文字列型 (String) の値を返します。

パラメータ

ObjectName 所有者を取得するオブジェクトの名前を指定する文字列型 (String) の値を指定します。

ObjectType 所有者を取得するオブジェクトの種類を指定する、ObjectTypeEnum 定数の 1 つである長整数型 (Long) の値を指定します。

ObjectTypeId 省略可能です。OLE DB 仕様によって定義されていないプロバイダ オブジェクト タイプの GUID を指定するバリアント型 (Variant) の値を指定します。このパラメータは、ObjectType が adPermObjProviderSpecific に設定されている場合に必要です。その他の場合は、使用されません。

解説

プロバイダがオブジェクトの所有者を返すことをサポートしていない場合は、エラーが発生します。


GetPermissions メソッド (ADOX)

GetPermissions メソッド

グループまたはユーザーのオブジェクトまたはオブジェクト コンテナの権限を返します。

構文

ReturnValue = GroupOrUser.GetPermissions(Name, ObjectType
[, ObjectTypeId])

戻り値

グループまたはユーザーがそのオブジェクトに持つ権限を含むビットマスクを指定する長整数型 (Long) の値を返します。この値は、1 つまたは複数の RightsEnum 定数です。

パラメータ

Name 権限を設定するオブジェクトの名前を指定するバリアント型 (Variant ) の値を指定します。オブジェクト コンテナの権限を取得する場合は、Name に Null 値を設定します。

ObjectType 権限を取得するオブジェクトの種類を指定する、ObjectTypeEnum 定数の 1 つである長整数型 (Long) の値を指定します。

ObjectTypeId 省略可能です。OLE DB 仕様によって定義されていないプロバイダ オブジェクト タイプの GUID を指定するバリアント型 (Variant) の値を指定します。このパラメータは、ObjectType が adPermObjProviderSpecific に設定されている場合に必要です。その他の場合は、使用されません。


SetObjectOwner メソッド (ADOX)

SetObjectOwner メソッド

Catalog 内のオブジェクトの所有者を指定します。

構文

Catalog.SetObjectOwner ObjectName, ObjectType , OwnerName [, ObjectTypeId]

パラメータ

ObjectName 所有者を指定するオブジェクトの名前を指定する文字列型 (String) の値を指定します。

ObjectType 所有者の種類を指定する、ObjectTypeEnum 定数の 1 つである長整数型 (Long) の値を指定します。

OwnerName オブジェクトを所有する User または Group の Name を指定する文字列型 (String) の値を指定します。

ObjectTypeId 省略可能です。OLE DB 仕様によって定義されていないプロバイダ オブジェクト タイプの GUID を指定するバリアント型 (Variant) の値を指定します。このパラメータは、ObjectType が adPermObjProviderSpecific に設定されている場合に必要です。その他の場合は、使用されません。

解説

プロバイダがオブジェクトの所有者の指定をサポートしていない場合は、エラーが発生します。


SetPermissions メソッド (ADOX)

SetPermissions メソッド

グループまたはユーザーにオブジェクトに対する権限を指定します。

構文

GroupOrUser.SetPermissions Name, ObjectType, Action, Rights [, Inherit]
[, ObjectTypeId]

パラメータ

Name 権限を設定するオブジェクトの名前を指定する文字列型 (String) の値を指定します。

ObjectType 権限を設定するオブジェクトの種類を指定する ObjectTypeEnum 定数の 1 つである長整数型 (Long) の値を指定します。

Action 権限を設定するときに実行されるアクションの種類を指定する ActionEnum 定数の 1 つである長整数型 (Long) の値を指定します。

Rights 設定する権限を示す RightsEnum 定数の 1 つまたは複数のビットマスクである長整数型 (Long) の値を指定します。

Inherit 省略可能です。オブジェクトがこれらの権限をどのように継承するかを指定する、InheritTypeEnum 定数の 1 つである長整数型 (Long) の値を指定します。既定値は adInheritNone です。

ObjectTypeId 省略可能です。OLE DB 仕様によって定義されていないプロバイダ オブジェクトの種類の GUID を指定するバリアント型 (Variant) の値を指定します。このパラメータは、ObjectType が adPermObjProviderSpecific に設定されている場合に必要です。その他の場合は、使用されません。

解説

プロバイダがグループまたはユーザーのアクセス権の設定をサポートしていない場合は、エラーが発生します。

注意 SetPermissions を呼び出すとき、Actions に adAccessRevoke を設定すると、Rights パラメータのすべての設定が無効になります。

Rights パラメータに指定した権限を有効にする場合は、Actions に adAccessRevoke を設定しないでください。


ADOX 列挙定数

ここでは、デバッグ用に各定数の実際の値の一覧を示します。ただし、この値は参考用のものであり、ADOX のリリースごとに変更されることがあります。コードを記述するときは、列挙定数の実際の値ではなく、名前のみを使って記述する必要があります。

次の列挙定数が定義されています。

列挙定数 | 説明
ActionEnum | SetPermissions の呼び出し時に実行されるアクションの種類を指定します。
AllowNullsEnum | Null 値を含むレコードにインデックスを付けるかどうかを指定します。
ColumnAttributesEnum | Column の属性を指定します。
DataTypeEnum | Field、Parameter、または Property のデータ型を指定します。
InheritTypeEnum | SetPermissions で設定された権限のオブジェクトによる継承方法を指定します。
KeyTypeEnum | Key の種類として、主、外部、一意のいずれかを指定します。
ObjectTypeEnum | 権限または所有権を設定するデータベース オブジェクトの種類を指定します。
RightsEnum | グループまたはユーザーのオブジェクトに対する権限を指定します。
RuleEnum | Key が削除されたときに従うルールを指定します。
SortOrderEnum | インデックスを持つ列のソート順序を指定します。


ActionEnum

SetPermissions の呼び出し時に実行されるアクションの種類を示します。

定数 | 値 | 説明
adAccessDeny | 3 | グループまたはユーザーは、指定した権限を拒否されます。
adAccessGrant | 1 | グループまたはユーザーは、少なくとも要求した権限を持ちます。
adAccessRevoke | 4 | グループまたはユーザーの持つすべての明示的なアクセス権は取り消されます。
adAccessSet | 2 | グループまたはユーザーは、要求された権限を持ちます。


AllowNullsEnum

Null 値を含むレコードにインデックスを付けるかどうかを示します。

定数 | 値 | 説明
adIndexNullsAllow | 0 | インデックスは、キー列が Null となっているエントリを許します。Null 値がキー列に入力された場合、エントリがインデックスに挿入されます。
adIndexNullsDisallow | 1 | 既定値です。インデックスは、キー列が Null 値のエントリを許可しません。Null 値がキー列に入力された場合、エラーが発生します。
adIndexNullsIgnore | 2 | インデックスは、Null 値のキーを含むエントリを挿入しません。Null 値がキー列に入力された場合、エントリは無視され、エラーは発生しません。
adIndexNullsIgnoreAny | 4 | インデックスは、キー列が Null 値を持つエントリを挿入しません。複数列キーを持つインデックスでは、Null 値が入力された列がある場合、エントリは無視され、エラーは発生しません。


ColumnAttributesEnum

Column の属性を示します。

定数 | 値 | 説明
adColFixed | 1 | 列は、固定長です。
adColNullable | 2 | 列は、Null 値を持つことができます。


InheritTypeEnum

SetPermissions で設定された権限のオブジェクトによる継承方法を示します。

定数 | 値 | 説明
adInheritBoth | 3 | 主オブジェクトに含まれるオブジェクトおよびその他のコンテナは、エントリを継承します。
adInheritContainers | 2 | 主オブジェクトに含まれるその他のコンテナは、エントリを継承します。
adInheritNone | 0 | 既定値です。継承しません。
adInheritNoPropagate | 4 | adInheritObjects および adInheritContainers フラグは、継承されたエントリに伝えられません。
adInheritObjects | 1 | コンテナ内の、コンテナでないオブジェクトは、権限を継承します。


KeyTypeEnum

Key の種類として、主、外部、一意のいずれかを示します。

定数 | 値 | 説明
adKeyPrimary | 1 | 既定値です。キーは、主キーです。
adKeyForeign | 2 | キーは、外部キーです。
adKeyUnique | 3 | キーは、一意です。


ObjectTypeEnum

権限または所有権を設定するデータベース オブジェクトの種類を示します。

定数 | 値 | 説明
adPermObjColumn | 2 | オブジェクトは、列です。
adPermObjDatabase | 3 | オブジェクトは、データベースです。
adPermObjProcedure | 4 | オブジェクトは、プロシージャです。
adPermObjProviderSpecific | -1 | オブジェクトの種類は、プロバイダによって決まります。ObjectType パラメータが adPermObjProviderSpecific で ObjectTypeId が指定されていない場合、エラーが発生します。
adPermObjTable | 1 | オブジェクトは、テーブルです。
adPermObjView | 5 | オブジェクトは、ビューです。


RightsEnum

グループまたはユーザーのオブジェクトに対する権限を示します。

定数 | 値 | 説明
adRightCreate | 16384 (&H4000) | ユーザーまたはグループは、この種類の新規オブジェクトを作成する権限を持っています。
adRightDelete | 65536 (&H10000) | ユーザーまたはグループは、オブジェクトからデータを削除する権限を持っています。Tables などのオブジェクトでは、ユーザーはレコードからデータ値を削除する権限を持っています。
adRightDrop | 256 (&H100) | ユーザーまたはグループは、カタログからオブジェクトを削除する権限を持っています。たとえば、Tables を DROP TABLE SQL コマンドによって削除できます。
adRightExclusive | 512 (&H200) | ユーザーまたはグループは、排他的にオブジェクトにアクセスする権限を持っています。
adRightExecute | 536870912 (&H20000000) | ユーザーまたはグループは、オブジェクトを実行する権限を持っています。
adRightFull | 268435456 (&H10000000) | ユーザーまたはグループは、オブジェクトに対するすべての権限を持っています。
adRightInsert | 32768 (&H8000) | ユーザーまたはグループは、オブジェクトを挿入する権限を持っています。Tables などのオブジェクトでは、ユーザーはデータをテーブルに挿入する権限を持っています。
adRightMaximumAllowed | 33554432 (&H2000000) | ユーザーまたはグループは、プロバイダによって許可された最大数の権限を持っています。指定される権限は、プロバイダの設定によって決まります。
adRightNone | 0 | ユーザーまたはグループは、オブジェクトに対する権限を持ちません。
adRightRead | -2147483648 (&H80000000) | ユーザーまたはグループは、オブジェクトを読み取る権限を持っています。Tables などのオブジェクトでは、ユーザーはテーブル内のデータを読み取る権限を持っています。
adRightReadDesign | 1024 (&H400) | ユーザーまたはグループは、オブジェクトのデザインを読み取る権限を持っています。
adRightReadPermissions | 131072 (&H20000) | ユーザーまたはグループは、カタログ内のオブジェクトの特定の権限を表示することができますが、変更することはできません。
adRightReference | 8192 (&H2000) | ユーザーまたはグループは、オブジェクトを参照する権限を持っています。
adRightUpdate | 1073741824 (&H40000000) | ユーザーまたはグループは、オブジェクトを更新する権限を持っています。Tables などのオブジェクトでは、ユーザーはテーブル内のデータを更新する権限を持っています。
adRightWithGrant | 4096 (&H1000) | ユーザーまたはグループは、オブジェクトに対する権限を与える権限を持っています。
adRightWriteDesign | 2048 (&H800) | ユーザーまたはグループは、オブジェクトのデザインを修正する権限を持っています。
adRightWriteOwner | 524288 (&H80000) | ユーザーまたはグループは、オブジェクトの所有者を変更する権限を持っています。
adRightWritePermissions | 262144 (&H40000) | ユーザーまたはグループは、カタログ内のオブジェクトの特定の権限を修正することができます。


RuleEnum

Key が削除されたときに従うルールを示します。

定数 | 値 | 説明
adRICascade | 1 | 連鎖的に変更します。
adRINone | 0 | 既定値です。何も実行されません。
adRISetDefault | 3 | 外部キー値に既定値が設定されます。
adRISetNull | 2 | 外部キー値に Null 値が設定されます。


SortOrderEnum

インデックスを持つ列のソート順序を示します。

定数 | 値 | 説明
adSortAscending | 1 | 既定値です。列を昇順にソートします。
adSortDescending | 2 | 列を降順にソートします。


ADOX コードの例

ADOX オブジェクト、メソッド、プロパティ、イベントの使用方法については、次のトピックを参照してください。

注意 コード例全体をコピーして、コード エディタに貼り付けてください。この例は、一部分だけ使用したり、改行の情報が失われると、正常に動作しない場合があります。

  • Microsoft Visual Basic での ADOX コードの例

  • Microsoft Visual C++ での ADOX コードの例


Microsoft Visual Basic での ADOX コードの例

これらのトピックは、ADOX の使用方法を理解するのに役立つサンプル コードを提供します。すべてのコード例は、Microsoft® Visual Basic® で記述されています。

注意 Sub から End Sub までのコード例全体をコピーして、コード エディタに貼り付けてください。この例は、一部分だけ使用したり、改行の情報が失われると、正常に動作しない場合があります。

メソッド

  • Columns、Tables Append メソッドと Name プロパティの例 (VB)

  • Connection Close メソッド、Table Type プロパティの例 (VB)

  • Create メソッドの例 (VB)

  • GetObjectOwner、SetObjectOwner メソッドの例 (VB)

  • Get Permissions、Set Permissions メソッドの例 (VB)

  • Groups および Users Append、ChangePassword メソッドの例 (VB)

  • Indexes Append メソッドの例 (VB)

  • Keys Append メソッドと Key Type、RelatedColumn、RelatedTable、UpdateRule プロパティの例 (VB)

  • Procedures Append メソッドの例 (VB)

  • Procedures Delete メソッドの例 (VB)

  • Procedures Refresh メソッドの例 (VB)

  • Views Append メソッドの例 (VB)

  • Views Delete メソッドの例 (VB)

  • Views Refresh メソッドの例 (VB)

プロパティ

  • Attributes プロパティの例 (VB)

  • Catalog ActiveConnection プロパティの例 (VB)

  • Clustered プロパティの例 (VB)

  • Command、CommandText プロパティの例 (VB)

  • Parameters コレクション、Command プロパティの例 (VB)

  • Views コレクション、CommandText プロパティの例 (VB)

  • DateCreated、DateModified プロパティの例 (VB)

  • DefinedSize プロパティの例 (VB)

  • DeleteRule プロパティの例 (VB)

  • IndexNulls プロパティの例 (VB)

  • Keys Append メソッドと Key Type、RelatedColumn、RelatedTable、UpdateRule プロパティの例 (VB)

  • Columns、Tables Append メソッドと Name プロパティの例 (VB)

  • NumericScale、Precision プロパティの例 (VB)

  • ParentCatalog プロパティの例 (VB)

  • PrimaryKey、Unique プロパティの例 (VB)

  • SortOrder プロパティの例 (VB)

  • Connection Close メソッド、Table Type プロパティの例 (VB)

コレクション

  • Parameters コレクション、Command プロパティの例 (VB)

  • Views コレクション、CommandText プロパティの例 (VB)

  • Views、Fields コレクションの例 (VB)


Attributes プロパティの例 (VB)

この例では、Column の Attributes プロパティの機能を示します。このプロパティに adColNullable を設定すると、ユーザーは Recordset Field の値に空文字列を設定できます。この状態でユーザーは、データが認識されていないレコードとデータが適用されていないレコードを区別できます。

Sub AttributesX()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim colTemp As New ADOX.Column
    Dim rstEmployees As New Recordset
    Dim strMessage As String
    Dim strInput As String

    ' Connect the catalog.
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;data source=c:\" & _
        "Program Files\Microsoft Office\Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn

    Set tblEmp = cat.Tables("Employees")

    ' Create a new Field object and append it to the Fields
    ' collection of the Employees table.
    colTemp.Name = "FaxPhone"
    colTemp.Type = adVarWChar
    colTemp.DefinedSize = 24
    colTemp.Attributes = adColNullable
    cat.Tables("Employees").Columns.Append colTemp

    ' Open the Employees table for updating as a Recordset
    rstEmployees.Open "Employees", cnn, adOpenKeyset, adLockOptimistic

    With rstEmployees
        ' Get user input.
        strMessage = "Enter fax number for " & _
            !FirstName & " " & !LastName & "." & vbCr & _
            "[? - unknown, X - has no fax]"
        strInput = UCase(InputBox(strMessage))
        If strInput <> "" Then
            Select Case strInput
                Case "?"
                    !FaxPhone = Null
                Case "X"
                    !FaxPhone = ""
                Case Else
                    !FaxPhone = strInput
            End Select
            .Update

            ' Print report.
            Debug.Print "Name - Fax number"
            Debug.Print !FirstName & " " & !LastName & " - ";

            If IsNull(!FaxPhone) Then
                Debug.Print "[Unknown]"
            Else
                If !FaxPhone = "" Then
                    Debug.Print "[Has no fax]"
                Else
                    Debug.Print !FaxPhone
                End If
            End If

        End If

        .Close
    End With

    ' Delete new field because this is a demonstration.
    tblEmp.Columns.Delete colTemp.Name
    cnn.Close

End Sub


Catalog ActiveConnection プロパティの例 (VB)

ActiveConnection プロパティを有効に設定すると、開いた接続は、カタログを "開き" ます。開いたカタログから、そのカタログに含まれるスキーマ オブジェクトにアクセスできます。

Sub OpenConnection()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog

    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source= c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn
    Debug.Print cat.Tables(0).Type

End Sub

ActiveConnection プロパティに有効な接続文字列を設定しても、カタログを開くことができます。

Sub OpenConnectionWithString()

    Dim cat As New ADOX.Catalog

    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"
    Debug.Print cat.Tables(0).Type

End Sub


Clustered プロパティの例 (VB)

この例では、Index の Clustered プロパティの機能を示します。Microsoft Jet データベースではクラスタ化されたインデックスがサポートされていないため、この例では Northwind データベースにあるすべてのインデックスの Clustered プロパティに対して False が返されます。

Sub ClusteredX()
    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim tblLoop As ADOX.Table
    Dim idxLoop As ADOX.Index
    Dim strCnn as String

   StrCnn = "Provider=SQLOLEDB;Data Source=srv;Initial Catalog=pubs;" & _
            "User Id=sa;Password=;"
    ' Connect the catalog.
   cnn.Open strCnn
    cat.ActiveConnection = cnn

    ' Enumerate Tables
    For Each tblLoop In cat.Tables
        'Enumerate Indexes
        For Each idxLoop In tblLoop.Indexes
            Debug.Print tblLoop.Name & " " & _
                idxLoop.Name & " " & idxLoop.Clustered
        Next idxLoop
    Next tblLoop

End Sub


Columns、Tables Append メソッドと Name プロパティの例 (VB)

次のコードで、新規テーブルの作成方法を示します。

Sub CreateTable()

    Dim tbl As New Table
    Dim cat As New ADOX.Catalog

' Open the Catalog.
    ' 'Open the catalog.
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    tbl.Name = "MyTable"
    tbl.Columns.Append "Column1", adInteger
    tbl.Columns.Append "Column2", adInteger
    tbl.Columns.Append "Column3", adVarWChar, 50
    cat.Tables.Append tbl

End Sub


Command、CommandText プロパティの例 (VB)

次のコードで、プロシージャのテキストを更新するための、Command プロパティの使用方法を示します。

Sub ProcedureText()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim cmd As New ADODB.Command

    ' Open the Connection
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Open the catalog
    Set cat.ActiveConnection = cnn

    ' Get the Command
    Set cmd = cat.Procedures("CustomerById").Command

    ' Update the CommandText
    cmd.CommandText = "Select CustomerId, CompanyName, ContactName " & _
        "From Customers " & _
        "Where CustomerId = [CustId]"

    ' Update the Procedure
    Set cat.Procedures("CustomerById").Command = cmd

End Sub


Connection Close メソッド、Table Type プロパティの例 (VB)

ActiveConnection プロパティに Nothing を設定すると、カタログが閉じます。関連付けられたコレクションは、空になります。カタログのスキーマ オブジェクトから作成されたオブジェクトは、孤立化します。キャッシュされたオブジェクトのどのプロパティも使用できますが、プロバイダへの呼び出しを必要とするプロパティを取得しようとすると失敗します。

Sub CloseConnectionByNothing()

    Dim cnn As New Connection
    Dim cat As New Catalog
    Dim tbl As Table

    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source= c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn
    Set tbl = cat.Tables(0)
    Debug.Print tbl.Type    ' Cache tbl.Type info
    Set cat.ActiveConnection = Nothing
    Debug.Print tbl.Type    ' tbl is orphaned
    ' Previous line will succeed if this was cached
    Debug.Print tbl.Columns(0).DefinedSize
    ' Previous line will fail if this info has not been cached

End Sub

カタログを開くために使用した Connection オブジェクトを閉じると、ActiveConnection プロパティに Nothing を設定するのと同じように、カタログが閉じます。

Sub CloseConnection()

    Dim cnn As New Connection
    Dim cat As New Catalog
    Dim tbl As Table

    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source= c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn
    Set tbl = cat.Tables(0)
    Debug.Print tbl.Type    ' Cache tbl.Type info
    cnn.Close
    Debug.Print tbl.Type    ' tbl is orphaned
    ' Previous line will succeed if this was cached
    Debug.Print tbl.Columns(0).DefinedSize
    ' Previous line will fail if this info has not been cached

End Sub


Create メソッドの例 (VB)

次のコードでは、Create メソッドで新規 Jet データベースを作成する方法を示します。

Sub CreateDatabase()

    Dim cat As New ADOX.Catalog
    cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\new.mdb"

End Sub


DateCreated、DateModified プロパティの例 (VB)

この例では、新しい Column を既存の Table に追加し、新しい Table を作成することで、DateCreated および DateModified プロパティの機能を示します。この例を実行するには、DateOutput プロシージャが必要です。

Sub DateCreatedX()
    Dim cat As New ADOX.Catalog
    Dim tblEmployees As ADOX.Table
    Dim tblNewTable As ADOX.Table

    ' Connect the catalog.
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"

    With cat
        Set tblEmployees = .Tables("Employees")

        ' Print current information about the Employees table.
        DateOutput "Current properties", tblEmployees

        ' Create and append column to the Employees table.
        tblEmployees.Columns.Append "NewColumn", adInteger
        .Tables.Refresh

        ' Print new information about the Employees table.
        DateOutput "After creating a new column", tblEmployees

        ' Delete new column because this is a demonstration.
        tblEmployees.Columns.Delete "NewColumn"

        ' Create and append new Table object to the Northwind database.
        Set tblNewTable = New ADOX.Table
        tblNewTable.Name = "NewTable"
        tblNewTable.Columns.Append "NewColumn", adInteger
        .Tables.Append tblNewTable
        .Tables.Refresh

        ' Print information about the new Table object.
        DateOutput "After creating a new table", .Tables("NewTable")

        ' Delete new Table object because this is a demonstration.
        .Tables.Delete tblNewTable.Name

    End With

End Sub

Sub DateOutput(strTemp As String, tblTemp As ADOX.Table)
    ' Print DateCreated and DateModified information about
    ' specified Table object.
    Debug.Print strTemp
    Debug.Print "    Table: " & tblTemp.Name
    Debug.Print "        DateCreated = " & tblTemp.DateCreated
    Debug.Print "        DateModified = " & tblTemp.DateModified
    Debug.Print
End Sub


DefinedSize プロパティの例 (VB)

この例では、Column の DefinedSize プロパティの機能を示します。このコードでは、Northwind データベースにある Employees テーブルの FirstName 列のサイズを再定義します。そして、Employees テーブルを基にした Recordset の FirstName Field の値の変更が表示されます。既定では、DefinedSize プロパティを再定義した後で、FirstName フィールドが空白で埋められます。

Public Sub DefinedSizeX()

    Dim rstEmployees As ADODB.Recordset
    Dim catNorthwind As New ADOX.Catalog
    Dim colFirstName As ADOX.Column
    Dim colNewFirstName As New ADOX.Column
    Dim aryFirstName() As String
    Dim i As Integer
    Dim strCnn As String

    strCnn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
             "Data Source=c:\Program Files\" & _
             "Microsoft Office\Office\Samples\Northwind.mdb;"

    ' Open a Recordset for the Employees table.
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "Employees", strCnn, adOpenKeyset, , adCmdTable
    ReDim aryFirstName(rstEmployees.RecordCount)

    ' Open a Catalog for the Northwind database,
    ' using same connection as rstEmployees
    Set catNorthwind.ActiveConnection = rstEmployees.ActiveConnection

    ' Loop through the recordset displaying the contents
    ' of the FirstName field, the field's defined size,
    ' and its actual size.
    ' Also store FirstName values in aryFirstName array.
    rstEmployees.MoveFirst
    Debug.Print " "
    Debug.Print "Original Defined Size and Actual Size"
    i = 0
    Do Until rstEmployees.EOF
        Debug.Print "Employee name: " & rstEmployees!FirstName & _
            " " & rstEmployees!LastName
        Debug.Print "    FirstName Defined size: " _
            & rstEmployees!FirstName.DefinedSize
        Debug.Print "    FirstName Actual size: " & _
            rstEmployees!FirstName.ActualSize
            aryFirstName(i) = rstEmployees!FirstName
        rstEmployees.MoveNext
        i = i + 1
    Loop
    rstEmployees.Close

    ' Redefine the DefinedSize of FirstName in the catalog
    Set colFirstName = catNorthwind.Tables("Employees").Columns("FirstName")
    colNewFirstName.Name = colFirstName.Name
    colNewFirstName.Type = colFirstName.Type
    colNewFirstName.DefinedSize = colFirstName.DefinedSize + 1

    ' Append new FirstName column to catalog
    catNorthwind.Tables("Employees").Columns.Delete colFirstName.Name
    catNorthwind.Tables("Employees").Columns.Append colNewFirstName

    ' Open Employee table in Recordset for updating
    rstEmployees.Open "Employees", catNorthwind.ActiveConnection, _
        adOpenKeyset, adLockOptimistic, adCmdTable

    ' Loop through the recordset displaying the contents
    ' of the FirstName field, the field's defined size,
    ' and its actual size.
    ' Also restore FirstName values from aryFirstName.
    rstEmployees.MoveFirst
    Debug.Print " "
    Debug.Print "New Defined Size and Actual Size"
    i = 0
    Do Until rstEmployees.EOF
        rstEmployees!FirstName = aryFirstName(i)
        Debug.Print "Employee name: " & rstEmployees!FirstName & _
            " " & rstEmployees!LastName
        Debug.Print "    FirstName Defined size: " _
            & rstEmployees!FirstName.DefinedSize
        Debug.Print "    FirstName Actual size: " & _
            rstEmployees!FirstName.ActualSize
        rstEmployees.MoveNext
        i = i + 1
    Loop
    rstEmployees.Close

    ' Restore original FirstName column to catalog
    catNorthwind.Tables("Employees").Columns.Delete colNewFirstName.Name
    catNorthwind.Tables("Employees").Columns.Append colFirstName

    ' Restore original FirstName values to Employees table
    rstEmployees.Open "Employees", catNorthwind.ActiveConnection, _
        adOpenKeyset, adLockOptimistic, adCmdTable

    rstEmployees.MoveFirst
    i = 0
    Do Until rstEmployees.EOF
        rstEmployees!FirstName = aryFirstName(i)
        rstEmployees.MoveNext
        i = i + 1
    Loop
    rstEmployees.Close

    Set catNorthwind = Nothing

End Sub


DeleteRule プロパティの例 (VB)

この例では、Key オブジェクトの DeleteRule プロパティの機能を示します。コードは、新しい Table を追加し、それに新しい主キーを定義し、DeleteRule に adRICascade を設定します。

DeleteRule Prop

Sub DeleteRuleX()

    Dim kyPrimary As New ADOX.Key
    Dim cat As New ADOX.Catalog
    Dim tblNew As New ADOX.Table

    ' Connect the catalog
    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                     "data source=c:\Program Files\" & _
                     "Microsoft Office\Office\Samples\Northwind.mdb;"

    ' Name new table
    tblNew.Name = "NewTable"

    ' Append a numeric and a text field to new table.
    tblNew.Columns.Append "NumField", adInteger, 20
    tblNew.Columns.Append "TextField", adVarWChar, 20

    ' Append the new table
    cat.Tables.Append tblNew

    ' Define the Primary key
    kyPrimary.Name = "NumField"
    kyPrimary.Type = adKeyPrimary
    kyPrimary.RelatedTable = "Customers"
    kyPrimary.Columns.Append "NumField"
    kyPrimary.Columns("NumField").RelatedColumn = "CustomerId"
    kyPrimary.DeleteRule = adRICascade

    ' Append the primary key
    cat.Tables("NewTable").Keys.Append kyPrimary

    ''Delete the table as this is a demonstration
    cat.Tables.Delete tblNew.Name

End Sub


GetObjectOwner、SetObjectOwner メソッドの例 (VB)

この例では、GetObjectOwner と SetObjectOwner メソッドの機能を示します。このコードでは、Accounting グループが存在していることを前提としています (このグループをシステムに追加する方法については、「Groups および Users Append、ChangePassword メソッドの例」を参照してください)。Categories テーブルの所有者には Accounting が設定されます。

Sub OwnersX()

    Dim tblLoop As New ADOX.Table
    Dim cat As New ADOX.Catalog
    Dim strOwner As String

    ' Open the Catalog.
    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;" & _
        "jet oledb:system database=" & _
        "c:\Program Files\Microsoft Office\Office\system.mdw"

    ' Print the original owner of Categories
    strOwner = cat.GetObjectOwner("Categories", adPermObjTable)
    Debug.Print "Owner of Categories: " & strOwner

    ' Set the owner of Categories to Accounting
    cat.SetObjectOwner "Categories", adPermObjTable, "Accounting"

    ' List the owners of all tables and columns in the catalog.
    For Each tblLoop In cat.Tables
        Debug.Print "Table: " & tblLoop.Name
        Debug.Print "   Owner: " & _
            cat.GetObjectOwner(tblLoop.Name, adPermObjTable)
    Next tblLoop

    ' Restore the original owner of Categories
    cat.SetObjectOwner "Categories", adPermObjTable, strOwner

End Sub


GetPermissions、SetPermissions メソッドの例 (VB)

この例では、GetPermissions と SetPermissions メソッドの機能を示します。次のコードによって、Orders テーブルへのフル アクセス権を Admin ユーザーに与えます。

Sub GrantPermissions()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim lngPerm As Long

    ' Opens a connection to the northwind database
    ' using the Microsoft Jet 4.0 provider
    cnn.Provider = "Microsoft.Jet.OLEDB.4.0"
    cnn.Open "data source=c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;" & _
        "jet oledb:system database=" & _
        "c:\Program Files\Microsoft Office\Office\system.mdw"

    Set cat.ActiveConnection = cnn

    ' Retrieve original permissions
    lngPerm = cat.Users("admin").GetPermissions("Orders", adPermObjTable)
    Debug.Print "Original permissions: " & Str(lngPerm)

    ' Revoke all permissions
    cat.Users("admin").SetPermissions "Orders", adPermObjTable, _
        adAccessRevoke, adRightFull

    ' Display permissions
    Debug.Print "Revoked permissions: " & _
        Str(cat.Users("admin").GetPermissions("Orders", adPermObjTable))

    ' Give the Admin user full rights on the orders object
    cat.Users("admin").SetPermissions "Orders", adPermObjTable, _
        adAccessSet, adRightFull

    ' Display permissions
    Debug.Print "Full permissions: " & _
        Str(cat.Users("admin").GetPermissions("Orders", adPermObjTable))

    ' Restore original permissions
    cat.Users("admin").SetPermissions "Orders", adPermObjTable, _
        adAccessSet, lngPerm

    ' Display permissions
    Debug.Print "Final permissions: " & _
        Str(cat.Users("admin").GetPermissions("Orders", adPermObjTable))

End Sub


Groups および Users Append、ChangePassword メソッドの例 (VB)

この例では、新しい Group および新しい User をシステムに加えることによって、Groups の Append メソッドと Users の Append メソッドの機能を示します。新しい Group は、新しい User の Groups コレクションに追加されます。したがって、新しい User が Group に追加されます。また、ChangePassword メソッドは User パスワードを指定するためにも使用されます。

Sub GroupX()

    Dim cat As ADOX.Catalog
    Dim usrNew As ADOX.User
    Dim usrLoop As ADOX.User
    Dim grpLoop As ADOX.Group

    Set cat = New ADOX.Catalog
    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;" & _
        "jet oledb:system database=c:\samples\system.mdw"

    With cat
        ' Create and append new group with a string.
        .Groups.Append "Accounting"

        ' Create and append new user with an object.
        Set usrNew = New ADOX.User
        usrNew.Name = "Pat Smith"
        usrNew.ChangePassword "", "Password1"
        .Users.Append usrNew

        ' Make the user Pat Smith a member of the
        ' Accounting group by creating and adding the
        ' appropriate Group object to the user's Groups
        ' collection. The same is accomplished if a User
        ' object representing Pat Smith is created and
        ' appended to the Accounting group Users collection
        usrNew.Groups.Append "Accounting"

        ' Enumerate all User objects in the
        ' catalog's Users collection.
        For Each usrLoop In .Users
            Debug.Print "  " & usrLoop.Name
            Debug.Print "    Belongs to these groups:"
            ' Enumerate all Group objects in each User
            ' object's Groups collection.
            If usrLoop.Groups.Count <> 0 Then
                For Each grpLoop In usrLoop.Groups
                    Debug.Print "    " & grpLoop.Name
                Next grpLoop
            Else
                Debug.Print "    [None]"
            End If
        Next usrLoop

        ' Enumerate all Group objects in the default
        ' workspace's Groups collection.
        For Each grpLoop In .Groups
            Debug.Print "  " & grpLoop.Name
            Debug.Print "    Has as its members:"
            ' Enumerate all User objects in each Group
            ' object's Users collection.
            If grpLoop.Users.Count <> 0 Then
                For Each usrLoop In grpLoop.Users
                    Debug.Print "    " & usrLoop.Name
                Next usrLoop
            Else
                Debug.Print "    [None]"
            End If
        Next grpLoop

        ' Delete new User and Group objects because this
        ' is only a demonstration.
        .Users.Delete "Pat Smith"
        .Groups.Delete "Accounting"

    End With

End Sub


Indexes Append メソッドの例 (VB)

次のコードでは、新規インデックスの作成方法を示します。インデックスは、テーブルの 2 つの列に付けられます。

Sub CreateIndex()

    Dim tbl As New Table
    Dim idx As New ADOX.Index
    Dim cat As New ADOX.Catalog

' Open the catalog.
    ' Open the Catalog.
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Define the table and append it to the catalog
    tbl.Name = "MyTable"
    tbl.Columns.Append "Column1", adInteger
    tbl.Columns.Append "Column2", adInteger
    tbl.Columns.Append "Column3", adVarWChar, 50
    cat.Tables.Append tbl

    ' Define a multi-column index
    idx.Name = "multicolidx"
    idx.Columns.Append "Column1"
    idx.Columns.Append "Column2"

    ' Append the index to the table
    tbl.Indexes.Append idx

End Sub


IndexNulls プロパティの例 (VB)

この例では、Index の IndexNulls プロパティの機能を示します。このコードでは、新規インデックスを作成し、ユーザーが List1 という名前のリスト ボックスに入力した内容に基づいて IndexNulls の値を設定します。Index は、Northwind Catalog の Employees Table に追加されます。新規 Index が Employees テーブルに基づいて Recordset に適用され、Recordset が開かれます。新規レコードが Employees テーブルに追加され、インデックス フィールドに Null 値が入ります。この新規レコードが表示されるかどうかは、IndexNulls プロパティの設定によって決まります。

Sub IndexNullsX()

    Dim cnn As New ADODB.Connection
    Dim catNorthwind As New ADOX.Catalog
    Dim idxNew As New ADOX.Index
    Dim rstEmployees As New ADODB.Recordset
    Dim varBookmark As Variant

    ' Connect the catalog.
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "data source=c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"

    Set catNorthwind.ActiveConnection = cnn

    ' Append Country column to new index
    idxNew.Columns.Append "Country"
    idxNew.Name = "NewIndex"

    ' Set IndexNulls based on user selection in listbox List1
    Select Case List1.List(List1.ListIndex)
        Case "Allow"
            idxNew.IndexNulls = adIndexNullsAllow
        Case "Ignore"
            idxNew.IndexNulls = adIndexNullsIgnore
        Case Else
            End
    End Select

    ' Append new index to Employees table
    catNorthwind.Tables("Employees").Indexes.Append idxNew

    rstEmployees.Index = idxNew.Name
    rstEmployees.Open "Employees", cnn, adOpenKeyset, _
        adLockOptimistic, adCmdTableDirect

    With rstEmployees
        ' Add a new record to the Employees table.
        .AddNew
        !FirstName = "Gary"
        !LastName = "Haarsager"
        .Update

        ' Bookmark the newly added record
        varBookmark = .Bookmark

        ' Use the new index to set the order of the records.
        .MoveFirst

        Debug.Print "Index = " & .Index & _
            ", IndexNulls = " & idxNew.IndexNulls
        Debug.Print "  Country - Name"

        ' Enumerate the Recordset. The value of the
        ' IndexNulls property will determine if the newly
        ' added record appears in the output.
        Do While Not .EOF
            Debug.Print "    " & _
                IIf(IsNull(!Country), "[Null]", !Country) & _
                " - " & !FirstName & " " & !LastName
            .MoveNext
        Loop

        ' Delete new record because this is a demonstration.
        .Bookmark = varBookmark
        .Delete

        .Close
    End With

    ' Delete new Index because this is a demonstration.
    catNorthwind.Tables("Employees").Indexes.Delete idxNew.Name
    Set catNorthwind = Nothing

End Sub


Keys Append メソッドと Key Type、RelatedColumn、RelatedTable、UpdateRule プロパティの例 (VB)

次のコードでは、新規外部キーの作成方法を示します。ここでは、2 つのテーブル (Customers および Orders) が存在すると仮定します。

Sub CreateKey()

    Dim kyForeign As New ADOX.Key
    Dim cat As New ADOX.Catalog

    ' Connect the catalog
    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Define the foreign key
    kyForeign.Name = "CustOrder"
    kyForeign.Type = adKeyForeign
    kyForeign.RelatedTable = "Customers"
    kyForeign.Columns.Append "CustomerId"
    kyForeign.Columns("CustomerId").RelatedColumn = "CustomerId"
    kyForeign.UpdateRule = adRICascade

    ' Append the foreign key
    cat.Tables("Orders").Keys.Append kyForeign

    'Delete the Key as this is a demonstration
    cat.Tables("Orders").Keys.Delete kyForeign.Name
End Sub


NumericScale、Precision プロパティの例 (VB)

この例では、Column オブジェクトの NumericScale および Precision プロパティの機能を示します。このコードで、Northwind データベースの Order Details テーブルの値を表示します。

Sub NumericScalePrecX()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim tblOD As ADOX.Table
    Dim colLoop As ADOX.Column

    ' Connect the catalog.
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "data source=c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn

    ' Retrieve the Order Details table
    Set tblOD = cat.Tables("Order Details")

    ' Display numeric scale and precision of
    ' small integer fields.
    For Each colLoop In tblOD.Columns
        If colLoop.Type = adSmallInt Then
            MsgBox "Column: " & colLoop.Name & vbCr & _
                "Numeric scale: " & _
                    colLoop.NumericScale & vbCr & _
                "Precision: " & colLoop.Precision
        End If
    Next colLoop

End Sub


Parameters コレクション、Command プロパティの例 (VB)

次のコードでは、プロシージャのパラメータ情報を取得するための、Command オブジェクトを使用した Command プロパティの使用方法を示します。

Sub ProcedureParameters()

    Dim cnn As New ADODB.Connection
    Dim cmd As ADODB.Command
    Dim prm As ADODB.Parameter
    Dim cat As New ADOX.Catalog

    ' Open the Connection
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Open the catalog
    Set cat.ActiveConnection = cnn

    ' Get the command object
    Set cmd = cat.Procedures("CustomerById").Command

    ' Retrieve Parameter information
    cmd.Parameters.Refresh
    For Each prm In cmd.Parameters
        Debug.Print prm.Name & ":" & prm.Type
    Next

End Sub


ParentCatalog プロパティの例 (VB)

次のコードでは、テーブルをカタログに追加するより前にプロバイダ固有のプロパティにアクセスするための、ParentCatalog プロパティの使用方法を示します。プロパティは AutoIncrement であり、AutoIncrement フィールドが Microsoft Jet データベース内に作成されます。

Sub CreateAutoIncrColumn()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim tbl As New ADOX.Table

    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source= c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn

    With tbl
        .Name = "MyContacts"
        Set .ParentCatalog = cat
        ' Create fields and append them to the new Table object.
        .Columns.Append "ContactId", adInteger
        ' Make the ContactId column and auto incrementing column
        .Columns("ContactId").Properties("AutoIncrement") = True
        .Columns.Append "CustomerID", adVarWChar
        .Columns.Append "FirstName", adVarWChar
        .Columns.Append "LastName", adVarWChar
        .Columns.Append "Phone", adVarWChar, 20
        .Columns.Append "Notes", adLongVarWChar
    End With

    cat.Tables.Append tbl

    Set cat = Nothing

End Sub


PrimaryKey、Unique プロパティの例 (VB)

この例では、Index の PrimaryKey および Unique プロパティの機能を示します。このコードでは、2 つの列を持つテーブルを新規に作成します。PrimaryKey および Unique プロパティを使用して 1 列を主キーにし、重複した値は入力できないようにします。

Sub PrimaryKeyX()

    Dim catNorthwind As New ADOX.Catalog
    Dim tblNew As New ADOX.Table
    Dim idxNew As New ADOX.Index
    Dim idxLoop As New ADOX.Index
    Dim colLoop As New ADOX.Column

    ' Connect the catalog
    catNorthwind.ActiveConnection="Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "data source=c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"

    ' Name new table
    tblNew.Name = "NewTable"

    ' Append a numeric and a text field to new table.
    tblNew.Columns.Append "NumField", adInteger, 20
    tblNew.Columns.Append "TextField", adVarWChar, 20

    ' Append new Primary Key index on NumField column
    ' to new table
    idxNew.Name = "NumIndex"
    idxNew.Columns.Append "NumField"
    idxNew.PrimaryKey = True
    idxNew.Unique = True
    tblNew.Indexes.Append idxNew

    ' Append an index on Textfield to new table.
    ' Note the different technique: Specifying index and
    ' column name as parameters of the Append method
    tblNew.Indexes.Append "TextIndex", "TextField"

    ' Append the new table
    catNorthwind.Tables.Append tblNew

    With tblNew

        Debug.Print tblNew.Indexes.Count & " Indexes in " & _
            tblNew.Name & " Table"

        ' Enumerate Indexes collection.
        For Each idxLoop In .Indexes

            With idxLoop
                Debug.Print "Index " & .Name
                Debug.Print "   Primary key = " & .PrimaryKey
                Debug.Print "   Unique = " & .Unique

                ' Enumerate Columns collection of each Index
                ' object.
                Debug.Print "    Columns"
                For Each colLoop In .Columns
                    Debug.Print "       " & colLoop.Name
                Next colLoop

            End With

        Next idxLoop

    End With

    ' Delete new table as this is a demonstration
    catNorthwind.Tables.Delete tblNew.Name
    Set catNorthwind = Nothing

End Sub


Procedures Append メソッドの例 (VB)

次のコードでは、基になるデータ ソースに新規プロシージャを作成するための、Command オブジェクトおよび Procedures コレクションの Append メソッドの使用方法を示します。

Sub CreateProcedure()

    Dim cnn As New ADODB.Connection
    Dim cmd As New ADODB.Command
    Dim prm As ADODB.Parameter
    Dim cat As New ADOX.Catalog

    ' Open the Connection
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Create the parameterized command (Microsoft Jet specific)
    Set cmd.ActiveConnection = cnn
    cmd.CommandText = "PARAMETERS [CustId] Text;" & _
        "Select * From Customers Where CustomerId = [CustId]"

    ' Open the Catalog
    Set cat.ActiveConnection = cnn

    ' Create the new Procedure
    cat.Procedures.Append "CustomerById", cmd

End Sub


Procedures Delete メソッドの例 (VB)

次のコードでは、Procedures コレクションの Delete メソッドを使って、プロシージャを削除する方法を示します。

Sub DeleteProcedure()

Dim cat As New ADOX.Catalog

    ' Open the Catalog.
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Delete the Procedure.
    cat.Procedures.Delete "CustomerById"

End Sub


Procedures Refresh メソッドの例 (VB)

次のコードでは、Catalog の Procedures コレクションを更新する方法を示します。この処理は、Catalog の Procedure オブジェクトにアクセスする前に行う必要があります。

Sub ProcedureRefresh()

    Dim cat As New ADOX.Catalog

    ' Open the Catalog
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"

    ' Refresh the Procedures collection
    cat.Procedures.Refresh

End Sub


SortOrder プロパティの例 (VB)

この例では、Index の Columns コレクションに追加された Column の SortOrder プロパティの機能を示します。コードでは、昇順のインデックスを Employees テーブルの Country 列に追加し、レコードを表示します。次に、降順のインデックスを Employees テーブルの Country 列に追加し、レコードを再び表示します。昇順インデックスと降順インデックスの違いが示されます。

Sub SortOrderX()

    Dim cnn As New ADODB.Connection
    Dim catNorthwind As New ADOX.Catalog
    Dim idxAscending As New ADOX.Index
    Dim idxDescending As New ADOX.Index
    Dim rstEmployees As New ADODB.Recordset

    ' Connect the catalog.
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "data source=c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"
    Set catNorthwind.ActiveConnection = cnn

    ' Append Country column to new index
    idxAscending.Columns.Append "Country"
    idxAscending.Columns("Country").SortOrder = adSortAscending
    idxAscending.Name = "Ascending"

    'Append new index to Employees table
    catNorthwind.Tables("Employees").Indexes.Append idxAscending

    rstEmployees.Index = idxAscending.Name
    rstEmployees.Open "Employees", cnn, adOpenKeyset, _
        adLockOptimistic, adCmdTableDirect

    With rstEmployees
        .MoveFirst
        Debug.Print "Index = " & .Index
        Debug.Print "  Country - Name"

        ' Enumerate the Recordset. The value of the
        ' IndexNulls property will determine if the newly
        ' added record appears in the output.
        Do While Not .EOF
            Debug.Print "    " & !Country & " - " & _
                !FirstName & " " & !LastName
            .MoveNext
        Loop

        .Close
    End With

    ' Append Country column to new index
    idxDescending.Columns.Append "Country"
    idxDescending.Columns("Country").SortOrder = adSortDescending
    idxDescending.Name = "Descending"

    ' Append descending index to Employees table
    catNorthwind.Tables("Employees").Indexes.Append idxDescending

    rstEmployees.Index = idxDescending.Name
    rstEmployees.Open "Employees", cnn, adOpenKeyset, _
        adLockOptimistic, adCmdTableDirect

'    DisplaySortedRecords (rstEmployees)

     With rstEmployees
        .MoveFirst
        Debug.Print "Index = " & .Index
        Debug.Print "  Country - Name"

        ' Enumerate the Recordset. The value of the
        ' IndexNulls property will determine if the newly
        ' added record appears in the output.
        Do While Not .EOF
            Debug.Print "    " & !Country & " - " & _
                !FirstName & " " & !LastName
            .MoveNext
        Loop

        .Close
    End With

    ' Delete new Indexes because this is a demonstration.
    catNorthwind.Tables("Employees").Indexes.Delete idxAscending.Name
    catNorthwind.Tables("Employees").Indexes.Delete idxDescending.Name
    Set catNorthwind = Nothing

End Sub


Views、Fields コレクションの例 (VB)

次のコードでは、ビューのフィールド情報を取得するための、Command プロパティおよび Recordset オブジェクトの使用方法を示します。

Sub ViewFields()

    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim fld As ADODB.Field
    Dim cat As New ADOX.Catalog

    ' Open the Connection
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Open the catalog
    Set cat.ActiveConnection = cnn

    ' Set the Source for the Recordset
    Set rst.Source = cat.Views("AllCustomers").Command

    ' Retrieve Field information
    rst.Fields.Refresh
    For Each fld In rst.Fields
        Debug.Print fld.Name & ":" & fld.Type
    Next

End Sub


Views Append メソッドの例 (VB)

次のコードでは、基になるデータ ソースに新規ビューを作成するための、Command オブジェクトおよび Views コレクションの Append メソッドの使用方法を示します。

Sub CreateView()

    Dim cmd As New ADODB.Command
    Dim cat As New ADOX.Catalog

    ' Open the Catalog
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Create the command representing the view.
        cmd.CommandText = "Select * From Customers"

    ' Create the new View
    cat.Views.Append "AllCustomers", cmd

End Sub


Views コレクション、CommandText プロパティの例 (VB)

次のコードでは、ビューのテキストを更新するための Command プロパティの使用方法を示します。

Sub ViewText()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim cmd As New ADODB.Command

    ' Open the Connection
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Open the catalog
    Set cat.ActiveConnection = cnn

    ' Get the command
    Set cmd = cat.Views("AllCustomers").Command

    ' Update the CommandText of the Command
    cmd.CommandText = _
        "Select CustomerId, CompanyName, ContactName From Customers"

    ' Update the View
    Set cat.Views("AllCustomers").Command = cmd

End Sub


Views Delete メソッドの例 (VB)

次のコードでは、カタログからビューを削除するための Delete メソッドの使用方法を示します。

Sub DeleteView()

    Dim cat As New ADOX.Catalog

    ' Open the catalog
    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    'Delete the View
    cat.Views.Delete "AllCustomers"

End Sub


Views Refresh メソッドの例 (VB)

次のコードでは、Catalog の Views コレクションを更新する方法を示します。この処理は、Catalog の View オブジェクトにアクセスする前に行う必要があります。

Sub ProcedureRefresh()

    Dim cat As New ADOX.Catalog

    ' Open the Catalog
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"

    ' Refresh the Procedures collection
    cat.Views.Refresh

End Sub


Microsoft Visual C++ での ADOX コードの例

これらのトピックでは、ADOX の使用方法を理解するのに役立つサンプル コードを提供しています。すべてのコード例は、Visual C++ を使用して記述されています。

注意 最初から最後までのコード例全体をコード エディタに貼り付けてください。この例は、一部分だけ使用したり、改行の情報が失われると、正常に動作しない場合があります。

メソッド

  • Columns、Tables Append メソッドと Name プロパティの例 (VC++)

  • Connection Close メソッド、Table Type プロパティの例 (VC++)

  • Create メソッドの例 (VC++)

  • GetObjectOwner、SetObjectOwner メソッドの例 (VC++)

  • GetPermissions、SetPermissions メソッドの例 (VC++)

  • Groups および Users Append、ChangePassword メソッドの例 (VC++)

  • Indexes Append メソッドの例 (VC++)

  • Keys Append メソッドと Key Type、RelatedColumn、RelatedTable、UpdateRule プロパティの例 (VC++)

プロパティ

  • Attributes プロパティの例 (VC++)

  • Catalog ActiveConnection プロパティの例 (VC++)

  • Clustered プロパティの例 (VC++)

  • Command、CommandText プロパティの例 (VC++)

  • Parameters コレクション、Command プロパティの例 (VC++)

  • DateCreated、DateModified プロパティの例 (VC++)

  • DefinedSize プロパティの例 (VC++)

  • DeleteRule プロパティの例 (VC++)

  • IndexNulls プロパティの例 (VC++)

  • Keys Append メソッドと Key Type、RelatedColumn、RelatedTable、UpdateRule プロパティの例 (VC++)

  • Columns、Tables Append メソッドと、Name プロパティの例 (VC++)

  • NumericScale、Precision プロパティの例 (VC++)

  • ParentCatalog プロパティの例 (VC++)

  • PrimaryKey、Unique プロパティの例 (VC++)

  • Connection Close メソッド、Table Type プロパティの例 (VC++)

コレクション

  • Parameters コレクション、Command プロパティの例 (VC++)


Attributes プロパティの例 (VC++)

この例では、Column の Attributes プロパティの機能を示します。このプロパティに adColNullable を設定すると、ユーザーは Recordset Field の値に空文字列を設定できます。この状態で、ユーザーはデータが認識されていないレコードとデータが適用されないレコードを区別できます。

#import "c:\Program Files\Common Files\system\ado\msado15.dll"
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"
#include "AttributesX.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AttributesX(void);

//////////////////////////////////////////////////////////
//                                                      //
//         Main Function                                //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AttributesX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        AttributesX Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void AttributesX(void)
{
    HRESULT hr = S_OK;

     // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog  = NULL;
    _ColumnPtr m_pColumn  = NULL;
    _TablePtr m_pTable  = NULL;

    // Define ADODB object pointers
    ADODB::_ConnectionPtr m_pCnn         = NULL;
    ADODB::_RecordsetPtr m_pRstEmployees  = NULL;

    IADORecordBinding *picRs  = NULL;   // Interface Pointer Declared
    CEmployeeRs emprs;            // C++ Class Object

    // Define string variables.
    _bstr_t strcnn("Provider=Microsoft.Jet.OLEDB.4.0;"
        "Data Source= c:\\Program Files\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb;");

    try
    {
        // Connect the catalog.
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof (ADODB::Connection)));
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        TESTHR(hr = m_pColumn.CreateInstance(__uuidof(Column)));
        TESTHR(hr = m_pRstEmployees.CreateInstance(
            __uuidof(ADODB::Recordset)));
        m_pCnn->Open(strcnn,"","",NULL);

        m_pCatalog->PutActiveConnection(
            _variant_t((IDispatch *) m_pCnn));
        m_pTable= m_pCatalog->Tables->GetItem("Employees");

        // Create a new Field object and append it to the Fields
        // collection of the Employees table.
        m_pColumn->Name = "FaxPhone";
        m_pColumn->Type = adVarWChar;
        m_pColumn->DefinedSize = 24;
        m_pColumn->Attributes = adColNullable;

        m_pCatalog->Tables->GetItem("Employees")->Columns->
            Append("FaxPhone",adVarWChar,24);

        // Open the Employees table for updating as a Recordset.
        m_pRstEmployees->Open("Employees",
            _variant_t((IDispatch *) m_pCnn),
            ADODB::adOpenKeyset,ADODB::adLockOptimistic,
            ADODB::adCmdTable);

        // Get user input.
        printf("Enter fax number for : %s %s\n",(LPSTR) (_bstr_t)
            m_pRstEmployees->Fields->GetItem("LastName")->Value,
           (LPSTR) (_bstr_t) m_pRstEmployees->Fields->
            GetItem("FirstName")->Value);
        printf("[? - unknown, X - has no fax] : \n");
        char strInput[10];
        gets(strInput);
        char* strTemp = strtok(strInput," \t");
        _variant_t vNull;
        vNull.vt = VT_BSTR;
        vNull.bstrVal = NULL;
        if(strTemp!=NULL)
        {
            if(strcmp(strTemp,"?") == 0)
            {
                m_pRstEmployees->Fields->GetItem("FaxPhone")->
                    PutValue(vNull);
            }
            else if( (strcmp(strTemp,"X") == 0) |
                     (strcmp(strTemp,"x") == 0) )
           {
                m_pRstEmployees->Fields->GetItem("FaxPhone")->
                    PutValue("");
            }
            else
            {
                m_pRstEmployees->Fields->GetItem("FaxPhone")->
                    PutValue(strTemp);
            }
            m_pRstEmployees->Update();

            // Open an IADORecordBinding interface pointer which
            // we will use for binding Recordset to a class
            TESTHR(hr = m_pRstEmployees->QueryInterface(
                __uuidof(IADORecordBinding),(LPVOID*)&picRs));

            // Bind the Recordset to a C++ class here
            TESTHR(hr = picRs->BindToRecordset(&emprs));

            // Print report.
            printf("\nName - Fax number\n");
            printf("%s %s ",emprs.lemp_LastNameStatus == adFldOK ?
                emprs.m_szemp_LastName : "<NULL>",
                emprs.lemp_FirstNameStatus == adFldOK ?
                emprs.m_szemp_FirstName : "<NULL>");

            if (emprs.lemp_FaxphoneStatus == adFldNull)
                printf("- [Unknown]");
            else if (strcmp((LPSTR)emprs.m_szemp_Faxphone,"") == 0)
                printf("- [Has no fax]");
            else
                printf("- %s",emprs.m_szemp_Faxphone);
        }
        m_pRstEmployees->Close();

        // Delete new field because this is a demonstration.
        m_pTable->Columns->Delete(m_pColumn->Name);

        // Release the IADORecordset Interface here
        if(picRs)
            picRs->Release();
        m_pCnn->Close();
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}

AttributesX.h

#include "icrsint.h"

//This class extracts LastName, FirstName, FaxPhone from Employees table

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)
        // Column LastName is the 2nd field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_szemp_LastName,
            sizeof(m_szemp_LastName),lemp_LastNameStatus,TRUE)
        // Column FirstName is the 17th field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(17,adVarChar,m_szemp_FirstName,
            sizeof(m_szemp_FirstName),lemp_FirstNameStatus,TRUE)
        // Column FaxPhone is the 18th field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(18,adVarChar,m_szemp_Faxphone,
            sizeof(m_szemp_Faxphone),lemp_FaxphoneStatus,TRUE)
END_ADO_BINDING()

public:
    CHAR m_szemp_LastName[21];
    ULONG lemp_LastNameStatus;
    CHAR m_szemp_FirstName[11];
    ULONG lemp_FirstNameStatus;
    CHAR m_szemp_Faxphone[25];
    ULONG lemp_FaxphoneStatus;
};


Catalog ActiveConnection プロパティの例 (VC++)

ActiveConnection プロパティに開いている有効な接続を設定すると、カタログが開きます。開いたカタログから、そのカタログに含まれるスキーマ オブジェクトにアクセスできます。

#import "c:\Program Files\Common Files\system\ado\msado15.dll"
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OpenConnectionX(void);
void OpenConnectionWithStringX(void);

//////////////////////////////////////////////////////////
//                                                      //
//         Main Function                                //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OpenConnectionX();

    OpenConnectionWithStringX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//     OpenConnectionX Function                         //
//                                                      //
//////////////////////////////////////////////////////////
void OpenConnectionX(void)
{
   HRESULT   hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;

    //Define ADODB object pointers
    ADODB::_ConnectionPtr m_pCnn   = NULL;

    // Define string variables.
    _bstr_t strcnn("Provider=Microsoft.JET.OLEDB.4.0;"
        "Data source = c:\\Program Files\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb;");

       try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        m_pCnn->Open(strcnn,"","",NULL);
        m_pCatalog->PutActiveConnection(
            _variant_t((IDispatch *) m_pCnn));
        _variant_t vIndex = (short) 0;
        cout<<m_pCatalog->Tables->GetItem(vIndex)->Type<<endl;
        m_pCnn->Close();
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//         OpenConnectionWithStringX Function           //
//                                                      //
//////////////////////////////////////////////////////////
void OpenConnectionWithStringX(void)
{
   HRESULT   hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
   _CatalogPtr m_pCatalog = NULL;

   // Define string variables.
    _bstr_t strcnn("Provider=Microsoft.JET.OLEDB.4.0;"
                "Data source = c:\\Program Files\\Microsoft Office\\"
            "Office\\Samples\\Northwind.mdb;");

       try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        m_pCatalog->PutActiveConnection(strcnn);
        _variant_t vIndex = (short) 0;
        cout<<m_pCatalog->Tables->GetItem(vIndex)->Type<<endl;
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
           (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }
    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Clustered プロパティの例 (VC++)

この例では、Index の Clustered プロパティの機能を示します。Microsoft Jet データベースではクラスタ化されたインデックスがサポートされていないため、この例では Northwind データベースにあるすべてのインデックスの Clustered プロパティに対して False が返されます。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ClusteredX(void);

//////////////////////////////////////////////////////////
//                                                      //
//     Main Function                                    //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ClusteredX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       ClusteredX Function                            //
//                                                      //
//////////////////////////////////////////////////////////
void ClusteredX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;
    _IndexPtr m_pIndex = NULL;

    //Define other variables here
    _variant_t vIndex;
    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));

        // Connect to the catalog.
        m_pCatalog->PutActiveConnection(
            "Provider=Microsoft.Jet.OLEDB.4.0;data source="
            "c:\\Program Files\\Microsoft Office\\Office\\Samples"
            "\\Northwind.mdb;");

        int iLineCnt = 1;
        //Enumerate Tables.
        for(short iTable = 0;iTable < m_pCatalog->Tables->Count;iTable++)
        {
            vIndex = iTable;
            m_pTable = m_pCatalog->Tables->GetItem(vIndex);

            //Enumerate Indexes.
            for(short iIndex = 0;iIndex < m_pTable->Indexes->Count;
                iIndex++)
            {
                vIndex = iIndex;
                m_pIndex = m_pTable->Indexes->GetItem(vIndex);
                cout << m_pTable->Name << " " ;
                cout << m_pIndex->Name << " " << (m_pIndex->
                    GetClustered() ? "True" : "False") << endl;
                 if (iLineCnt%15 == 0)
                {
                    printf("\nPress any key to continue...\n");
                    getch();
                }
                iLineCnt++;
            }
        }
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Columns、Tables Append メソッドと Name プロパティの例 (VC++)

次のコードは、新規テーブルの作成方法を示しています。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CreateTableX(void);

//////////////////////////////////////////////////////////
//                                                      //
//       Main Function                                  //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CreateTableX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       CreateTableX Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void CreateTableX()
{
        HRESULT hr = S_OK;

        // Define ADOX object pointers.
        // Initialize pointers on define.
        // These are in the ADOX::  namespace.
        _CatalogPtr m_pCatalog = NULL;
        _TablePtr m_pTable = NULL;

        try
        {
            TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));

            //Open the catalog
            m_pCatalog->PutActiveConnection(
                "Provider=Microsoft.Jet.OLEDB.4.0;" \
                "data source=c:\\Program Files\\Microsoft Office"
                "\\Office\\Samples\\Northwind.mdb;");

            TESTHR(hr = m_pTable.CreateInstance(__uuidof(Table)));
            m_pTable->PutName("MyTable");
            m_pTable->Columns->Append("Column1",adInteger,0);
            m_pTable->Columns->Append("Column2",adInteger,0);
            m_pTable->Columns->Append("Column3",adVarWChar,50);
            m_pCatalog->Tables->Append(
                _variant_t((IDispatch *)m_pTable));

            //Delete the table
            m_pCatalog->Tables->Delete("MyTable");
        }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Command、CommandText プロパティの例 (VC++)

次のコードは、プロシージャのテキストを更新するための Command プロパティの使用方法を示しています。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ProcedureTextX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ProcedureTextX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       ProcedureTextX Function                        //
//                                                      //
//////////////////////////////////////////////////////////
void ProcedureTextX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;

    // Define ADODB object pointers.
    ADODB::_ConnectionPtr m_pCnn = NULL;
    ADODB::_CommandPtr m_pCommand = NULL;

    try
    {
        //Open the Connection
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));
        TESTHR(hr = m_pCommand.CreateInstance(__uuidof(ADODB::Command)));
        m_pCnn->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
            "data source=c:\\Program Files\\Microsoft Office"
            "\\Office\\Samples\\Northwind.mdb;","","",NULL);

        //Open the Connection
        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        //Create a Stored Procedure
        m_pCommand->PutCommandText("Select * from Customers");
        m_pCatalog->Procedures->Append((_bstr_t)"CustomerById", _variant_t((IDispatch *)m_pCommand));

        //Get the Command
        m_pCommand = m_pCatalog->Procedures->GetItem("CustomerById")->
            GetCommand();

        //Update the CommandText
        m_pCommand->PutCommandText("PARAMETERS [CustId] Text;select "
            "CustomerId, CompanyName, ContactName "
            "from Customers where CustomerId = [CustId]");

        //Update the Procedure
        m_pCatalog->Procedures->GetItem("CustomerById")->PutCommand(
            _variant_t((IDispatch *)m_pCommand));

        //Delete the Stored Procedure
        m_pCatalog->Procedures->Delete("CustomerById");

    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Connection Close メソッド、Table Type プロパティの例 (VC++)

ActiveConnection プロパティに Nothing を設定すると、カタログが閉じます。関連付けられたコレクションは、空になります。カタログのスキーマ オブジェクトから作成されたどのオブジェクトも、孤立化します。キャッシュされたオブジェクトのプロパティはどれも使用できますが、プロバイダへの参照が必要なプロパティを取得しようとすると失敗します。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CloseConnectionByNothingX(void);
void CloseConnectionX(void);

//////////////////////////////////////////////////////////
//                                                      //
//     Main Function                                    //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CloseConnectionByNothingX();

    CloseConnectionX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        CloseConnectionByNothingX Function            //
//                                                      //
//////////////////////////////////////////////////////////
void CloseConnectionByNothingX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.

    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;

    //Define ADODB object pointers
    ADODB::_ConnectionPtr m_pCnn = NULL;

    //Define other variables
    _variant_t vIndex = (short) 0;

    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));

        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));

        m_pCnn->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
            "Data Source= c:\\Program Files\\Microsoft Office\\"
            "Office\\Samples\\Northwind.mdb;","","",NULL);

        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        m_pTable = m_pCatalog->Tables->GetItem(vIndex);

        // Cache m_pTable.Type info
        cout << m_pTable->Type << endl;

        _variant_t vCnn;
        vCnn.vt = VT_DISPATCH;
        vCnn.pdispVal = NULL;
        m_pCatalog->PutActiveConnection(vCnn);

        // m_pTable is orphaned
        cout << m_pTable->Type << endl;

        // Previous line will succeed if this was cached
        cout << m_pTable->Columns->GetItem(vIndex)->DefinedSize << endl;
        // Previous line will fail if this info has not been cached
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//     CloseConnectionX Function                        //
//                                                      //
//////////////////////////////////////////////////////////
void CloseConnectionX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.

    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;

    //Define ADODB object pointers
    ADODB::_ConnectionPtr m_pCnn = NULL;

    //Define other variables
    _variant_t vIndex = (short) 0;
    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));
        m_pCnn->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
            "Data Source= c:\\Program Files\\Microsoft Office\\"
            "Office\\Samples\\Northwind.mdb;","","",NULL);

        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));
        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        m_pTable = m_pCatalog->Tables->GetItem(vIndex);

        // Cache m_pTable.Type info
        cout << m_pTable->Type << endl;

        m_pCnn->Close();

        // m_pTable is orphaned
        cout << m_pTable->Type << endl;

        // Previous line will succeed if this was cached
        cout << m_pTable->Columns->GetItem(vIndex)->DefinedSize << endl;
        // Previous line will fail if this info has not been cached
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Create メソッドの例 (VC++)

次のコードでは、Create メソッドで新規 Jet データベースを作成する方法を示します。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CreateDatabaseX(void);

//////////////////////////////////////////////////////////
//                                                      //
//     Main Function                                    //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(CoInitialize(NULL)))
        return;

    CreateDatabaseX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//     CreateDatabaseX Function                         //
//                                                      //
//////////////////////////////////////////////////////////
void CreateDatabaseX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.

    _CatalogPtr m_pCatalog = NULL;

    //Set ActiveConnection of Catalog to this string
    _bstr_t strcnn("Provider=Microsoft.JET.OLEDB.4.0;"
                "Data source = c:\\new.mdb");
    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        m_pCatalog->Create(strcnn);

    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);

    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }

}


DateCreated、DateModified プロパティの例 (VC++)

この例では、新規 Column を既存の Table に追加し、新規 Table を作成することで、DateCreated および DateModified プロパティの機能を示します。この例を実行するには、DateOutput プロシージャが必要です。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DateCreatedX(void);
void DateOutPut(_bstr_t strTemp , _TablePtr tblTemp);

//////////////////////////////////////////////////////////
//                                                      //
//        Main Function                                 //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DateCreatedX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       DateCreatedX Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void DateCreatedX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTblEmployees = NULL;
    _TablePtr m_pTblNew = NULL;

    //Set ActiveConnection of Catalog to this string
    _bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;"
        "Data Source= c:\\Program Files\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb;");

    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));

        // Connect the catalog.
        m_pCatalog->PutActiveConnection(strCnn);

        m_pTblEmployees = m_pCatalog->Tables->GetItem("Employees");

        // Print current information about the Employees table.
        DateOutPut((_bstr_t)"Current properties", m_pTblEmployees);

        // Create and append column to the Employees table.
        m_pTblEmployees->Columns->Append("NewColumn", adInteger,0);

        m_pCatalog->Tables->Refresh();

        // Print new information about the Employees table.
        DateOutPut((_bstr_t)"After creating a new column",
            m_pTblEmployees);

        // Delete new column because this is a demonstration.
        m_pTblEmployees->Columns->Delete("NewColumn");

        // Create and append new Table object to the Northwind database.
         TESTHR(hr = m_pTblNew.CreateInstance(__uuidof(Table)));

        m_pTblNew->Name = "NewTable";
        m_pTblNew->Columns->Append("NewColumn", adInteger,0);
        m_pCatalog->Tables->Append(_variant_t((IDispatch*)m_pTblNew));
        m_pCatalog->Tables->Refresh();

        //Print information about the new Table object.
        DateOutPut((_bstr_t)"After creating a new table", m_pCatalog->
            Tables->GetItem("NewTable"));

        // Delete new Table object because this is a demonstration.
        m_pCatalog->Tables->Delete(m_pTblNew->Name);
}

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//        DateOutPut Function                           //
//                                                      //
//////////////////////////////////////////////////////////
void DateOutPut(_bstr_t strTemp , _TablePtr tblTemp)
{
    // Print DateCreated and DateModified information about
    // specified Table object.
    cout << strTemp << endl;
    cout << "    Table: " << tblTemp->GetName() << endl;
    cout << "        DateCreated = " << (_bstr_t)tblTemp->
        GetDateCreated() << endl;
    cout << "        DateModified = " << (_bstr_t)tblTemp->
        GetDateModified() << endl;
}


DefinedSize プロパティの例 (VC++)

この例では、Column の DefinedSize プロパティの機能を示します。コードでは、Northwind データベースにある Employees テーブルの FirstName 列のサイズを再定義します。そして、Employees テーブルを基にした Recordset の FirstName Field の値の変更が表示されます。既定では、DefinedSize プロパティを再定義した後で、FirstName フィールドがスペースで埋められます。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
     rename("EOF", "EndOfFile")

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DefinedSizeX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DefinedSizeX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      DefinedSizeX Function                           //
//                                                      //
//////////////////////////////////////////////////////////
void DefinedSizeX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatNorthwind   = NULL;
    _ColumnPtr m_pColFirstName    = NULL;
    _ColumnPtr m_pColNewFirstName = NULL;

    // Define ADODB object pointers
    ADODB::_RecordsetPtr m_pRstEmployees  = NULL;

    // Define string variables.
    _bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;data source="
        "c:\\Program Files\\Microsoft Office\\Office\\Samples\\"
        "Northwind.mdb;");
    _bstr_t aryFirstName[10];

    try
    {
        // Open a Recordset for the Employees table.
        TESTHR(hr = m_pRstEmployees.CreateInstance(
            __uuidof(ADODB::Recordset)));
        TESTHR(hr = m_pCatNorthwind.CreateInstance(__uuidof (Catalog)));
        TESTHR(hr = m_pColNewFirstName.CreateInstance(__uuidof(Column)));
        m_pRstEmployees->Open("Employees",strCnn,ADODB::adOpenKeyset,
            ADODB::adLockReadOnly,ADODB::adCmdTable);
        long lngSize = m_pRstEmployees->RecordCount;
        aryFirstName[lngSize];

        // Open a catalog for the Northwind database,
        // using same connection as rstEmployees.
        m_pCatNorthwind->PutActiveConnection(m_pRstEmployees->
            GetActiveConnection());

        // Loop through the recordset displaying the contents,
        // of the FirstName field, the field's defined size,
        // and its actual size.
        // Also store FirstName values in aryFirstName array.
        m_pRstEmployees->MoveFirst();
        printf("\nOriginal Defined Size and Actual Size");
        int iCount=0;
        while (!(m_pRstEmployees->EndOfFile))
        {
            printf("\nEmployee Name:");
            printf("%s ",(LPSTR)(_bstr_t)m_pRstEmployees->Fields->
                GetItem("FirstName")->Value);
            printf("%s\n",(LPSTR)(_bstr_t)m_pRstEmployees->Fields->
                GetItem("LastName")->Value);
            printf("  FirstName Defined size: %d\n",m_pRstEmployees->
                Fields->GetItem("FirstName")->DefinedSize) ;
            printf("  FirstName Actual size: %d\n",m_pRstEmployees->
                Fields->GetItem("FirstName")->ActualSize);
            aryFirstName[iCount] = (_bstr_t) m_pRstEmployees->Fields->
                GetItem("FirstName")->Value;
            m_pRstEmployees->MoveNext();
            iCount++;
            if(iCount%5==0)
            {
                printf("Press any key to continue...");
                getch();
                system("cls");
            }
        }
        m_pRstEmployees->Close();

        // Redefine the DefinedSize of FirstName in the catalog.
        m_pColFirstName = m_pCatNorthwind->Tables->GetItem("Employees")->
            Columns->GetItem("FirstName");
        m_pColNewFirstName->Name = m_pColFirstName->Name;
        m_pColNewFirstName->Type = m_pColFirstName->Type;
        m_pColNewFirstName->DefinedSize =
            (m_pColFirstName->DefinedSize) + 1;

        // Append new FirstName column to catalog.
        m_pCatNorthwind->Tables->GetItem("Employees")->Columns->
            Delete(m_pColFirstName->Name);
        m_pCatNorthwind->Tables->GetItem("Employees")->Columns->
            Append(_variant_t((IDispatch*)m_pColNewFirstName,true),
            adVarWChar,m_pColNewFirstName->DefinedSize);

        // Open Employee table in Recordset for updating.
        m_pRstEmployees->Open("Employees",m_pCatNorthwind->
            GetActiveConnection(),ADODB::adOpenKeyset,
            ADODB::adLockOptimistic,ADODB::adCmdTable);

        // Loop through the recordset displaying the contents
        // of the FirstName field,the field's defined size,
        // and its actual size.
        // Also restore FirstName values from aryFirstName.
        printf("Press any key to continue...");
        getch();
        system("cls");
        m_pRstEmployees->MoveFirst();
        printf("\n\nNew Defined Size and Actual Size");
        iCount=0;
        while (!(m_pRstEmployees->EndOfFile))
        {
            m_pRstEmployees->Fields->GetItem("FirstName")->Value =
                aryFirstName[iCount];
            printf("\nEmployee Name: ");
            printf("%s ",(LPSTR) (_bstr_t)m_pRstEmployees->Fields->
                GetItem("FirstName")->Value);
            printf("%s\n",(LPSTR)(_bstr_t)m_pRstEmployees->Fields->
                GetItem("LastName")->Value);
            printf("  FirstName Defined size: %d\n",m_pRstEmployees->
                Fields->GetItem("FirstName")->DefinedSize );
            printf("  FirstName Actual size: %d\n",m_pRstEmployees->
                Fields->GetItem("FirstName")->ActualSize );
            m_pRstEmployees->MoveNext();
            iCount++;
            if(iCount%5==0)
            {
                printf("Press any key to continue...");
                getch();
                system("cls");
            }
        }
        m_pRstEmployees->Close();

        // Restore original FirstName column to catalog
        m_pCatNorthwind->Tables->GetItem("Employees")->Columns->
            Delete(m_pColNewFirstName->Name);
        m_pCatNorthwind->Tables->GetItem("Employees")->Columns->
            Append(_variant_t((IDispatch*)m_pColFirstName,true),
            adVarWChar,m_pColFirstName->DefinedSize);

        // Restore original FirstName values to Employees table.
        m_pRstEmployees->Open("Employees",m_pCatNorthwind->
            GetActiveConnection(),ADODB::adOpenKeyset,
            ADODB::adLockOptimistic,ADODB::adCmdTable);

        m_pRstEmployees->MoveFirst();
        iCount = 0;
        while(!(m_pRstEmployees->EndOfFile))
        {
            m_pRstEmployees->Fields->GetItem("FirstName")->Value =
                aryFirstName[iCount];
            m_pRstEmployees->MoveNext();
            iCount++;
        }
        m_pRstEmployees->Close();
        m_pCatNorthwind = NULL;
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


DeleteRule プロパティの例 (VC++)

この例では、Key オブジェクトの DeleteRule プロパティの機能を示します。このコードでは、新規 Table を追加して新規主キーを定義し、DeleteRule に adRICascade を設定します。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DeleteRuleX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DeleteRuleX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       DeleteRuleX Function                           //
//                                                      //
//////////////////////////////////////////////////////////
void DeleteRuleX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _KeyPtr m_pKeyPrimary = NULL;
    _CatalogPtr m_pCatalog   = NULL;
    _TablePtr m_pTblNew  = NULL;

    // Define string variables.
    _bstr_t strcnn("Provider=Microsoft.JET.OLEDB.4.0;"
                "Data source = c:\\Program Files\\Microsoft Office"
                "\\Office\\Samples\\Northwind.mdb;");
    try
    {
        TESTHR(hr = m_pKeyPrimary.CreateInstance(__uuidof(Key)));
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        TESTHR(hr = m_pTblNew.CreateInstance(__uuidof(Table)));

        // Connect the catalog.
        m_pCatalog->PutActiveConnection(strcnn);

        // Name new table.
        m_pTblNew->Name = "NewTable";

        // Append a numeric and a text field to new table.
        m_pTblNew->Columns->Append("NumField",adInteger,20);
        m_pTblNew->Columns->Append("TextField",adVarWChar,20);

        // Append the new table.
        m_pCatalog->Tables->Append(_variant_t((IDispatch*)m_pTblNew));

        // Define the Primary key.
        m_pKeyPrimary->Name = "NumField";
        m_pKeyPrimary->Type = adKeyPrimary;
        m_pKeyPrimary->RelatedTable = "Customers";
        m_pKeyPrimary->Columns->Append("NumField",adInteger,20);
        m_pKeyPrimary->Columns->GetItem("NumField")->RelatedColumn =
            "CustomerId";
        m_pKeyPrimary->DeleteRule = adRICascade;

        //to pass an optional column parameter to Key's Apppend method
        _variant_t vOptional;
        vOptional.vt = VT_ERROR;
        vOptional.scode = DISP_E_PARAMNOTFOUND;

        // Append the primary key.
        m_pCatalog->Tables->GetItem("NewTable")->Keys->Append(
            _variant_t((IDispatch*)m_pKeyPrimary),
            adKeyPrimary,vOptional,L"",L"");

        // Delete the table as this is a demonstration.
        m_pCatalog->Tables->Delete(m_pTblNew->Name);
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


GetObjectOwner、SetObjectOwner メソッドの例 (VC++)

この例では、GetObjectOwner と SetObjectOwner メソッドの機能を示します。このコードでは、Accounting グループが存在すると仮定しています。このグループをシステムに追加する方法については、「Groups および Users Append、ChangePassword メソッドの例」を参照してください。Categories テーブルの所有者には Accounting が設定されます。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OwnersX(void);

//////////////////////////////////////////////////////////
//                                                      //
//        Main Function                                 //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OwnersX();

        ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      OwnersX Function                                //
//                                                      //
//////////////////////////////////////////////////////////
void OwnersX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _TablePtr m_pTable = NULL;
    _CatalogPtr m_pCatalog = NULL;

    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));
        TESTHR(hr = m_pTable.CreateInstance(__uuidof(Table)));

        //Open the Catalog.
        m_pCatalog->PutActiveConnection(
            "Provider=Microsoft.Jet.OLEDB.4.0;" \
            "data source=c:\\Program Files\\Microsoft Office\\"
                "Office\\Samples\\Northwind.mdb;"
                "jet oledb:system database=c:\\WINNT\\system32\\"
                "system.mdw");

        //Print the original owner of Categories
        _bstr_t strOwner = m_pCatalog->GetObjectOwner("Categories",
            adPermObjTable);
        cout << "Owner of Categories: " << strOwner << "\n" << endl;
        int iLineCnt = 2;

        //Create and append new group with a string.
        m_pCatalog->Groups->Append("Accounting");

        //Set the owner of Categories to Accounting.
        m_pCatalog->SetObjectOwner("Categories",
            adPermObjTable,"Accounting");

        _variant_t vIndex;
        //List the owners of all tables and columns in the catalog.
        for (long iIndex = 0;iIndex < m_pCatalog->Tables->Count;iIndex++)
        {
            vIndex = iIndex;
            m_pTable = m_pCatalog->Tables->GetItem(vIndex);
            cout << "Table: " << m_pTable->Name << endl;
            cout << "   Owner: " << m_pCatalog->
                GetObjectOwner(m_pTable->Name,adPermObjTable) << endl;
            if (iLineCnt%16 == 0)
                {
                    printf("\nPress any key to continue...\n");
                    getch();
                }
                iLineCnt = iLineCnt + 2;
        }

        //Restore the original owner of Categories
        m_pCatalog->SetObjectOwner("Categories",adPermObjTable,strOwner);

        //Delete Accounting
        m_pCatalog->Groups->Delete("Accounting");
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


GetPermissions、SetPermissions メソッドの例 (VC++)

この例では、GetPermissions と SetPermissions メソッドの機能を示します。次のコードでは、Orders テーブルへのフル アクセス権を Admin ユーザーに与えます。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void GrantPermissionsX(void);

//////////////////////////////////////////////////////////
//                                                      //
//     Main Function                                    //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    GrantPermissionsX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//    GrantPermissionsX Function                        //
//                                                      //
//////////////////////////////////////////////////////////
void GrantPermissionsX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;

    //Define ADODB object pointers;
    ADODB::_ConnectionPtr m_pCnn = NULL;

    //Define other variables here.
    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));

        //Opens a connection to the northwind database
        //using the Microsoft Jet 4.0 provider
        m_pCnn->PutProvider("Microsoft.Jet.OLEDB.4.0");
        m_pCnn->Open("data source=c:\\Program Files\\"  \
        "Microsoft Office\\Office\\Samples\\Northwind.mdb;"  \
        "jet oledb:system database=c:\\WINNT\\system32\\system.mdw",
            "","",NULL);

         TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));

        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        //Retrieve original permissions
        long lngPerm = m_pCatalog->Users->GetItem("admin")->
            GetPermissions("Orders",adPermObjTable);
        long lngOrgPerm = lngPerm;
        cout << "Original Permissions: " << lngPerm << "\n" << endl;

        //Revoke all permissions
        m_pCatalog->Users->GetItem("admin")->SetPermissions("Orders",
            adPermObjTable,adAccessRevoke,adRightFull,adInheritNone);

        //Display permissions
        lngPerm = m_pCatalog->Users->GetItem("admin")->
            GetPermissions("Orders",adPermObjTable);
        cout << "Revoked permissions: " << lngPerm << "\n" << endl;

        //Give the Admin user full rights on the orders object
        m_pCatalog->Users->GetItem("admin")->SetPermissions("Orders",
            adPermObjTable,adAccessSet,adRightFull,adInheritNone);

        //Display permissions
        lngPerm = m_pCatalog->Users->GetItem("admin")->
            GetPermissions("Orders",adPermObjTable);
        cout << "Full permissions: " << lngPerm << "\n" << endl;

        //Restore original permissions
        m_pCatalog->Users->GetItem("admin")->SetPermissions("Orders",
            adPermObjTable,adAccessSet,(RightsEnum) lngOrgPerm,
            adInheritNone);

        //Display permissions
        lngPerm = m_pCatalog->Users->GetItem("admin")->
            GetPermissions("Orders",adPermObjTable);
        cout << "Final permissions: " << lngPerm << "\n" << endl;
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
              (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Groups および Users Append、ChangePassword メソッドの例 (VC++)

この例では、新規 Group および新規 User をシステムに加えることによって、Groups の Append メソッドと Users の Append メソッドの機能を示します。新規 Group は、新規 User の Groups コレクションに追加されます。したがって、新規 User が Group に追加されます。また、ChangePassword メソッドは、User のパスワードを指定するためにも使用されます。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void GroupX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    GroupX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//         GroupX Function                              //
//                                                      //
//////////////////////////////////////////////////////////
void GroupX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog   = NULL;
    _UserPtr m_pUserNew   = NULL;
    _UserPtr m_pUser  = NULL;
    _GroupPtr m_pGroup = NULL;

    // Define String Variables.
    _bstr_t strCnn("Provider=Microsoft.JET.OLEDB.4.0;"
        "Data source = c:\\Program Files\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb;"
        "jet oledb:system database=c:\\WINNT\\system32\\system.mdw");

    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        m_pCatalog->PutActiveConnection(strCnn);

        // Create and append new group with a string.
        m_pCatalog->Groups->Append("Accounting");

        // Create and append new user with an object.
        TESTHR(hr = m_pUserNew.CreateInstance(__uuidof(User)));
        m_pUserNew->PutName("Pat Smith");
        m_pUserNew->ChangePassword("","Password1");
        m_pCatalog->Users->Append(
            _variant_t((IDispatch *)m_pUserNew),"");

        // Make the user Pat Smith a member of the
        // Accounting group by creating and adding the
        // appropriate Group object to the user's Groups
        // collection.The same is accomplished if a User
        // object representing Pat Smith is created and
        // appended to the Accounting group Users collection
        m_pUserNew->Groups->Append("Accounting");

        // Enumerate all User objects in the
        // catalog's Users collection.
        long lUsrIndex;
        long lGrpIndex;
        _variant_t vIndex;
        for(lUsrIndex=0;lUsrIndex<=m_pCatalog->Users->Count;lUsrIndex++)
        {
            vIndex = lUsrIndex;
            m_pUser = m_pCatalog->Users->GetItem(vIndex);
            cout<<"  "<<m_pUser->Name <<endl;
            cout<<"   Belongs to these groups:"<<endl;

            // Enumerate all Group objects in each User
            // object's Groups collection.
            if(m_pUser->Groups->Count != 0)
            {
                for(lGrpIndex=0;lGrpIndex<=m_pUser->Groups->
                    Count;lGrpIndex++)
                {
                    vIndex = lGrpIndex;
                    m_pGroup = m_pUser->Groups->GetItem(vIndex);
                    cout<<"     "<< m_pGroup->Name<<endl;
                }
            }
            else
            {
                cout<<"       [None]"<<endl;
            }
        }

        // Enumerate all Group objects in the default
        // workspace's Groups collection.
        for(lGrpIndex=0;lGrpIndex<=m_pCatalog->Groups->Count;lGrpIndex++)
        {
            vIndex = lGrpIndex;
            m_pGroup = m_pCatalog->Groups->GetItem(vIndex);
            cout<<"   "<< m_pGroup->Name <<endl;
            cout<<"    Has as its members:"<<endl;

            // Enumerate all User objects in each Group
            // object's Users Collection.
            if(m_pGroup->Users->Count != 0)
            {
                for(lUsrIndex=0;lUsrIndex<=m_pGroup->Users->Count;
                    lUsrIndex++)
                {
                    vIndex = lUsrIndex;
                    m_pUser = m_pGroup->Users->GetItem(vIndex);
                    cout<<"    "<<m_pUser->Name<<endl;
                }
            }
            else
            {
                cout<<"      [None]"<<endl;
            }
        }

        // Delete new User and Group object because this
        // is only a demonstration.
        m_pCatalog->Users->Delete("Pat Smith");
        m_pCatalog->Groups->Delete("Accounting");
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Indexes Append メソッドの例 (VC++)

次のコードでは、新規インデックスの作成方法を示します。この例では、インデックスは、テーブルの 2 つの列に付けられます。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CreateIndexX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CreateIndexX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        CreateIndexX Function                         //
//                                                      //
//////////////////////////////////////////////////////////
void CreateIndexX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _TablePtr m_pTable   = NULL;
    _IndexPtr m_pIndex    = NULL;
    _CatalogPtr m_pCatalog = NULL;

    //Define other variables
    _bstr_t strcnn("Provider=Microsoft.JET.OLEDB.4.0;"
        "Data source = c:\\Program Files\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb;");
    try
    {
        TESTHR(hr = m_pTable.CreateInstance(__uuidof(Table)));
        TESTHR(hr = m_pIndex.CreateInstance(__uuidof(Index)));
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));

        // Open the catalog.
        m_pCatalog->PutActiveConnection(strcnn);

        // Define the table and append it to the catalog.
        m_pTable->Name = "MyTable";
        m_pTable->Columns->Append("Column1",adInteger,0);
        m_pTable->Columns->Append("Column2",adInteger,0);
        m_pTable->Columns->Append("Column3",adVarWChar,50);
        m_pCatalog->Tables->Append(_variant_t((IDispatch *)m_pTable));

        // Define a multi-column index.
        m_pIndex->Name = "multicolidx";
        m_pIndex->Columns->Append("Column1",adInteger,0);
        m_pIndex->Columns->Append("Column2",adInteger,0);

        // Append the index to the table.
        m_pTable->Indexes->Append(_variant_t((IDispatch *)m_pIndex));

        // Delete the table.
        m_pCatalog->Tables->Delete("MyTable");
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


IndexNulls プロパティの例 (VC++)

この例では、Index の IndexNulls プロパティの機能を示します。コードでは、新規インデックスを作成し、ユーザーの入力に基づいて IndexNulls の値を設定します。Index は、Northwind Catalog の Employees Table に追加されます。新規 Index が Employees テーブルに基づいて Recordset に適用され、Recordset が開かれます。新規レコードが Employees テーブルに追加され、インデックス フィールドに Null 値を入れます。この新規レコードが表示されるかどうかは、IndexNulls プロパティの設定によって決まります。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    rename("EOF", "EndOfFile")

#include "iostream.h"
#include "stdio.h"
#include "conio.h"
#include "IndexNullsX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void IndexNullsX(_bstr_t);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    printf("\nShow records having indexed field value = NULL? (Y/N):");
    char input = getche();

    if(toupper(input)=='Y')
    {
        IndexNullsX("Allow");
    }
    else if(toupper(input)=='N')
    {
        IndexNullsX("Ignore");
    }
    else
    {
       exit(0);
    }

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      IndexNullsX Function                            //
//                                                      //
//////////////////////////////////////////////////////////
void IndexNullsX(_bstr_t strSel)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog     = NULL;
    _IndexPtr m_pIndexNew      = NULL;

    // Define ADODB object pointers
    ADODB::_ConnectionPtr m_pCnn           = NULL;
    ADODB::_RecordsetPtr  m_pRstEmployees  = NULL;

    // Define other variables
    IADORecordBinding *picRs  = NULL;  // Interface Pointer Declared
    CEmployeeRs emprs;          // C++ Class Object

    // Define string variable.
    _bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;"
        "data source=c:\\Program Files\\Microsoft Office\\Office\\"
        "Samples\\Northwind.mdb;");

    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        TESTHR(hr = m_pIndexNew.CreateInstance(__uuidof(Index)));
        TESTHR(hr = m_pRstEmployees.CreateInstance(
            __uuidof(ADODB::Recordset)));

        // Connect the catalog.
        m_pCnn->Open(strCnn,"","",NULL);
        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        // Append Country column to new index.
        m_pIndexNew->Columns->Append("Country",adVarWChar,0);
        m_pIndexNew->Name = "NewIndex";

        // Set IndexNulls based on user input
        if(strcmp((LPSTR)strSel,"Allow")==0)
        {
            m_pIndexNew->IndexNulls = adIndexNullsAllow;
        }
        else if(strcmp((LPSTR)strSel,"Ignore")==0)
        {
            m_pIndexNew->IndexNulls = adIndexNullsIgnore;
        }

        // Append new index to Employees table
        m_pCatalog->Tables->GetItem("Employees")->Indexes->Append(
            _variant_t((IDispatch *)m_pIndexNew));
        m_pRstEmployees->Index = m_pIndexNew->Name;
        m_pRstEmployees->Open("Employees",
            _variant_t((IDispatch *)m_pCnn),
            ADODB::adOpenKeyset,ADODB::adLockOptimistic,
            ADODB::adCmdTableDirect);

        // Add a new record to the Employees table.
        m_pRstEmployees->AddNew();
        m_pRstEmployees->Fields->GetItem("FirstName")->Value =
             (_bstr_t) "Gary";
        m_pRstEmployees->Fields->GetItem("LastName")->Value =
             (_bstr_t) "Haarsager";
        m_pRstEmployees->Update();

        // Bookmark the newly added record.
        _variant_t varBookmark = m_pRstEmployees->Bookmark;

        // Use the new index to set the order of the records.
        m_pRstEmployees->MoveFirst();
        printf("\n\nIndex = %s,",(LPSTR) m_pRstEmployees->Index);
        printf("IndexNulls = %d\n\n",m_pIndexNew->IndexNulls);
        cout<<"Country            -        Name"<<endl;

        // Open an IADORecordBinding interface pointer which
        // we will use for binding Recordset to a class
        TESTHR(hr = m_pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Bind the Recordset to a C++ class here
        TESTHR(hr = picRs->BindToRecordset(&emprs));

        // Enumerate the Recordset.The value of the
        // IndexNulls property will determine if the newly
        // added record appears in the output.
        while(!(m_pRstEmployees->EndOfFile))
        {
            printf("%s    -    %s %s\n",
                emprs.lemp_CountryStatus == adFldOK ?
                emprs.m_szemp_Country :"[Null]",
                emprs.lemp_FirstNameStatus == adFldOK ?
                emprs.m_szemp_FirstName :"<NULL>",
                emprs.lemp_LastNameStatus == adFldOK ?
                emprs.m_szemp_LastName :"<NULL>");
            m_pRstEmployees->MoveNext();
        }

        // Delete new record because this is a demonstration.
        m_pRstEmployees->Bookmark = varBookmark;
        m_pRstEmployees->Delete(ADODB::adAffectCurrent);
        m_pRstEmployees->Close();

        // Delete new Index because this is a demonstration.
        m_pCatalog->Tables->GetItem("Employees")->Indexes->
            Delete(m_pIndexNew->Name);
        m_pCatalog = NULL;
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}

IndexNullX.h

// IndexNullsX.h

#include "icrsint.h"

//This class extracts LastName,Country,FirstName from Employees table

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)
        // Column LastName is the 2nd field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_szemp_LastName,
            sizeof(m_szemp_LastName),lemp_LastNameStatus,TRUE)
        // Column Country is the 11th field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(11,adVarChar,m_szemp_Country,
            sizeof(m_szemp_Country),lemp_CountryStatus,TRUE)
            // Column Country is the 17th field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(17,adVarChar,m_szemp_FirstName,
            sizeof(m_szemp_FirstName),lemp_FirstNameStatus,TRUE)
END_ADO_BINDING()

public:
    CHAR m_szemp_LastName[21];
    ULONG lemp_LastNameStatus;
    CHAR m_szemp_Country[16];
    ULONG lemp_CountryStatus;
    CHAR m_szemp_FirstName[11];
    ULONG lemp_FirstNameStatus;
};


Keys Append メソッドと Key Type、RelatedColumn、RelatedTable、UpdateRule プロパティの例 (VC++)

次のコードでは、新規外部キーの作成方法を示します。ここでは、2 つのテーブル (Customers および Orders) が存在すると仮定します。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CreateKeyX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CreateKeyX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        CreateKeyX Function                           //
//                                                      //
//////////////////////////////////////////////////////////
void CreateKeyX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _KeyPtr m_pKeyForeign = NULL;
    _CatalogPtr m_pCatalog   = NULL;

    //Define other variables
    _bstr_t strcnn("Provider=Microsoft.JET.OLEDB.4.0;"
                "Data source = c:\\Program Files\\Microsoft Office\\"
                "Office\\Samples\\Northwind.mdb;");
    try
    {
        TESTHR(hr = m_pKeyForeign.CreateInstance(__uuidof(Key)));
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        m_pCatalog->PutActiveConnection(strcnn);

        // Define the foreign key.
        m_pKeyForeign->Name = "CustOrder";
        m_pKeyForeign->Type = adKeyForeign;
        m_pKeyForeign->RelatedTable = "Customers";
        m_pKeyForeign->Columns->Append("CustomerId",adVarWChar,0);
        m_pKeyForeign->Columns->GetItem("CustomerId")->RelatedColumn =
            "CustomerId";
        m_pKeyForeign->UpdateRule = adRICascade;

        // To pass as column parameter to Key's Apppend method
        _variant_t vOptional;
        vOptional.vt = VT_ERROR;
        vOptional.scode = DISP_E_PARAMNOTFOUND;

        // Append the foreign key.
        m_pCatalog->Tables->GetItem("Orders")->Keys->
            Append(_variant_t((IDispatch *)m_pKeyForeign),
            adKeyPrimary,vOptional,L"",L"");

        // Delete the key as this is a demonstration.
        m_pCatalog->Tables->GetItem("Orders")->Keys->
            Delete(m_pKeyForeign->Name);
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


NumericScale、Precision プロパティの例 (VC++)

この例では、Column オブジェクトの NumericScale および Precision プロパティの機能を示します。このコードでは、Northwind データベースの Order Details テーブルの値を表示します。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void NumericScalePrecX(void);

//////////////////////////////////////////////////////////
//                                                      //
//       Main Function                                  //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    NumericScalePrecX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//          NumericScalePrecX Function                  //
//                                                      //
//////////////////////////////////////////////////////////
void NumericScalePrecX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;
    _ColumnPtr m_pColumn = NULL;

    //Define ADODB object pointers
    ADODB::_ConnectionPtr m_pCnn = NULL;

    //Declare string variables
    _bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;"
        "Data Source=c:\\Program Files\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb;");
    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));

        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));

        // Connect the catalog.
        m_pCnn->Open (strCnn, "", "", NULL);

        m_pCatalog->PutActiveConnection(variant_t((IDispatch *)m_pCnn));

        // Retrieve the Order Details table
        m_pTable = m_pCatalog->Tables->GetItem("Order Details");

        // Display numeric scale and precision of
        // small integer fields.
        _variant_t vIndex;
        for (long lIndex=0; lIndex < m_pTable->Columns->Count; lIndex++)
        {
            vIndex = lIndex ;
            m_pColumn = m_pTable->Columns->GetItem(vIndex);
                if(m_pColumn->Type == adSmallInt)
                {
                    cout << "Column: " << m_pColumn->GetName() << endl;
                    cout << "Numeric scale: " << (_bstr_t) m_pColumn->
                        GetNumericScale() << endl;
                    cout << "Precision: " << m_pColumn->GetPrecision() <<
                        endl;
                }
        }
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Parameters コレクション、Command プロパティの例 (VC++)

次のコードでは、プロシージャのパラメータ情報を取得するための、Command オブジェクトを使用した Command プロパティの使用方法を示します。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ProcedureParametersX(void);

//////////////////////////////////////////////////////////
//                                                      //
//    Main Function                                     //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ProcedureParametersX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      ProcedureParametersX Function                   //
//                                                      //
//////////////////////////////////////////////////////////
void ProcedureParametersX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;

    //Define ADODB object pointers.
    ADODB::_ConnectionPtr m_pCnn = NULL;
    ADODB::_CommandPtr m_pCommand = NULL;
    ADODB::_ParameterPtr m_pParameter = NULL;

    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));

        //Open the Connection
        m_pCnn->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
                "Data Source=c:\\Program Files\\Microsoft Office\\"
                "Office\\Samples\\Northwind.mdb;","","",NULL);

        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));

        //Open the catalog
        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        //Get the command object
        m_pCommand = m_pCatalog->Procedures->GetItem("CustomerById")->
            GetCommand();

        _variant_t vIndex;

        //Retrieve Parameter information
        m_pCommand->Parameters->Refresh();
        for (long lIndex = 0; lIndex < m_pCommand->Parameters->Count;
            lIndex ++)
        {
            vIndex = lIndex;
            m_pParameter = m_pCommand->Parameters->GetItem(vIndex);
            cout << m_pParameter->Name << ":" << m_pParameter->Type <<
                "\n" << endl;
        }
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


ParentCatalog プロパティの例 (VC++)

次のコードでは、テーブルをカタログに追加するより前にプロバイダに固有のプロパティにアクセスするための、ParentCatalog プロパティの使用方法を示します。プロパティは AutoIncrement であり、AutoIncrement フィールドが Microsoft Jet データベース内に作成されます。

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CreateAutoIncrColumnX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CreateAutoIncrColumnX();

     ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       CreateAutoIncrColumnX Function                 //
//                                                      //
//////////////////////////////////////////////////////////
void CreateAutoIncrColumnX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;

    // Define ADODB object pointers.
    ADODB::_ConnectionPtr m_pCnn = NULL;

    //Define string variables
    _bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;"
        "Data Source=c:\\Program Files\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb;");
    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));

        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));

        TESTHR(hr = m_pTable.CreateInstance(__uuidof (Table)));

        // Connect the catalog.
        m_pCnn->Open (strCnn, "", "", NULL);

        m_pCatalog->PutActiveConnection(variant_t((IDispatch *)m_pCnn));

        m_pTable->Name="MyContacts";
        m_pTable->ParentCatalog = m_pCatalog;

        // Create fields and append them to the new Table object.
        m_pTable->Columns->Append("ContactId", adInteger,0);

        // Make the ContactId column and auto incrementing column
        m_pTable->Columns->GetItem("ContactId")->Properties->
            GetItem("AutoIncrement")->Value = true;
        m_pTable->Columns->Append("CustomerID", adVarWChar,0);
        m_pTable->Columns->Append("FirstName", adVarWChar,0);
        m_pTable->Columns->Append("LastName", adVarWChar,0);
        m_pTable->Columns->Append("Phone", adVarWChar, 20);
        m_pTable->Columns->Append("Notes", adLongVarWChar,0);
        m_pCatalog->Tables->Append(_variant_t((IDispatch*)m_pTable));

        // データベースを更新します。
        m_pCatalog->Tables->Refresh();

        // Delete new table, since this is only an example
        m_pCatalog->Tables->Delete("MyContacts");

        m_pCatalog = NULL;
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


PrimaryKey、Unique プロパティの例 (VC++)

この例では、Index の PrimaryKey および Unique プロパティの機能を示します。このコードで、2 列を含む新しいテーブルを作成します。PrimaryKey および Unique プロパティを使用して 1 列を主キーにし、重複した値を入力できないようにします。

#import "c:\program files\common files\system\ado\msadox.dll" \
    no_namespace
#import "c:\program files\common files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function Declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void PrimaryKeyX(void);

//////////////////////////////////////////////////////////
//                                                      //
//    Main Function                                     //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    PrimaryKeyX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        PrimaryKeyX Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void PrimaryKeyX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTableNew = NULL;
    _IndexPtr m_pIndexNew  = NULL;
    _IndexPtr m_pIndex  = NULL;
    _ColumnPtr m_pColumn = NULL;

    //Define string variable
    _bstr_t strcnn("Provider=Microsoft.JET.OLEDB.4.0;"
        "Data Source = c:\\Program Files\\"
        "Microsoft Office\\Office\\Samples\\Northwind.mdb;");

    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));
        TESTHR(hr = m_pTableNew.CreateInstance(__uuidof(Table)));
        TESTHR(hr = m_pIndexNew.CreateInstance(__uuidof(Index)));
        TESTHR(hr = m_pIndex.CreateInstance(__uuidof(Index)));
        TESTHR(hr = m_pColumn.CreateInstance(__uuidof(Column)));

        // Connect the catalog
        m_pCatalog->PutActiveConnection(strcnn);

        // Name new table
        m_pTableNew->Name = "NewTable";

        // Append a numeric and a text field to new table.
        m_pTableNew->Columns->Append("NumField", adInteger, 20);
        m_pTableNew->Columns->Append("TextField", adVarWChar, 20);

        // Append new Primary Key index on NumField column
        // to new table
        m_pIndexNew->Name = "NumIndex";
        m_pIndexNew->Columns->Append("NumField",adInteger,0);
        // here "-1" is required instead of "true".
        m_pIndexNew->PutPrimaryKey(-1);
        m_pIndexNew->PutUnique(-1);
        m_pTableNew->Indexes->Append(
            _variant_t ((IDispatch*)m_pIndexNew));

        // Append an index on Textfield to new table.
        // Note the different technique: Specifying index and
        // column name as parameters of the Append method
        m_pTableNew->Indexes->Append("TextIndex", "TextField");

        // Append the new table
        m_pCatalog->Tables->Append(_variant_t ((IDispatch*)m_pTableNew));

        cout << m_pTableNew->Indexes->Count << " Indexes in "
            << m_pTableNew->Name << " Table" << endl;
        m_pCatalog->Tables->Refresh();

        _variant_t vIndex;
        // Enumerate Indexes collection.
        for (long lIndex = 0;lIndex < m_pTableNew->Indexes->Count;
             lIndex++)
        {
            vIndex = lIndex;
            m_pIndex = m_pTableNew->Indexes->GetItem(vIndex);
            cout << "Index " << m_pIndex->Name << endl;
            cout << "   Primary key = " << (m_pIndex->GetPrimaryKey() ?
                "True" : "False") << endl;
            cout << "   Unique = "  << (m_pIndex->GetUnique() ? "True" :
                "False") << endl;

            // Enumerate Columns collection of each Index
            // object.
            cout << "    Columns" << endl;

            for (long lIndex = 0;lIndex < m_pIndex->Columns->Count;
                 lIndex++)
            {
                vIndex = lIndex  ;
                m_pColumn = m_pIndex->Columns->GetItem(vIndex);
                cout << "       " << m_pColumn->Name << endl;
            }
        }

        // Delete new table as this is a demonstration
        m_pCatalog->Tables->Delete(m_pTableNew->Name);
        m_pCatalog = NULL;
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
              (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Microsoft ADO MD プログラマーズ リファレンス

Microsoft® ActiveX® Data Objects (Multidimensional) (ADO MD) を使用すると、Microsoft Visual Basic®、Microsoft Visual C++®、および Microsoft® Visual J++™ などの言語から多次元データへ簡単にアクセスすることができます。ADO MD は Microsoft ActiveX® Data Objects (ADO) の拡張機能で、CubeDef および Cellset オブジェクトのような多次元データに固有のオブジェクトを含みます。

ADO MD を使用すれば、多次元スキーマを参照したり、キューブに対してクエリを実行したり、また、結果を取得することができます。

ADO MD は、ADO と同様に、基になる OLE DB プロバイダを使ってデータにアクセスします。ADO MD を使って作業するには、プロバイダが、OLAP 仕様のための OLE DB の定義を満たしている多次元データ プロバイダ (MDP) であることが必要です。MDP では、表形式ビューでデータが表される表形式のデータ プロバイダ (TDP) とは対照的に、多次元ビューでデータが表されます。プロバイダがサポートする特定の構文および動作の詳細については、OLAP OLE DB プロバイダのマニュアルを参照してください。

このドキュメントは、Visual Basic プログラミング言語を使用できる知識、および ADO や OLAP についての一般的な知識があることを前提としています。詳細については、「Microsoft ADO プログラマーズ リファレンス」および「OLE DB for OLAP Programmer's Reference」を参照してください。ADO MD に関する概要については、次のトピックを参照してください。

  • ADO MD の最新情報

  • 多次元スキーマおよびデータの概要

  • 多次元データの利用

  • ADO MD を用いた ADO の使用

  • ADO MD を使用したプログラミング

  • ADO MD オブジェクト モデル


ADO MD の最新情報

ADO MD コードの例

Visual Basic の例はより充実したものになり、Visual Basic, Scripting Edition での例も追加されています。これらのコード例をコピーして、使用するエディタに貼り付けることができます。


多次元スキーマおよびデータの概要

多次元スキーマの解説

"キューブ" は、ADO MD の中心的なメタデータ オブジェクトで、関連する次元、階層、レベル、およびメンバの構造化セットで構成されています。

"次元" は、多次元データベースから独立したデータの分類で、ビジネス エンティティから派生します。通常、次元にはデータベース処理のためのクエリ抽出条件として使用される項目が含まれています。

"階層" は、次元の集合のパスです。次元には、さまざまな高さのレベルがあって、それらが親子関係にあります。階層は、これらのレベルの関連を定義します。

"レベル" は、階層の一段落の集合です。複数の情報層を持つ次元では、それぞれの層がレベルになります。

"メンバ" は、次元にあるデータ アイテムです。メンバは、通常、キャプションを作成したり、データベースの基準を記述するために使用されます。

キューブは、ADO MD の CubeDef オブジェクトによって表されます。次元、階層、レベル、およびメンバも、Dimension、Hierarchy、Level、Member などの対応する ADO MD オブジェクトによって表されます。

次元

キューブの次元は、ビジネス エンティティおよびデータベースのモデル化されたデータの型によって異なります。通常、それぞれの次元は、独立したエントリ ポイントまたはデータを選択するメカニズムです。

たとえば、売り上げデータを含むキューブには、次の 5 つの次元があります。Salesperson、Geography、Time、Products、および Measures です。Measures 次元には実際の売り上げデータ値が入り、その他の次元には売り上げデータ値を分類およびグループ化する方法を表現します。

Geography 次元には、次のようなメンバのセットがあります。

{All, North America, Europe, Canada, USA, UK, Germany, Canada-West,
Canada-East, USA-NW, USA-SW, USA-NE, USA-SE, England, Scotland,
Wales,Ireland, Germany-North, Germany-South, Ottawa, Toronto,
Vancouver, Calgary, Seattle, Boise, Los Angeles, Houston,
Shreveport, Miami, Boston, New York, London, Dover, Glasgow,
Edinburgh, Cardiff, Pembroke, Belfast, Londonderry, Berlin,
Hamburg, Munich, Stuttgart}

階層

階層は、次元のレベルを "ロール アップ" またはグループ化する方法を定義します。次元には、1 つ以上の階層を含めることができます。Geography 次元には、固有の階層があります。

レベル

前の図で示された Geography 次元の例で、それぞれのボックスは階層のレベルを表します。

それぞれのレベルには、次のようなメンバのセットがあります。

  • The World = {All}

  • Continents = {North America, Europe}

  • Countries = {Canada, USA, UK, Germany}

  • Regions = {Canada-East, Canada-West, USA-NE, USA-NW, USA-SE, USA-SW, England, Ireland, Scotland, Wales, Germany-North, Germany-South}

  • Cities = {Ottawa, Toronto, Vancouver, Calgary, Seattle, Boise, Los Angeles, Houston, Shreveport, Miami, Boston, New York, London, Dover, Glasgow, Edinburgh, Cardiff, Pembroke, Belfast, Londonderry, Berlin, Hamburg, Munich, Stuttgart}

メンバ

階層のリーフ レベルのメンバは子を持たず、ルート レベルのメンバは親を持ちません。その他すべてのメンバは、少なくとも 1 つの親と 1 つの子を持ちます。たとえば、Geography 次元の階層ツリーを部分的に見てみると、次のような親子関係があります。

  • {All} (親) {Europe, North America} (子)

  • {North America} (親) {Canada, USA} (子)

  • {USA} (親) {USA-NE, USA-NW, USA-SE, USA-SW} (子)

  • {USA-NW} (親) {Boise, Seattle} (子)

メンバは、次元ごとに 1 つ以上の階層ごとにまとめることができます。Time 次元を見てみると、Days レベルから Year レベルにロール アップする方法は、2 つあります。

また、この例はほかの特性も示しています。Year-Week 階層の Week レベルのいくつかのメンバは、Year-Quarter 階層のどのレベルにも表示されません。したがって、1 つの階層に次元のすべてのメンバを含める必要はありません。


多次元データの利用

"セルセット" は、多次元データでのクエリ結果です。セルセットは軸の集合で構成されます。多くの場合、軸の数は 4 個以下で、2 個または 3 個の軸で構成されるものが一般的です。"軸" は 1 つまたは複数の次元からのメンバの集まりで、キューブに特定の値を配置またはフィルタするために使われます。

"位置" は、軸上の点です。軸が単一の次元で構成されている場合、これらの位置は次元のメンバのサブセットです。軸が複数の次元で構成されている場合、それぞれの位置は n 個のパーツを持つ独立した点の集合です。ここで n は、その軸上に置かれた次元数です。それぞれの位置のパーツは、次元を構成するメンバの 1 つです。

たとえば、売り上げデータを含むキューブの Geography および Product の次元がセルセットの x‐軸上に置かれた場合、この軸上のある位置には "USA" および "Computers" というメンバが含まれています。この例では、x‐軸上の位置を決定するには、各次元のメンバが、その軸上に置かれている必要があります。

"セル" は、座標軸の交点に位置するオブジェクトです。それぞれのセルには、セル自体のデータ、フォーマットされた文字列 (表示可能な形でのセル データ)、およびセルの序数値などの、セルに関連した多くの情報が備わっています (それぞれのセルは、セルセット内で一意で、順序だった値を持ちます。セルセットの最初にあるセルの序数値は 0 で、セルセットに 8 つの列があるときの 2 行目の 1 番左側のセルの序数値は 8 になります)。

たとえば、あるキューブには次の 6 つの次元があります (このキューブ スキーマは、「多次元スキーマおよびデータの概要」での例とは多少異なっています)。

  • Salesperson

  • Geography (natural hierarchy) - Continents、Countries、States など

  • Quarters - Quarters、Months、Days

  • Years

  • Measures - Sales、PercentChange、BudgetedSales

  • Products

次の図は、すべての製品についての 1991 年度の売り上げを表しています。

注意 この例のセルの値は、最初の桁が x‐軸の位置を表し、2 番目の桁が y‐軸の位置を表す序数値のペアとして見ることができます。

このセルセットには、次のような特性があります。

  • 軸の次元: Quarters、Salesperson、Geography

  • フィルタの次元: Measures、Years、Products

  • 2 つの軸: COLUMN (x、または Axis 0) および ROW (y、または Axis 1)

  • x-軸: Salesperson および Geography の 2 つのネストした次元

  • y-軸: Quarters 次元

x-軸には、Salesperson および Geography の 2 つのネストした次元があります。Geography から、Seattle、Boston、USA-South、および Japan という 4 つのメンバが選択されます。Salesperson からは、Valentine および Nash の 2 つのメンバが選択されます。これにより、この軸上には合計して 8 つ (8 = 4*2) の位置が生じます。

それぞれの座標は、Salesperson 次元からと、Geography 次元からの 2 つのメンバの位置として表されます。

(Valentine, Seattle), (Valentine, Boston), (Valentine, USA_North),
(Valentine, Japan), (Nash, Seattle), (Nash, Boston), (Nash, USA_North),
(Nash, Japan)

y-軸にあるのは 1 次元のみで、次の 8 つの位置を含みます。

Jan, Feb, Mar, Qtr2, Qtr3, Oct, Nov, Dec

セルセット、セル、軸、および位置はすべて、対応する ADO MD のオブジェクトである Cellset、Cell、Axis、および Position によって表されます。


ADO MD を用いた ADO の使用

ADO および ADO MD は、関連はしていますが別々のオブジェクト モデルです。ADO には、データ ソースへの接続、コマンドの実行、表形式のデータおよび表形式のスキーマ メタデータの取得、およびプロバイダのエラー情報の表示のためのオブジェクトが用意されています。ADO MD には、多次元データ取得および多次元スキーマ メタデータ表示のためのオブジェクトが用意されています。

MDP で作業する場合、作成するアプリケーションで ADO、ADO MD、または両方を使うことができます。プロジェクトで両方のライブラリへの参照を確立すれば、MDP によって提供されるすべての機能に完全にアクセスできるようになります。

これは、利用者が多次元データセットの単層化した表形式ビューを取得する場合に便利です。これを実行するには、ADO Recordset オブジェクトを使用します。Cellset のソースを指定する場合は、ADO MD Cellset のソースとしてではなく、Recordset の Open メソッドの Source パラメータとして指定します。

また、オブジェクトの階層としてではなく、表形式ビューでスキーマ メタデータを表示する場合に便利です。Connection オブジェクトの ADO OpenSchema メソッドを使用すると、ユーザーはスキーマ情報を含む Recordset を開くことができます。OpenSchema メソッドの QueryType パラメータには、次のような MDP に特に関連する SchemaEnum 値がいくつか含まれています。

  • adSchemaCubes

  • adSchemaDimensions

  • adSchemaHierarchies

  • adSchemaLevels

  • adSchemaMeasures

  • adSchemaMembers

ADO 列挙値を ADO MD プロパティまたはメソッドで使用するには、プロジェクトで ADO および ADO MD ライブラリの両方を参照する必要があります。たとえば、ADO adState 列挙値は ADO MD State プロパティで使用することができます。ライブラリへの参照確立の詳細については、使用する開発ツールのマニュアルを参照してください。

ADO オブジェクトおよびメソッドの詳細については、「Microsoft ADO プログラマーズ リファレンス」を参照してください。


ADO MD を使用したプログラミング

開発ツールで ADO MD を使用するには、ADO MD タイプ ライブラリへの参照を確立する必要があります。ADO MD ライブラリとは、Microsoft ActiveX Data Objects (Multi-dimensional) Library のことです。ADO MD ライブラリのファイル名は Msadomd.dll で、プログラム ID (ProgID) は、"ADOMD" です。ライブラリへの参照確立の詳細については、開発ツールのマニュアルを参照してください。


ADO MD API リファレンス

ADO MD マニュアルのこのセクションには、ADO MD オブジェクト、コレクション、メソッド、およびプロパティのそれぞれのトピックに加えて、必要に応じてサンプル コードも含まれています。詳細については、特定の項目をキーワードで検索するか、次の項目を参照してください。

  • ADO MD オブジェクト

  • ADO MD コレクション

  • ADO MD プロパティ

  • ADO MD メソッド

  • ADO MD 列挙定数

  • ADO MD コードの例


ADO MD オブジェクト モデル

次の図は、ADO MD でこれらのオブジェクトがどのように表され、関連付けられているかを示しています。

Axis および Cell オブジェクトには、それぞれ Positions コレクションがあります。

Level および Position オブジェクトには、それぞれ Members コレクションがあります。

Axis、Cell、Cellset、CubeDef、Dimension、Hierarchy、Level、および Member オブジェクトには、それぞれ標準の ADO Properties コレクションがあります。


ADO MD オブジェクト

ADO MD オブジェクトの概要

オブジェクト | 説明
Axis | 1 つまたは複数の次元の選択されたメンバを含む、セルセットの、位置の軸またはフィルタ軸を表します。
Catalog | MDP (多次元データ プロバイダ) が持つ固有の多次元スキーマ情報 (キューブおよび基になる次元、階層、レベル、およびメンバ) を含みます。
Cell | セルセットに含まれた、座標軸の交点にあるデータを表します。
Cellset | 多次元クエリの結果を表します。これはキューブまたはその他のセルセットから選択されたセルのコレクションです。
CubeDef | 関連する次元のセットを含む、多次元スキーマからのキューブを表します。
Dimension | 1 つまたは複数のメンバの階層を含む、多次元キューブの次元の 1 つを表します。
Hierarchy | 次元のメンバを集計または "ロール アップ" できる方法の 1 つを表します。次元は、1 つまたは複数の階層ごとに集計できます。
Level | それぞれが階層内において同じランクを持つメンバのセットを含みます。
Member | キューブ内のレベルのメンバ、レベルのメンバの子、またはセルセットの軸に沿った位置のメンバを表します。
Position | 軸に沿ったポイントを定義する、異なる次元の 1 つまたは複数のメンバのセットを表します。

また、Catalog オブジェクトは、標準 ADO ライブラリに含まれる ADO Connection オブジェクトに接続されます。

オブジェクト | 説明
Connection | データ ソースへの開いた接続を表します。

これらのオブジェクト間の関係については、「ADO MD オブジェクト モデル」を参照してください。

多くの ADO MD オブジェクトは、対応するコレクションに含めることができます。たとえば、CubeDef オブジェクトは、Catalog の CubeDefs コレクションに含めることができます。詳細については、「ADO MD コレクション」を参照してください。


Axis オブジェクト (ADO MD)

Axis オブジェクト

1 つまたは複数の次元の選択されたメンバを含む、セルセットの位置またはフィルタの軸を表します。

解説

Axis オブジェクトは、Axes コレクションに含めたり、Cellset の FilterAxis プロパティによって返すことができます。

Axis オブジェクトのコレクションおよびプロパティを使用すると、次のことができます。

  • Name プロパティで、Axis を識別します。

  • Positions コレクションで、Axis に沿ってそれぞれの位置を反復します。

  • DimensionCount プロパティで、Axis 上の次元数を取得します。

  • 標準の ADO Properties コレクションで、プロバイダに固有の Axis の属性を取得します。


Catalog オブジェクト (ADO MD)

Catalog オブジェクト

MDP (多次元データ プロバイダ) に固有の多次元スキーマ情報 (つまり、キューブおよび基になる次元、階層、レベル、およびメンバ) を含みます。

解説

Catalog オブジェクトのコレクションおよびプロパティを使用すると、次のことができます。

  • ActiveConnection プロパティに標準 ADO Connection オブジェクトまたは有効な接続文字列を設定することによって、カタログを開きます。

  • Name プロパティで、Catalog を識別します。

  • CubeDefs コレクションで、カタログ内のキューブを反復します。


Cell オブジェクト (ADO MD)

Cell オブジェクト

セルセットに含まれる座標軸の交点にあるデータを表します。

解説

Cell オブジェクトは、Cellset オブジェクトの Item プロパティによって返されます。

Cell オブジェクトのコレクションおよびプロパティを使用すると、次のことができます。

  • Value プロパティで、Cell 内のデータを返します。

  • FormattedValue プロパティで、Value プロパティの書式設定の文字列を返します。

  • Ordinal プロパティで、Cellset 内にある Cell の序数値を返します。

  • Positions コレクションで、CubeDef 内の Cell の位置を調べます。

  • 標準の ADO Properties コレクションで、Cell に関するその他の情報を取得します。

Properties コレクションには、プロバイダによって提供されるプロパティが含まれます。次の表は、利用できるプロパティの一覧です。プロバイダによっては、実際に使用できるプロパティの一覧が異なる場合があります。利用可能なプロパティのさらに詳細な一覧については、プロバイダのマニュアルを参照してください。

名前 | 説明
BackColor | セルを表示するときの背景色です。
FontFlags | フォント上のビットマスク細部効果です。
FontName | セル値を表示するために使用するフォントです。
FontSize | セル値を表示するために使用するフォントのサイズです。
ForeColor | セルを表示するときの前景色です。
FormatString | フォーマット済み文字列の値です。


Cellset オブジェクト (ADO MD)

Cellset オブジェクト

多次元クエリの結果を表します。これはキューブまたはその他のセルセットから選択されたセルのコレクションです。

解説

Cellset 内のデータは、配列のように直接アクセスを用いて取得されます。特定のメンバに "ドリルで穴を掘るように" して、そのメンバに関するデータを取得できます。たとえば、次のコードでは、cst という名前のセルセットの、最初の軸の最初の位置にある、最初のメンバのキャプションを返します。

cst.Axes(0).Positions(0).Members(0).Caption

セルセット内では、カレント セルの概念はありません。代わりに、Item プロパティによってセルセットから特定の Cell オブジェクトが取得されます。Item プロパティの引数によって、どのセルを取得するかが決定されます。セルの一意の序数値を指定することもできます。また、セルセットのそれぞれの軸に沿ったセルの位置番号を使用して、そのセルを取得できます。セルの取得に関する詳細については、Item プロパティを参照してください。

Cellset オブジェクトのコレクション、メソッド、およびプロパティを使用すると、次のことができます。

  • Cellset オブジェクトの ActiveConnection プロパティを設定して、開いている接続と Cellset オブジェクトを関連付けます。

  • Open メソッドで、多次元クエリの実行および結果の取得を行います。

  • Item プロパティで、Cellset から Cell を取得します。

  • Axes コレクションで、Cellset を定義する Axis オブジェクトを返します。

  • FilterAxis プロパティで、Cellset 内のデータにフィルタを使用した次元の情報を取得します。

  • Source プロパティで、Cellset を定義するために使用されるクエリを返すか、または指定します。

  • State プロパティで、Cellset の現在の状態 (開いている、閉じている、実行中、または接続中) を返します。

  • Close メソッドで、開いている Cellset を閉じます。

  • 標準の ADO Properties コレクションで、Cellset に関するプロバイダに固有の情報を取得します。


CubeDef オブジェクト (ADO MD)

CubeDef オブジェクト

関連する次元のセットを含む、多次元スキーマからのキューブを表します。

解説

CubeDef オブジェクトのコレクションおよびプロパティを使用すると、次のことができます。

  • Name プロパティで、CubeDef を識別します。

  • Description プロパティで、キューブを説明する文字列を返します。

  • Dimensions コレクションで、キューブを構成する次元を返します。

  • 標準の ADO Properties コレクションで、CubeDef についての追加情報を取得します。

Properties コレクションには、プロバイダによって提供されるプロパティが含まれます。次の表は、利用できるプロパティの一覧です。プロバイダによっては、実際に使用できるプロパティの一覧が異なる場合があります。利用可能なプロパティのさらに詳細な一覧については、プロバイダのマニュアルを参照してください。

名前 | 説明
CatalogName | キューブが属するカタログの名前です。
CreatedOn | キューブ作成の日時です。
CubeGUID | キューブの GUID (Globally Unique Identifier) です。
CubeName | キューブの名前です。
CubeType | キューブの種類です。
DataUpdatedBy | 最後のデータ更新を行ったユーザーのユーザー ID です。
Description | キューブの詳しい説明です。
LastSchemaUpdate | 最後のスキーマ更新の日時です。
SchemaName | キューブが属するスキーマの名前です。
SchemaUpdatedBy | 最後のスキーマ更新を行ったユーザーのユーザー ID です。


Dimension オブジェクト (ADO MD)

Dimension オブジェクト

1 つまたは複数のメンバの階層を含む、多次元キューブの次元の 1 つを表します。

解説

Dimension オブジェクトのコレクションおよびプロパティを使用すると、次のことができます。

  • Name および UniqueName プロパティで、Dimension を識別します。

  • Description プロパティで、Dimension を詳しく説明する文字列を返します。

  • Hierarchies コレクションで、Dimension を構成する Hierarchy オブジェクトを返します。

  • 標準の ADO Properties コレクションを使って、Dimension オブジェクトについての追加情報を取得します。

Properties コレクションには、プロバイダによって提供されるプロパティが含まれます。次の表は、利用できるプロパティの一覧です。プロバイダによっては、実際に使用できるプロパティの一覧が異なる場合があります。利用可能なプロパティのさらに詳細な一覧については、プロバイダのマニュアルを参照してください。

名前 | 説明
CatalogName | キューブが属するカタログの名前です。
CubeName | キューブの名前です。
DefaultHierarchy | 既定の階層の一意の名前です。
Description | キューブの詳しい説明です。
DimensionCaption | 次元に関連付けられたラベルまたはキャプションです。
DimensionCardinality | 次元内のメンバ数です。
DimensionGUID | 次元の GUID (Globally Unique Identifier) です。
DimensionName | 次元の名前です。
DimensionOrdinal | キューブを形成する次元のグループ間での次元の序数です。
DimensionType | 次元の種類です。
DimensionUniqueName | 次元の一意の名前です。
SchemaName | キューブが属するスキーマの名前です。


Hierarchy オブジェクト (ADO MD)

Hierarchy オブジェクト

次元のメンバを集計または "ロール アップ" できる 1 つの方法を表します。次元は、1 つまたは複数の階層ごとに集計できます。

解説

Hierarchy オブジェクトのコレクションおよびプロパティを使用すると、次のことができます。

  • Name および UniqueName プロパティで、Hierarchy を識別します。

  • Description プロパティで、Hierarchy を詳しく説明する文字列を返します。

  • Levels コレクションで、Hierarchy を構成する Level オブジェクトを返します。

  • 標準の ADO Properties コレクションを使って、Hierarchy オブジェクトについての追加情報を取得します。

Properties コレクションには、プロバイダによって提供されるプロパティが含まれます。次の表は、利用できるプロパティの一覧です。プロバイダによっては、実際に使用できるプロパティの一覧が異なる場合があります。利用可能なプロパティのさらに詳細な一覧については、プロバイダのマニュアルを参照してください。

名前 | 説明
AllMember | 階層内でロールアップの最上レベルにあるメンバです。
CatalogName | キューブが属するカタログの名前です。
CubeName | キューブの名前です。
DefaultMember | この階層の既定のメンバの一意の名前です。
Description | 階層の詳しい説明です。
DimensionType | この階層が属する次元の種類です。
DimensionUniqueName | 次元の一意の名前です。
HierarchyCaption | 階層に関連付けられたラベルまたはキャプションです。
HierarchyCardinality | 階層内のメンバ数です。
HierarchyGUID | 階層の GUID (Globally Unique Identifier) です。
HierarchyName | 階層の名前です。
HierarchyUniqueName | 階層の一意の名前です。
SchemaName | キューブが属するスキーマの名前です。


Level オブジェクト (ADO MD)

Level オブジェクト

それぞれが階層内において同じランクを持つメンバのセットを含みます。

解説

Level オブジェクトのコレクションおよびプロパティを使用すると、次のことができます。

  • Name および UniqueName プロパティで、Level を識別します。

  • Caption プロパティで、Level を表示するときに使用する文字列を返します。

  • Description プロパティで、Level を詳しく説明する文字列を返します。

  • Members コレクションで、Level を構成する Member オブジェクトを返します。

  • Depth プロパティで、Level のルートからのレベル数を返します。

  • 標準の ADO Properties コレクションを使って、Level オブジェクトについての追加情報を取得します。

Properties コレクションには、プロバイダによって提供されるプロパティが含まれます。次の表は、利用できるプロパティの一覧です。プロバイダによっては、実際に使用できるプロパティの一覧が異なる場合があります。利用可能なプロパティのさらに詳細な一覧については、プロバイダのマニュアルを参照してください。

名前 | 説明
CatalogName | キューブが属するカタログの名前です。
CubeName | キューブの名前です。
Description | レベルについての詳しい説明です。
DimensionUniqueName | 次元の一意の名前です。
HierarchyUniqueName | 階層の一意の名前です。
LevelCaption | レベルに関連付けられたラベルまたはキャプションです。
LevelCardinality | レベル内のメンバ数です。
LevelGUID | レベルの GUID (Globally Unique Identifier) です。
LevelName | レベルの名前です。
LevelNumber | レベルと階層のルートの間の距離です。
LevelType | レベルの種類です。
LevelUniqueName | レベルの一意の名前です。
SchemaName | キューブが属するスキーマの名前です。


Member オブジェクト (ADO MD)

Member オブジェクト

キューブ内のレベルのメンバ、レベルのメンバの子、またはセルセットの軸に沿った位置のメンバを表します。

解説

Member のプロパティは、使用されるコンテキストによって異なります。CubeDef 内の Level の Member には、カレント Member の次に低いレベルの階層内の Members を返す Children プロパティがあります。Position の Member では、Children コレクションは常に空です。また、Type プロパティは Level の Members にのみ適用されます。

Position の Member には、DrilledDown と ParentSameAsPrev という 2 つのプロパティがあり、Cellset を表示するときに役立ちます。これらのプロパティが Level の Member でアクセスされた場合は、エラーが発生します。

Level の Member オブジェクトのコレクションおよびプロパティを使用すると、次のことができます。

  • Name および UniqueName プロパティで、Member を識別します。

  • Caption プロパティで、Member を表示するときに使用する文字列を返します。

  • Description プロパティで、単位または数式 Member を詳しく説明する文字列を返します。

  • Type プロパティで、Member の属性を判別します。

  • LevelDepth および LevelName プロパティで、Member の Level に関する情報を取得します。

  • Parent および Children プロパティで、Hierarchy 内の関連する Members を取得します。

  • ChildCount プロパティで、Member の子の数を数えます。

  • 標準の ADO Properties コレクションを使って、Level オブジェクトについての追加情報を取得します。

Axis に沿った Position の Member のコレクションおよびプロパティを使用すると、次のことができます。

  • Name および UniqueName プロパティで、Member を識別します。

  • Caption プロパティで、Member を表示するときに使用する文字列を返します。

  • Description プロパティで、単位または数式 Member を詳しく説明する文字列を返します。

  • LevelDepth および LevelName プロパティで、Member の Level に関する情報を取得します。

  • ChildCount プロパティで、Member の子の数を数えます。

  • DrilledDown プロパティを使って、この Member の直後の Axis 上に少なくとも 1 つの子があるかどうか調べます。

  • ParentSameAsPrev プロパティを使って、この Member の親が直前の Member の親と同じかどうか調べます。

  • 標準の ADO Properties コレクションを使って、Level オブジェクトについての追加情報を取得します。

Properties コレクションには、プロバイダによって提供されるプロパティが含まれます。次の表は、利用できるプロパティの一覧です。プロバイダによっては、実際に使用できるプロパティの一覧が異なる場合があります。利用可能なプロパティのさらに詳細な一覧については、プロバイダのマニュアルを参照してください。

名前 | 説明
CatalogName | キューブが属するカタログの名前です。
ChildrenCardinality | メンバが持つ子の数です。
CubeName | キューブの名前です。
Description | メンバの詳しい説明です。
DimensionUniqueName | 次元の一意の名前です。
HierarchyUniqueName | 階層の一意の名前です。
LevelNumber | 階層のルートからそのレベルまでの間隔です。
LevelUniqueName | レベルの一意の名前です。
MemberCaption | メンバに関連付けられたラベルまたはキャプションです。
MemberGUID | メンバの GUID (Globally Unique Identifier) です。
MemberName | メンバの名前です。
MemberOrdinal | メンバの序数です。
MemberType | メンバの種類です。
MemberUniqueName | メンバの一意の名前です。
ParentCount | このメンバが持つ親の数のカウントです。
ParentLevel | メンバの親のレベル数です。
ParentUniqueName | メンバの親の一意の名前です。
SchemaName | キューブが属するスキーマの名前です。


Position オブジェクト (ADO MD)

Position オブジェクト

軸に沿ったポイントを定義する、異なる次元の 1 つまたは複数のメンバのセットを表します。

解説

Position オブジェクトのプロパティおよびコレクションを使用すると、次のことができます。

  • Ordinal プロパティを使って、Axis に沿った Position の位置 (インデックス) を返します。

  • Members コレクションを使って、Axis に沿った位置を構成するメンバを返します。


ADO MD コレクション

ADO MD コレクションの概要

コレクション | 説明
Axes | セルセットを定義する Axis オブジェクトを含みます。
CubeDefs | 多次元カタログからなるキューブを表す CubeDef オブジェクトを含みます。
Dimensions | キューブを構成する Dimension オブジェクトを含みます。
Hierarchies | 次元からなる Hierarchy オブジェクトのセットを含みます。
Levels | 階層を構成する Level オブジェクトを含みます。
Members | レベルまたは軸に沿った位置からの Member オブジェクトを含みます。
Positions | 軸のポイントを定義する Position オブジェクトを含みます。


Axes コレクション (ADO MD)

Axes コレクション

セルセットを定義する Axis オブジェクトを含みます。

解説

Cellset オブジェクトには、Axes コレクションが含まれます。一度 Cellset が開かれると、このコレクションには少なくとも 1 つの Axis が含まれます。Axis オブジェクトの使用方法の詳細については、Axis オブジェクトを参照してください。

注意 Cellset のフィルタ軸は、Axes コレクションには含まれません。詳細については、FilterAxis プロパティを参照してください。

Axes は、標準の ADO コレクションです。このコレクションのプロパティおよびメソッドを使用すると、次のことができます。

  • Count プロパティで、コレクションに含まれているオブジェクトの数を取得します。

  • 既定の Item プロパティで、コレクションからオブジェクトを返します。

  • Refresh メソッドで、プロバイダのコレクションにあるオブジェクトを更新します。


CubeDefs コレクション (ADO MD)

CubeDefs コレクション

多次元カタログからなるキューブを表す CubeDef オブジェクトを含みます。

解説

CubeDefs は、標準の ADO コレクションです。コレクションのプロパティおよびメソッドを使用すると、次のことができます。

  • Count プロパティで、コレクションに含まれているオブジェクトの数を取得します。

  • 既定の Item プロパティで、コレクションからオブジェクトを返します。

  • Refresh メソッドで、プロバイダのコレクションにあるオブジェクトを更新します。


Dimensions コレクション (ADO MD)

Dimensions コレクション

キューブを構成する Dimension オブジェクトを含みます。

解説

Dimensions は、標準の ADO コレクションです。コレクションのプロパティおよびメソッドを使用すると、次のことができます。

  • Count プロパティで、コレクションに含まれているオブジェクトの数を取得します。

  • 既定の Item プロパティで、コレクションからオブジェクトを返します。

  • Refresh メソッドで、プロバイダのコレクションにあるオブジェクトを更新します。


Hierarchies コレクション (ADO MD)

Hierarchies コレクション

次元からなる Hierarchy オブジェクトのセットを含みます。

解説

Hierarchies は、標準の ADO コレクションです。コレクションのプロパティおよびメソッドを使用すると、次のことができます。

  • Count プロパティで、コレクションに含まれているオブジェクトの数を取得します。

  • 既定の Item プロパティで、コレクションからオブジェクトを返します。

  • Refresh メソッドで、プロバイダのコレクションにあるオブジェクトを更新します。


Levels コレクション (ADO MD)

Levels コレクション

階層を構成する Level オブジェクトを含みます。

解説

Levels は、標準の ADO コレクションです。コレクションのプロパティおよびメソッドを使用すると、次のことができます。

  • Count プロパティで、コレクションに含まれているオブジェクトの数を取得します。

  • 既定の Item プロパティで、コレクションからオブジェクトを返します。

  • Refresh メソッドで、プロバイダのコレクションにあるオブジェクトを更新します。


Members コレクション (ADO MD)

Members コレクション

レベルまたは軸に沿った位置からの Member オブジェクトを含みます。

解説

Members コレクションを使用して、次のメンバの種類を追加します。

  • キューブのレベルを構成するメンバ。Level オブジェクトの Members コレクションに含まれます。たとえば、「多次元スキーマおよびデータの概要」のサンプルを使用した場合、Countries レベルのメンバは、Canada、USA、UK、および Germany の 4 つです。

  • 階層内の特定のメンバの子メンバ。これらのメンバは、親の Member オブジェクトの Children プロパティによって返されます。たとえば、前の項と同じサンプルを使用した場合、Canada メンバの子は Canada-East および Canada-West の 2 つです。

  • セルセットの軸に沿った特定の位置を定義するメンバ。たとえば、「多次元データの利用」のセルセットを使用した場合、x-軸上の最初の位置にあるメンバは、Valentine および Seattle の 2 つです。これらのメンバは、Position オブジェクトの Members コレクションに含まれています。

Members は、標準の ADO コレクションです。コレクションのプロパティおよびメソッドを使用すると、次のことができます。

  • Count プロパティで、コレクションに含まれているオブジェクトの数を取得します。

  • 既定の Item プロパティで、コレクションからオブジェクトを返します。

  • Refresh メソッドで、プロバイダのコレクションにあるオブジェクトを更新します。


Positions コレクション (ADO MD)

Positions コレクション

軸のポイントを定義する Position オブジェクトを含みます。

解説

Positions は、標準の ADO コレクションです。コレクションのプロパティおよびメソッドを使用すると、次のことができます。

  • Count プロパティで、コレクションに含まれているオブジェクトの数を取得します。

  • 既定の Item プロパティで、コレクションからオブジェクトを返します。

  • Refresh メソッドで、プロバイダのコレクションにあるオブジェクトを更新します。


ADO MD プロパティ

ADO MD プロパティ概要

プロパティ | 説明
ActiveConnection | カレント セルセットまたはカタログが、現在どの ADO Connection オブジェクトに属しているかを示します。
Caption | Level または Member オブジェクトを表示するときに使用するテキスト キャプションを示します。
ChildCount | 階層内で現在の Member オブジェクトを親とするメンバの数を示します。
Children | 階層内で現在の Member を親とする Members のコレクションを返します。
Count | コレクション内のオブジェクトの数を示します。
Depth | Level と階層レベルのルートとの間のレベル数を示します。
Description | カレント オブジェクトの説明テキストを返します。
DimensionCount | 軸上の次元の数を示します。
DrilledDown | 軸上のメンバの直下に子がないかどうかを示します。
FilterAxis | カレント セルセットのフィルタ情報を示します。
Item | 座標を使用して、セルセットからセルを取得します。
Item | 名前、またはインデックスを使用して、コレクションの特定のメンバを返します。
FormattedValue | セル値の整形された表示フォーマットを示します。
LevelDepth | 階層のルートとメンバとの間のレベル数を示します。
LevelName | メンバのレベル名を示します。
Name | オブジェクトの名前を示します。
Ordinal (Cell) | セルセット内の位置によってセルを一意に識別します。
Ordinal (Position) | 軸に沿った位置を一意に識別します。
Parent | 階層内で現在のメンバの親であるメンバを示します。
ParentSameAsPrev | 現在の位置のメンバの親が、直前のメンバの親と同じかどうかを示します。
Source | セルセット内のデータのソースを示します。
State | セルセットの現在の状態を示します。
Type | 現在のメンバの種類を示します。
UniqueName | カレント オブジェクトの一意の名前を示します。
Value | カレント セルの値を示します。


ActiveConnection プロパティ (ADO MD)

ActiveConnection プロパティ

カレント セルセットまたはカタログが、現在どの ADO Connection オブジェクトに属しているかを示します。

設定値と戻り値

Connection オブジェクトまたは接続を定義する文字列を含むバリアント型 (Variant) の値を設定します。また、値の取得も可能です。既定は Empty 値です。

解説

このプロパティに、有効な ADO Connection オブジェクトまたは有効な接続文字列を設定できます。このプロパティに接続文字列が設定されると、プロバイダはこの定義を使用して新規 Connection オブジェクトを作成し、接続を開きます。

Open メソッドの ActiveConnection 引数を使用して Cellset オブジェクトを開いた場合、この引数の値は ActiveConnection プロパティに引き継がれます。

Catalog オブジェクトの ActiveConnection プロパティに Nothing を設定すると、CubeDefs コレクションおよび関連付けられている Dimension、Hierarchy、Level、Member オブジェクトのデータを含む、関連付けられたデータが解放されます。Catalog を開くために使用された Connection オブジェクトを閉じることは、ActiveConnection プロパティに Nothing を設定した場合と同じ結果になります。

開いている Cellset オブジェクトの ActiveConnection プロパティを変更しようとすると、エラーが発生します。

注意 Visual Basic では、ActiveConnection プロパティに Connection オブジェクトを設定するときに Set キーワードを使用することを覚えておいてください。Set キーワードを省略した場合、実際には ActiveConnection プロパティに Connection オブジェクトの既定のプロパティである ConnectionString と同じものを設定していることになります。このコードは実行できますが、データ ソースへの追加の接続をするため、パフォーマンスが劣る可能性があります。

MSOLAP データ プロバイダを使用する場合、接続文字列内でデータ ソースにサーバー名を設定し、イニシャル カタログにデータ ソースからのカタログ名を設定します。サーバーに接続されていないキューブ ファイルに接続するには、そのキューブ ファイルへのフル パスを設定します。どちらの場合でも、プロバイダにプロバイダ名を設定します。たとえば、次の文字列を設定すると、MSOLAP プロバイダを使用して、Servername という名前のサーバー上の Bobs Video Store という名前のカタログに接続されます。

"Data Source=Servername;Initial Catalog=Bobs Video Store;Provider=msolap"

次の文字列を設定すると、C:\MSDASDK\samples\oledb\olap\data\bobsvid.cub にあるローカル キューブ ファイルに接続されます。

"Location=C:\MSDASDK\samples\oledb\olap\data\bobsvid.cub;Provider=msolap"


Caption プロパティ (ADO MD)

Caption プロパティ

Level または Member オブジェクトを表示するときに使用するテキスト キャプションを示します。

戻り値

文字列型 (String) の値を返します。読み取り専用です。


ChildCount プロパティ (ADO MD)

ChildCount プロパティ

階層内で現在の Member オブジェクトを親とするメンバの数を示します。

戻り値

長整数型 (Long) の値を返します。読み取り専用です。

解説

ChildCount プロパティを使用して、Member がどれだけ子を持っているかの概算を返します。Member の実際の子メンバは、Children プロパティによって返されます。

Position オブジェクトからの Member オブジェクトでは、返される最大値は 65536 です。子の実際の数が 65536 を超える場合でも、返される値は 65536 となります。したがって、アプリケーションでは、65536 の ChildCount を、子の数が 65536 個である、またはそれより多いと解釈する必要があります。

Level オブジェクトからの Member オブジェクトでは、Children コレクションで ADO コレクションの Count プロパティを使用して子の正確な数を調べます。コレクション内の子の数が多い場合は、子の正確な数の確認に時間がかかる場合があります。


Children プロパティ (ADO MD)

Children プロパティ

階層内で、現在の Member を親とする Members コレクションを返します。

戻り値

Members コレクションを返します。読み取り専用です。

解説

Children プロパティには、現在の Member を階層における親とする Members コレクションが含まれます。リーフ レベルの Member オブジェクトには、Members コレクション内に子メンバがありません。このプロパティは、Level オブジェクトに属する Member オブジェクトでのみサポートされています。このプロパティが Position オブジェクトに属する Member オブジェクトから参照されている場合は、エラーが発生します。


Depth プロパティ (ADO MD)

Depth プロパティ

Level と階層のルートとの間のレベル数を示します。

戻り値

整数型 (Integer) の値を返します。読み取り専用です。

解説

階層のルートの Level は、Depth 値が 0 です。


Description プロパティ (ADO MD)

Description プロパティ

カレント オブジェクトの説明テキストを返します。

戻り値

文字列型 (String) の値を返します。読み取り専用です。

解説

Member オブジェクトでは、Description は単位と数式メンバにのみ適用されます。その他のすべてのメンバの種類には、Description によって空文字列 ("") が返されます。メンバのさまざまな種類の詳細については、Type プロパティを参照してください。

このプロパティは、Level オブジェクトに属する Member オブジェクトでのみサポートされています。このプロパティが Position オブジェクトに属する Member オブジェクトから参照されている場合は、エラーが発生します。


DimensionCount プロパティ (ADO MD)

DimensionCount プロパティ

軸上の次元の数を示します。

戻り値

長整数型 (Long) の値を返します。読み取り専用です。


DrilledDown プロパティ (ADO MD)

DrilledDown プロパティ

軸上のメンバの直下に子がないかどうかを示します。

戻り値

ブール型 (Boolean) の値を返します。読み取り専用です。軸上の現在のメンバに子メンバが存在しない場合、DrilledDown は True を返します。軸上の現在のメンバの子メンバが 1 つまたはそれ以上存在する場合、DrilledDown は False を返します。

解説

DrilledDown プロパティを使用して、メンバの直下に続く軸上のこのメンバの子が少なくとも 1 つは存在するかどうか調べます。この情報は、メンバを表示するときに便利です。

このプロパティは、Position オブジェクトに属する Member オブジェクトでのみサポートされています。このプロパティが Level オブジェクトに属する Member オブジェクトから参照されている場合、エラーが発生します。


FilterAxis プロパティ (ADO MD)

FilterAxis プロパティ

カレント セルセットのフィルタ情報を示します。

戻り値

Axis オブジェクトを返します。読み取り専用です。

解説

FilterAxis プロパティを使用して、データをスライスするために使用した次元についての情報を返します。Axis の DimensionCount プロパティは、スライスする次元の数を返します。この軸には、通常、行が 1 つだけ含まれます。

FilterAxis によって返される Axis は、Cellset オブジェクトの Axes コレクション内に含まれません。


FormattedValue プロパティ (ADO MD)

FormattedValue プロパティ

セル値の整形された表示フォーマットを示します。

戻り値

文字列型 (String) の値を返します。読み取り専用です。

解説

FormattedValue プロパティを使用して、Cell オブジェクトの Value プロパティのフォーマットされた表示値を取得します。たとえば、セルの値が 1056.87 で、この値がドルの額を表していた場合、FormattedValue は $1,056.87 になります。


Item メソッド (ADO MD Cellset)

Item プロパティ (Cellset)

座標を使用して、セルセットからセルを取得します。

構文

Set Cell = Cellset.Item ( Positions )

パラメータ

Positions セルを指定する一意の値の Variant Array を指定します。Positions は、次の値をとることができます。

  • 位置番号の配列

  • メンバ名の配列

  • 位置の順序

解説

Item プロパティを使用して、Cellset オブジェクトにある Cell オブジェクトを返します。Item プロパティによって Positions 引数に対応するセルが検出できない場合、エラーが発生します。

Item プロパティは、Cellset オブジェクトの既定のプロパティです。次の構文のフォームは、同じように扱われます。

Cellset.Item ( Positions )

Cellset ( Positions )

Positions 引数は、返すセルを指定します。位置の順序またはそれぞれの軸に沿った位置によって、セルを指定することができます。それぞれの軸に沿った位置によってセルを指定する場合は、位置の数値型 (Numeric) の値またはそれぞれの位置におけるメンバ名で指定することができます。

位置の順序は、Cellset にある 1 つのセルの重複しない識別子の番号です。概念的には、軸の数が p の場合、Cellset が p-次元配列のような番号を、Cellset 内でセルに付けます。セルは、行を主とした順序で設定されます。次に、セルの順番を算出する数式を示します。

メンバ名を Item に文字列として渡す場合、数値型 (Numeric) の軸の識別子を昇順に、メンバを記述する必要があります。軸内では、次元のネストを昇順に、つまり最も外部の次元のメンバが先に来て、内側の次元のメンバがそれに続くように、メンバを記述する必要があります。それぞれの次元は異なる文字列で表し、メンバ文字列の一覧はカンマで分ける必要があります。

注意 データ プロバイダによっては、メンバ名によるセルの取得をサポートしていないことがあります。詳細については、プロバイダのマニュアルを参照してください。


LevelDepth プロパティ (ADO MD)

LevelDepth プロパティ

階層のルートとメンバとの間のレベル数を示します。

戻り値

長整数型 (Long) の値を返します。読み取り専用です。

解説

LevelDepth プロパティを使用して、階層のルート レベルからの Member オブジェクトの距離を調べます。ルート レベルのメンバの LevelDepth は 0 です。これは、Level オブジェクトの Depth プロパティに対応します。


LevelName プロパティ (ADO MD)

LevelName プロパティ

メンバのレベル名を示します。

戻り値

文字列型 (String) の値を返します。読み取り専用です。

解説

LevelName プロパティを使用して、メンバが属するレベル名を取得します。これは、Level オブジェクトの Name プロパティに対応します。


Name プロパティ (ADO MD)

Name プロパティ

オブジェクトの名前を示します。

戻り値

文字列型 (String) の値を返します。読み取り専用です。

解説

オブジェクトの Name プロパティを序数参照によって取得することができますが、取得した後は名前で直接オブジェクトを参照できます。たとえば、cdf.CubeDefs(0).Name が "Bobs Video Store" である場合、この CubeDef は cdf.CubeDefs("Bobs Video Store") として参照できます。


Ordinal プロパティ (ADO MD Cell)

Ordinal プロパティ (Cell)

セルセット内の位置によってセルを一意に識別します。

戻り値

長整数型 (Long) の値を返します。読み取り専用です。

解説

セルの序数値は、セルセット内のセルを一意に識別します。概念的には、軸の数が p の場合、Cellset が p-次元配列のような番号を、Cellset 内でセルに付けます。セルは、0 から始まって行の大きい順に番号が付けられます。次に、セルの順番を計算するための数式を示します。

セルの順序値を Cellset オブジェクトの Item プロパティで使用しすることにより、Cell をすばやく取得することができます。


Ordinal プロパティ (ADO MD Position)

Ordinal プロパティ (Position)

軸に沿った位置を一意に識別します。

戻り値

長整数型 (Long) の値を返します。読み取り専用です。

解説

Position オブジェクトの Ordinal は、Positions コレクション内の Position のインデックスに対応します。

セルは、Position の Ordinal をそれぞれの軸に沿って Cellset オブジェクトの Item プロパティで使用することにより、すばやく取得することができます。


Parent プロパティ (ADO MD)

Parent プロパティ

階層内で現在のメンバを親とするメンバを示します。

戻り値

Member オブジェクトを返します。読み取り専用です。

解説

階層の最上レベル (ルート) にあるメンバは、親を持ちません。このプロパティは、Level オブジェクトに属する Member オブジェクトでのみサポートされています。このプロパティが Position オブジェクトに属する Member オブジェクトから参照されている場合は、エラーが発生します。


ParentSameAsPrev プロパティ (ADO MD)

ParentSameAsPrev プロパティ

現在の位置のメンバの親が、直前のメンバの親と同じかどうかを示します。

戻り値

ブール型 (Boolean) の値を返します。読み取り専用です。

解説

このプロパティは、Position オブジェクトに属する Member オブジェクトでのみサポートされています。このプロパティが Level オブジェクトに属する Member オブジェクトから参照されている場合、エラーが発生します。


Source プロパティ (ADO MD)

Source プロパティ

セルセット内のデータのソースを示します。

設定値と戻り値

バリアント型 (Variant) の値を設定します。また、値の取得も可能です。閉じている Cellset オブジェクトに対しては読み取り/書き込みが可能で、開いている Cellset オブジェクトに対しては読み取り専用です。このバリアント型 (Variant) には、MDX クエリなどの有効な文字列型 (String) が含まれている必要があります。


State プロパティ (ADO MD)

State プロパティ

セルセットの現在の状態を示します。

戻り値

Cellset オブジェクトの現在の状態を示す長整数型 (Long) の値を返します。読み取り専用です。adStateClosed (0) と adStateOpen (1) の値が有効です。

解説

ObjectStateEnum 定数名を使用するには、プロジェクト内で ADO タイプ ライブラリが参照されている必要があります。詳細については、「ADO MD を用いた ADO の使用」を参照してください。


Type プロパティ (ADO MD)

Type プロパティ

現在のメンバの種類を示します。

戻り値

MemberTypeEnum の値を返します。読み取り専用です。

解説

このプロパティは、Level オブジェクトに属する Member オブジェクトでのみサポートされています。このプロパティが Position オブジェクトに属する Member オブジェクトから参照されている場合は、エラーが発生します。


UniqueName プロパティ (ADO MD)

UniqueName プロパティ

カレント オブジェクトの一意の名前を示します。

戻り値

文字列型 (String) の値を返します。読み取り専用です。


Value プロパティ (ADO MD)

Value プロパティ

カレント セルの値を示します。

戻り値

バリアント型 (Variant) の値を返します。読み取り専用です。


ADO MD メソッド

ADO MD メソッドの概要

メソッド | 説明
Close | 開いたセルセットを閉じます。
Open | 多次元クエリの結果を取得し、結果をセルセットに返します。
Refresh | コレクションのオブジェクトを更新して、プロバイダから使用可能な、またはプロバイダに固有のオブジェクトを反映させます。


Close メソッド (ADO MD)

Close メソッド

開いたセルセットを閉じます。

構文

Cellset.Close

解説

Close メソッドを使用して Cellset オブジェクトを閉じると、すべての関連する Cell、Axis、Position、または Member オブジェクトのデータを含む、関連付けられたデータが解放されます。Cellset は、閉じられてもメモリからは削除されません。そのため、後からプロパティ設定を変更し、再度開くことができます。オブジェクトをメモリから完全に削除するには、オブジェクト変数に Nothing を設定します。

後で Open メソッドを呼び出し、同じまたは異なるソース文字列を使用して Cellset を再び開くことができます。Cellset オブジェクトが閉じている間に、基になるデータまたはメタデータを参照するプロパティを取得したりメソッドを呼び出すと、エラーが発生します。


Open メソッド (ADO MD)

Open メソッド

多次元クエリの結果を取得し、結果をセルセットに返します。

構文

Cellset.Open Source, ActiveConnection

パラメータ

Source 省略可能です。Multidimensional Expression (MDX) クエリのような、有効な多次元クエリを評価するバリアント型 (Variant) を指定します。Source 引数は、Source プロパティに対応します。

MDX の詳細については、Microsoft Data Access Components SDK の 「OLE DB for OLAP Programmer's Reference」を参照してください。

ActiveConnection 省略可能です。有効な ADO Connection オブジェクト変数名、または接続の定義を指定する文字列を評価するバリアント型 (Variant) の値を指定します。ActiveConnection 引数は、Cellset オブジェクトを開くための接続を指定します。この引数に接続の定義を引き渡した場合、ADO では指定パラメータを使って新規接続が開かれます。ActiveConnection 引数は、ActiveConnection プロパティに対応します。

解説

Open メソッドのパラメータのどちらかが省略され、Cellset を開こうとするより前に対応するプロパティの値が設定されていない場合、エラーが発生します。


ADO MD 列挙定数

ここでは、デバッグ用に各定数の実際の値の一覧を示します。ただし、この値は参考用のものであり、ADO MD のリリースごとに変更されることがあります。コードを記述するときは、列挙定数の実際の値ではなく、名前のみを使って記述する必要があります。

次の列挙定数が定義されています。

  • MemberTypeEnum


MemberTypeEnum

Member オブジェクトの Type プロパティの設定を示します。

定数 | 値 | 説明
adMemberAll | 4 | Member オブジェクトがそのレベルのすべてのメンバを表すことを示します。
adMemberFormula | 3 | Member オブジェクトが数式の式を計算して表されることを示します。
adMemberMeasure | 2 | Member オブジェクトが Measures 次元に属し、量的属性を表すことを示します。
adMemberRegular | 1 | 既定値です。Member オブジェクトがビジネス エンティティのインスタンスを表すことを示します。
adMemberUnknown | 0 | メンバの種類を判断できません。


ADO MD コードの例

ADO MD オブジェクト、メソッド、プロパティの使用方法については、次のコード例を参照してください。これらの例は、Microsoft SQL Server OLAP Services for SQL Server 7.0 と共にインストールされたサンプル アプリケーションのサブセットです。

コード例は MSOLAP OLE DB プロバイダを使用し、Microsoft SQL Server OLAP Services のローカル ホストに対して実行します。ただし、これらの例は基本的な ADO MD プログラミング方法を示すためのものであり、簡単にほかのデータ ソースまたはプロバイダに合わせて修正できます。

  • Visual Basic での ADO MD コードの例

  • Visual Basic, Scripting Edition での ADO MD コードの例


Visual Basic での ADO MD コードの例

次の例には、Service Pack 3 がインストールされた Microsoft Visual Basic Version 5.0 または Visual Basic Version 6.0 が必要です。

注意 最初から最後までのコード例全体をコード エディタに貼り付けてください。この例は、一部分だけ使用したり、改行の情報が失われると、正常に動作しない場合があります。

  • Cellset の例

  • Catalog の例


Cellset の例 (VB)

この Visual Basic プロジェクトは、ADO MD を使用してキューブ データにアクセスするための基本的な方法を示しています。列と行のヘッダーのメンバ キャプションを表示し、次にセルセット内にある特定のセルの書式設定された値を表示します。

Private Sub cmdCellSettoDebugWindow_Click()
Dim cat As New ADOMD.Catalog
Dim cst As New ADOMD.Cellset
Dim i As Integer
Dim j As Integer
Dim strServer As String
Dim strSource As String
Dim strColumnHeader As String
Dim strRowText As String

On Error GoTo Error_cmdCellSettoDebugWindow_Click
Screen.MousePointer = vbHourglass
'*-----------------------------------------------------------------------
'* Set Server to Local Host
'*-----------------------------------------------------------------------
    strServer = "LOCALHOST"

'*-----------------------------------------------------------------------
'* Set MDX query string Source
'*-----------------------------------------------------------------------
    strSource = strSource & "SELECT "
    strSource = strSource & "{[Measures].members} ON COLUMNS,"
    strSource = strSource & _
        "NON EMPTY [Store].[Store City].members ON ROWS"
    strSource = strSource & " FROM Sales"

'*-----------------------------------------------------------------------
'* Set Active Connection
'*-----------------------------------------------------------------------
        cat.ActiveConnection = "Data Source=" & strServer & _
            ";Provider=msolap;"

'*-----------------------------------------------------------------------
'* Set Cell Set source to MDX query string
'*-----------------------------------------------------------------------
        cst.Source = strSource

'*-----------------------------------------------------------------------
'* Set Cell Sets active connection to current connection
'*-----------------------------------------------------------------------
    Set cst.ActiveConnection = cat.ActiveConnection

'*-----------------------------------------------------------------------
'* Open Cell Set
'*-----------------------------------------------------------------------
    cst.Open

'*-----------------------------------------------------------------------
'* Allow space for Row Header Text
'*-----------------------------------------------------------------------
strColumnHeader = vbTab & vbTab & vbTab & vbTab & vbTab & vbTab

'*-----------------------------------------------------------------------
'* Loop through Column Headers
'*-----------------------------------------------------------------------
       For i = 0 To cst.Axes(0).Positions.Count - 1
            strColumnHeader = strColumnHeader & _
                cst.Axes(0).Positions(i).Members(0).Caption & vbTab & _
                    vbTab & vbTab & vbTab
       Next
       Debug.Print vbTab & strColumnHeader & vbCrLf

'*-----------------------------------------------------------------------
'* Loop through Row Headers and Provide data for each row
'*-----------------------------------------------------------------------
        strRowText = ""
        For j = 0 To cst.Axes(1).Positions.Count - 1
            strRowText = strRowText & _
                cst.Axes(1).Positions(j).Members(0).Caption & vbTab & _
                    vbTab & vbTab & vbTab
            For k = 0 To cst.Axes(0).Positions.Count - 1
                strRowText = strRowText & cst(k, j).FormattedValue & _
                    vbTab & vbTab & vbTab & vbTab
            Next
            Debug.Print strRowText & vbCrLf
            strRowText = ""
        Next

    Screen.MousePointer = vbDefault
Exit Sub

Error_cmdCellSettoDebugWindow_Click:
   Beep
   Screen.MousePointer = vbDefault
   MsgBox "The Following Error has occurred:" & vbCrLf & _
      Err.Description, vbCritical, " Error!"
   Exit Sub
End Sub


Catalog の例 (VB)

この Visual Basic プロジェクトでは、MDX を使用して新規キューブを作成します。次に、キューブの構造を Microsoft Word 文書にします。

Private Sub cmdCreateDocForCube_Click()
Dim cn As ADODB.Connection
Dim s As String
Dim strProvider As String
Dim strDataSource As String
Dim strSourceDSN As String
Dim strSourceDSNSuffix As String
Dim strCreateCube As String
Dim strInsertInto As String

On Error GoTo Error_cmdCreateDocForCube_Click

'*-----------------------------------------------------------------------
'* The following code builds a cube file then documents the properties
'* with an OLE Connection to Word 8.0
'*-----------------------------------------------------------------------

'*-----------------------------------------------------------------------
'* Add Provider to the connection string.
'*-----------------------------------------------------------------------
strProvider = "PROVIDER=MSOLAP"

'*-----------------------------------------------------------------------
'* Add DataSource, the name of the file we will create.
'*-----------------------------------------------------------------------

strDataSource = "DATA SOURCE=c:\DocumentCube.cub"

'*-----------------------------------------------------------------------
'* Add Source DSN, the connection string for where the data comes from.
'* We need to quote the value so it is parsed as one value.
'* This can either be an ODBC connection string or an OLE DB connection
'* string. (As returned by the Data Source Locator component.)
'*-----------------------------------------------------------------------

strSourceDSN = "SOURCE_DSN=FoodMart"

'*-----------------------------------------------------------------------
'* We may have some other parameters that we want applied at run time,
'* but not stored in the cube file, or returned in the output string.
'*-----------------------------------------------------------------------

' strSourceDSNSuffix = "UID=;PWD="

'*-----------------------------------------------------------------------
'* Add CREATE CUBE.  This defines the structure of the cube, but not the
'* data in it. The BNF for is documented in the OLE DB for OLAP
'* Programmer's Reference. Note that we can quote names with either
'* double quotes or square brackets.
'*-----------------------------------------------------------------------

strCreateCube = "CREATECUBE=CREATE CUBE Sample( "
strCreateCube = strCreateCube & "DIMENSION [Product],"
        strCreateCube = strCreateCube & "LEVEL [All Products]  TYPE ALL,"
        strCreateCube = strCreateCube & "LEVEL [Product Family] ,"
        strCreateCube = strCreateCube & "LEVEL [Product Department] ,"
        strCreateCube = strCreateCube & "LEVEL [Product Category] ,"
        strCreateCube = strCreateCube & "LEVEL [Product Subcategory] ,"
        strCreateCube = strCreateCube & "LEVEL [Brand Name] ,"
        strCreateCube = strCreateCube & "LEVEL [Product Name] ,"
strCreateCube = strCreateCube & "DIMENSION [Store],"
        strCreateCube = strCreateCube & "LEVEL [All Stores]  TYPE ALL,"
        strCreateCube = strCreateCube & "LEVEL [Store Country] ,"
        strCreateCube = strCreateCube & "LEVEL [Store State] ,"
        strCreateCube = strCreateCube & "LEVEL [Store City] ,"
        strCreateCube = strCreateCube & "LEVEL [Store Name] ,"
strCreateCube = strCreateCube & "DIMENSION [Store Type],"
        strCreateCube = strCreateCube & _
            "LEVEL [All Store Type]  TYPE ALL,"
        strCreateCube = strCreateCube & "LEVEL [Store Type] ,"
strCreateCube = strCreateCube & "DIMENSION [Time] TYPE TIME,"
    strCreateCube = strCreateCube & "HIERARCHY [Column],"
        strCreateCube = strCreateCube & "LEVEL [All Time]  TYPE ALL,"
        strCreateCube = strCreateCube & "LEVEL [Year]  TYPE YEAR,"
        strCreateCube = strCreateCube & "LEVEL [Quarter]  TYPE QUARTER,"
        strCreateCube = strCreateCube & "LEVEL [Month]  TYPE MONTH,"
        strCreateCube = strCreateCube & "LEVEL [Week]  TYPE WEEK,"
        strCreateCube = strCreateCube & "LEVEL [Day]  TYPE DAY,"
    strCreateCube = strCreateCube & "HIERARCHY [Formula],"
        strCreateCube = strCreateCube & _
            "LEVEL [All Formula Time]  TYPE ALL,"
        strCreateCube = strCreateCube & "LEVEL [Year]  TYPE YEAR,"
        strCreateCube = strCreateCube & "LEVEL [Quarter]  TYPE QUARTER,"
        strCreateCube = strCreateCube & _
            "LEVEL [Month]  TYPE MONTH OPTIONS (SORTBYKEY) ,"
strCreateCube = strCreateCube & "DIMENSION [Warehouse],"
        strCreateCube = strCreateCube & _
            "LEVEL [All Warehouses]  TYPE ALL,"
        strCreateCube = strCreateCube & "LEVEL [Country] ,"
        strCreateCube = strCreateCube & "LEVEL [State Province] ,"
        strCreateCube = strCreateCube & "LEVEL [City] ,"
        strCreateCube = strCreateCube & "LEVEL [Warehouse Name] ,"
strCreateCube = strCreateCube & "MEASURE [Store Invoice] "
    strCreateCube = strCreateCube & "Function Sum "
    strCreateCube = strCreateCube & "Format '#.#',"
strCreateCube = strCreateCube & "MEASURE [Supply Time] "
    strCreateCube = strCreateCube & "Function Sum "
    strCreateCube = strCreateCube & "Format '#.#',"
strCreateCube = strCreateCube & "MEASURE [Warehouse Cost] "
    strCreateCube = strCreateCube & "Function Sum "
    strCreateCube = strCreateCube & "Format '#.#',"
strCreateCube = strCreateCube & "MEASURE [Warehouse Sales] "
    strCreateCube = strCreateCube & "Function Sum "
    strCreateCube = strCreateCube & "Format '#.#',"
strCreateCube = strCreateCube & "MEASURE [Units Shipped] "
    strCreateCube = strCreateCube & "Function Sum "
    strCreateCube = strCreateCube & "Format '#.#',"
strCreateCube = strCreateCube & "MEASURE [Units Ordered] "
    strCreateCube = strCreateCube & "Function Sum "
    strCreateCube = strCreateCube & "Format '#.#')"
'*-----------------------------------------------------------------------
'* Add INSERT INTO.  This defines where the data comes from, and how it
'* maps into the already-defined cube structure.  Note that the SELECT
'* clause might just be passed through to the relational database.
'* So I could pass in a stored procedure, for example.  If we needed to,
'* we could quote this whole thing.  Note that the columns in the SELECT
'* can be in any order.  One merely has to adjust the ordering of the
'* list of level/measure names to match the SELECT ordering.
'*-----------------------------------------------------------------------
strInsertInto = strInsertInto & _
    "INSERTINTO=INSERT INTO Sample( " & _
        "Product.[Product Family], Product.[Product Department],"
strInsertInto = strInsertInto & _
    "Product.[Product Category], Product.[Product Subcategory],"
strInsertInto = strInsertInto & _
    "Product.[Brand Name], Product.[Product Name],"
strInsertInto = strInsertInto & _
    "Store.[Store Country], Store.[Store State], Store.[Store City],"
strInsertInto = strInsertInto & _
    "Store.[Store Name], [Store Type].[Store Type], [Time].[Column],"
strInsertInto = strInsertInto & _
    "[Time].Formula.Year, [Time].Formula.Quarter, " & _
        "[Time].Formula.Month.[Key],"
strInsertInto = strInsertInto & _
    "[Time].Formula.Month.Name, Warehouse.Country, " & _
        "Warehouse.[State Province],"
strInsertInto = strInsertInto & _
    "Warehouse.City, Warehouse.[Warehouse Name], " & _
        "Measures.[Store Invoice],"
strInsertInto = strInsertInto & _
    "Measures.[Supply Time], Measures.[Warehouse Cost], " & _
        "Measures.[Warehouse Sales],"
strInsertInto = strInsertInto & _
    "Measures.[Units Shipped], Measures.[Units Ordered] )"
'*-----------------------------------------------------------------------
'* Add some options to the INSERT INTO if we need to.  These can control
'* if the SELECT clause is analyzed or just passed through, and if the
'* storage mode is MOLAP or ROLAP (DEFER_DATA).
'* strInsertInto = strInsertInto & _
'*     " OPTIONS ATTEMPT_ANALYSIS"
'*-----------------------------------------------------------------------

'*-----------------------------------------------------------------------
'* Add the SELECT clause of the INSERT INTO statement.  Note that it is
'* merely concatenated onto the end of the INSERT INTO statement.  OLAP
'* Services will pass this through to the source database if unable to
'* parse it.  Note that for OLAP Services to analyze the SELECT clause,
'* each column must be qualified with the table name.
'*-----------------------------------------------------------------------

strInsertInto = strInsertInto & _
    "SELECT product_class.product_family AS Col1,"
strInsertInto = strInsertInto & _
    "product_class.product_department AS Col2,"
strInsertInto = strInsertInto & _
    "product_class.product_category AS Col3,"
strInsertInto = strInsertInto & _
    "product_class.product_subcategory AS Col4,"
strInsertInto = strInsertInto & _
    "product.brand_name AS Col5,"
strInsertInto = strInsertInto & _
    "product.product_name AS Col6,"
strInsertInto = strInsertInto & _
    "store.store_country AS Col7,"
strInsertInto = strInsertInto & _
    "store.store_state AS Col8,"
strInsertInto = strInsertInto & _
    "store.store_city AS Col9,"
strInsertInto = strInsertInto & _
    "store.store_name AS Col10,"
strInsertInto = strInsertInto & _
    "store.store_type AS Col11,"
strInsertInto = strInsertInto & _
    "time_by_day.the_date AS Col12,"
strInsertInto = strInsertInto & _
    "time_by_day.the_year AS Col13,"
strInsertInto = strInsertInto & _
    "time_by_day.quarter AS Col14,"
strInsertInto = strInsertInto & _
    "time_by_day.month_of_year AS Col15,"
strInsertInto = strInsertInto & _
    "time_by_day.the_month AS Col16,"
strInsertInto = strInsertInto & _
    "warehouse.warehouse_country AS Col17,"
strInsertInto = strInsertInto & _
    "warehouse.warehouse_state_province AS Col18,"
strInsertInto = strInsertInto & _
    "warehouse.warehouse_city AS Col19,"
strInsertInto = strInsertInto & _
    "warehouse.warehouse_name AS Col20,"
strInsertInto = strInsertInto & _
    "inventory_fact_1997.store_invoice AS Col21,"
strInsertInto = strInsertInto & _
    "inventory_fact_1997.supply_time AS Col22,"
strInsertInto = strInsertInto & _
    "inventory_fact_1997.warehouse_cost AS Col23,"
strInsertInto = strInsertInto & _
    "inventory_fact_1997.warehouse_sales AS Col24,"
strInsertInto = strInsertInto & _
    "inventory_fact_1997.units_shipped AS Col25,"
strInsertInto = strInsertInto & _
    "inventory_fact_1997.units_ordered AS Col26 "
strInsertInto = strInsertInto & _
    "From [inventory_fact_1997], [product], [product_class], " & _
        "[time_by_day], [store], [warehouse] "
strInsertInto = strInsertInto & _
    "Where [inventory_fact_1997].[product_id] = [product]." & _
        "[product_id] And "
strInsertInto = strInsertInto & _
    "[product].[product_class_id] = [product_class]." & _
        "[product_class_id] And "
strInsertInto = strInsertInto & _
    "[inventory_fact_1997].[time_id] = [time_by_day].[time_id] And "
strInsertInto = strInsertInto & _
    "[inventory_fact_1997].[store_id] = [store].[store_id] And "
strInsertInto = strInsertInto & _
    "[inventory_fact_1997].[warehouse_id] = [warehouse].[warehouse_id]"

'*-----------------------------------------------------------------------
'* Create the cube by passing connection string to Open.
'*-----------------------------------------------------------------------

Set cn = New ADODB.Connection
s = strProvider & ";" & strDataSource & ";" & strSourceDSN & ";" & _
    strCreateCube & ";" & strInsertInto & ";"
Screen.MousePointer = vbHourglass
cn.Open s

'*-----------------------------------------------------------------------
'* Cube file is written to hard drive a Word Document can be produced by
'* automating Word with VB
'*-----------------------------------------------------------------------

Dim cat As New ADOMD.Catalog
Dim cdf As ADOMD.CubeDef
Dim di As Integer
Dim hi As Integer
Dim le As Integer
Dim mem As Integer
Dim docWord As Word.Document
Dim rngCurrent As Word.Range
Dim SenCount As Integer
Dim strServer As String
Dim strSource As String
Dim strCubeName As String

'*-----------------------------------------------------------------------
'* Connection is made to cube file
'*-----------------------------------------------------------------------
cat.ActiveConnection = "DATA SOURCE=c:\DocumentCube.cub;Provider=msolap;"

'*-----------------------------------------------------------------------
'* Cube Definition is set to Name of Cube in cube file
'*-----------------------------------------------------------------------
Set cdf = cat.CubeDefs("Sample")

'*-----------------------------------------------------------------------
'* Object is created to hold Word 8.0
'*-----------------------------------------------------------------------
Set appword = CreateObject("Word.Application.8")

'*-----------------------------------------------------------------------
'* Create the document variable
'*-----------------------------------------------------------------------
   Set docWord = appword.Documents.Add()

   Set rngCurrent = docWord.Content

   SenCount = 0

'*-----------------------------------------------------------------------
'* Cube Title and Header written to Document
'*-----------------------------------------------------------------------
   With rngCurrent
       .InsertAfter "Report for Sample Cube"
       .InsertAfter vbCrLf
       SenCount = SenCount + 1
       docWord.Paragraphs(SenCount).Range.Bold = True
       docWord.Paragraphs(SenCount).Range.Underline = wdUnderlineSingle
       docWord.Paragraphs(SenCount).Range.Italic = False
       docWord.Paragraphs(SenCount).Range.Font.Size = 18

'*-----------------------------------------------------------------------
'* Properties of Cube are written to Document
'*-----------------------------------------------------------------------
For i = 0 To cdf.Properties.Count - 1
    .InsertAfter "(" & i & ") " & cdf.Properties(i).Name & ": " & _
        cdf.Properties(i).Value
    .InsertAfter vbCrLf
    SenCount = SenCount + 1
    docWord.Paragraphs(SenCount).Range.Bold = False
    docWord.Paragraphs(SenCount).Range.Italic = True
    docWord.Paragraphs(SenCount).Range.Font.Size = 8
Next i

'*-----------------------------------------------------------------------
'* Dimension Name(s) written to Document
'*-----------------------------------------------------------------------
    For di = 0 To cdf.Dimensions.Count - 1
    .InsertAfter "Dimension: " & cdf.Dimensions(di).Name
    .InsertAfter vbCrLf
    SenCount = SenCount + 1
    docWord.Paragraphs(SenCount).Range.Bold = True
    docWord.Paragraphs(SenCount).Range.Italic = False
    docWord.Paragraphs(SenCount).Range.Font.Size = 14

'*-----------------------------------------------------------------------
'* Properties of Dimension are written to Document
'*-----------------------------------------------------------------------
    For i = 0 To cdf.Dimensions(di).Properties.Count - 1
        .InsertAfter "(" & i & ") " & _
            cdf.Dimensions(di).Properties(i).Name & ": " & _
            cdf.Dimensions(di).Properties(i).Value
        .InsertAfter vbCrLf
        SenCount = SenCount + 1
        docWord.Paragraphs(SenCount).Range.Bold = False
        docWord.Paragraphs(SenCount).Range.Italic = True
        docWord.Paragraphs(SenCount).Range.Font.Size = 8
    Next i

'*-----------------------------------------------------------------------
'* Hierarchy Name(s) written to Document
'*-----------------------------------------------------------------------
    For hi = 0 To cdf.Dimensions(di).Hierarchies.Count - 1
        .InsertAfter vbTab & "Hierarchy: " & _
            cdf.Dimensions(di).Hierarchies(hi).Name
        .InsertAfter vbCrLf
        SenCount = SenCount + 1
        docWord.Paragraphs(SenCount).Range.Bold = True
        docWord.Paragraphs(SenCount).Range.Italic = False
        docWord.Paragraphs(SenCount).Range.Font.Size = 12

'*-----------------------------------------------------------------------
'* Properties of Hierarchy are written to Document
'*-----------------------------------------------------------------------
    For i = 0 To cdf.Dimensions(di).Hierarchies(hi).Properties.Count - 1
        .InsertAfter vbTab & "(" & i & ") " & _
            cdf.Dimensions(di).Hierarchies(hi).Properties(i).Name & _
            ": " & cdf.Dimensions(di).Hierarchies(hi).Properties(i).Value
        .InsertAfter vbCrLf
        SenCount = SenCount + 1
        docWord.Paragraphs(SenCount).Range.Bold = False
        docWord.Paragraphs(SenCount).Range.Italic = True
        docWord.Paragraphs(SenCount).Range.Font.Size = 8
    Next i

'*-----------------------------------------------------------------------
'* Level Name(s) written to Document
'*-----------------------------------------------------------------------
    For le = 0 To cdf.Dimensions(di).Hierarchies(hi).Levels.Count - 1
        .InsertAfter vbTab & vbTab & "Level: " & _
            cdf.Dimensions(di).Hierarchies(hi).Levels(le).Name & _
            " with a Member Count of: " & _
            cdf.Dimensions(di).Hierarchies(hi).Levels(le).Members.Count
        .InsertAfter vbCrLf
        SenCount = SenCount + 1
        docWord.Paragraphs(SenCount).Range.Bold = True
        docWord.Paragraphs(SenCount).Range.Italic = False
        docWord.Paragraphs(SenCount).Range.Font.Size = 10

'*-----------------------------------------------------------------------
'* Properties of Level are written to Document
'*-----------------------------------------------------------------------
    For i = 0 To cdf.Dimensions(di).Hierarchies(hi).Levels(le).Properties.Count - 1
        .InsertAfter vbTab & vbTab & "(" & i & ") " & _
             cdf.Dimensions(di).Hierarchies(hi).Levels(le). _
                 Properties(i).Name & ": " & _
             cdf.Dimensions(di).Hierarchies(hi).Levels(le). _
                 Properties(i).Value
        .InsertAfter vbCrLf
        SenCount = SenCount + 1
        docWord.Paragraphs(SenCount).Range.Bold = False
        docWord.Paragraphs(SenCount).Range.Italic = True
        docWord.Paragraphs(SenCount).Range.Font.Size = 8
    Next i

    Next le
    Next hi
    Next di

'*-----------------------------------------------------------------------
'* Set Word Document to visible
'*-----------------------------------------------------------------------
        appword.Visible = True
    End With
   Screen.MousePointer = vbDefault

'*-----------------------------------------------------------------------
'* Set Word Object to nothing to drop OLE connection
'*-----------------------------------------------------------------------
   Set appword = Nothing
Exit Sub

Error_cmdCreateDocForCube_Click:
    Screen.MousePointer = vbDefault
    MsgBox Err.Description
End Sub


Visual Basic, Scripting Edition での ADO MD コードの例

次の例には、Microsoft Active Server Pages (ASP) for Microsoft Internet Information Services 4.0 が必要です。

注意 最初から最後までのコード例全体をコード エディタに貼り付けてください。この例は、一部分だけ使用したり、改行の情報が失われると、正常に動作しない場合があります。

  • Axis の例

  • Members の例

  • CubeDef の例


Axis の例 (VBScript)

この Active Server Pages は MDX Query 文字列からの OLAP データを表示し、結果のセルセットを HTML テーブル構造に書き込みます。

<%@ Language=VBScript %>
<%
'************************************************************************
'*** Active Server Page displays OLAP data from default
'*** MDX Query string and writes resulting cell set to HTML table
'*** structure.
'************************************************************************
Response.Buffer=True
Response.Expires=0
%>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY bgcolor=Ivory>
<FONT FACE=Verdana>

<%

Dim cat,cst,i,j,strSource,csw,intDC0,intDC1,intPC0,intPC1

'************************************************************************
'*** Set Connection Objects for Multidimensional Catalog and Cellset
'************************************************************************
Set cat = Server.CreateObject("ADOMD.Catalog")
Set cst = Server.CreateObject("ADOMD.CellSet")

'************************************************************************
'*** Use default settings of a known OLAP Server
'*** for Server Name for Connection Set Server Name Session Object
'*** to default value
'************************************************************************
'*** Must set OLAPServerName to OLAP Server that is
'*** present on network
'************************************************************************
    OLAPServerName = "Please set to present OLAP Server"
    cat.ActiveConnection = "Data Source=" & OLAPServerName & _
        ";Initial Catalog=FoodMart;Provider=msolap;"

'************************************************************************
'*** Use default MDX Query string of a known query that works
'*** with default server Set MDXQuery Session Object to default value
'************************************************************************
    strSource = strSource & "SELECT "
    strSource = strSource & "{[Measures].members} ON COLUMNS,"
    strSource = strSource & _
        "NON EMPTY [Store].[Store City].members ON ROWS"
    strSource = strSource & " FROM Sales"

'************************************************************************
'*** Set Cell Set Source property to strSource to be passed on cell set '*** open method
'************************************************************************
    cst.Source = strSource

'************************************************************************
'*** Set Cell Sets Active connection to use the current Catalogs Active
'*** connection
'************************************************************************
Set cst.ActiveConnection = cat.ActiveConnection

'************************************************************************
'*** Using Open method, Open cell set
'************************************************************************
cst.Open

'************************************************************************
'*** Set Dimension Counts minus 1 for Both Axes to intDC0, intDC1
'*** Set Position Counts minus 1 for Both Axes to intPC0, intPC1
'************************************************************************
intDC0 = cst.Axes(0).DimensionCount-1
intDC1 = cst.Axes(1).DimensionCount-1

intPC0 = cst.Axes(0).Positions.Count - 1
intPC1 = cst.Axes(1).Positions.Count - 1

'************************************************************************
'*** Create HTML Table structure to hold MDX Query return Record set
'************************************************************************
        Response.Write "<Table width=100% border=1>"

'************************************************************************
'*** Loop to create Column header
'************************************************************************
        For h=0 to intDC0
            Response.Write "<TR>"

'************************************************************************
'*** Loop to create spaces in front of Column headers
'*** to align with Row header
'************************************************************************
            For c=0 to intDC1
                Response.Write "<TD></TD>"
            Next

'************************************************************************
'*** Iterate through Axes(0) Positions writing member captions to table
'*** header
'************************************************************************
            For i = 0 To intPC0
                Response.Write "<TH>"
                Response.Write "<FONT size=-2>"
                Response.Write cst.Axes(0).Positions(i).Members(h).Caption
                Response.Write "</FONT>"
                Response.Write "</TH>"
            Next
            Response.Write "</TR>"
        Next
'************************************************************************
'*** Use Array values for row header formatting to provide
'*** spaces under beginning row header titles
'************************************************************************
        For j = 0 To intPC1
            Response.Write "<TR>"
            For h=0 to intDC1
                Response.Write "<TD><B>"
                Response.Write "<FONT size=-2>"
                Response.Write cst.Axes(1).Positions(j).Members(h).Caption
                Response.Write "</FONT>"
                Response.Write "</B></TD>"
            Next
            For k = 0 To intPC0
                Response.Write "<TD align=right bgcolor="
                Response.Write csw
                Response.Write ">"
                Response.Write "<FONT size=-2>"
                Response.Write cst(k, j).FormattedValue
                Response.Write "</FONT>"
                Response.Write "</TD>"
            Next
            Response.Write "</TR>"
        Next
        Response.Write "</Table>"

%>
</FONT>
</BODY>
</HTML>


Members の例 (VBScript)

この例では MDX クエリ文字列を使って OLAP データを取得し、列にまたがる機能を多次元セルセットに使って、結果のセルセットを HTML テーブル構造に書き込みます。

<%@ Language=VBScript %>
<%
'************************************************************************
'*** Active Server Page displays OLAP data from default or provided
'*** MDX Query string and writes resulting cell set to HTML table
'*** structure. This ASP provides colspan features for multiple
'*** dimension cell sets.
'************************************************************************
Response.Buffer=True
Response.Expires=0
%>
<html>
<head>
<meta NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</head>
<body bgcolor="Ivory">
<font FACE="Verdana">

<%

Dim cat,cst,i,j,strSource,csw,LevelValue,intDC0,intDC1,intPC0, intPC1
'************************************************************************
'*** Gather Server Name and MDX Query Strings from text box and
'*** text area and assign them to Session Objects of same name
'************************************************************************
Session("ServerName")=Request.Form("strServerName")
Session("InitialCatalog")=Request.Form("strInitialCatalog")
Session("MDXQuery")=Request.Form("MDXQuery")

'************************************************************************
'*** Set Connection Objects for Multi dimensional Catalog and Cell Set
'************************************************************************
Set cat = Server.CreateObject("ADOMD.Catalog")
Set cst = Server.CreateObject("ADOMD.CellSet")

'************************************************************************
'*** Check to see if the Session Object Server Name is present
'*** If present then: Create Active Connection using Server Name
'*** and MSOLAP as connection Provider
'*** If not present then: Use default settings of a known OLAP Server
'*** for Server Name for Connection Set Server Name Session Object
'*** to default value
'************************************************************************
If Len(Session("ServerName")) > 0 Then
    cat.ActiveConnection = "Data Source=" & Session("ServerName") & _
        ";Initial Catalog=" & Session("InitialCatalog") & _
        ";Provider=msolap;"
Else

'************************************************************************
'*** Must set OLAPServerName to OLAP Server that is
'*** present on network
'************************************************************************
    OLAPServerName = "Please set to present OLAP Server"
    cat.ActiveConnection = "Data Source=" & OLAPServerName & _
        ";Initial Catalog=FoodMart;Provider=msolap;"
    Session("ServerName") = OLAPServerName
    Session("InitialCatalog") = "FoodMart"
End if
'************************************************************************
'*** Check to see if the Session Object MDXQuery is present
'*** If present then: Set strSource using MDXQuery Session Object
'*** If not present then: Use default MDX Query string of a known query
'*** that works with default server Set MDXQuery Session Object to
'*** default value
'************************************************************************
If Len(Session("MDXQuery")) < 5 Then
    strSource = strSource & "SELECT "
    strSource = strSource & "CROSSJOIN({[Store].[Store Country].MEMBERS},"
    strSource = strSource & "{[Measures].[Store " & _
        "Invoice],[Measures].[Supply Time]}) ON COLUMNS,"
    strSource = strSource & "CROSSJOIN({[Time].[Year].MEMBERS},"
    strSource = strSource & "CROSSJOIN({[Store Type].[Store " & _
        "Type].Members},{[Product].[Product Family].members})) ON ROWS"
    strSource = strSource & " FROM Warehouse"
Else
    strSource = Session("MDXQuery")
End if

'************************************************************************
'*** Set Cell Set Source property to strSource to be passed on cell set
'*** open method
'************************************************************************
    cst.Source = strSource

'************************************************************************'*** Set Cell Sets Active connection to use the current Catalogs Active
'*** connection
'************************************************************************
Set cst.ActiveConnection = cat.ActiveConnection

'************************************************************************
'*** Using Open method, Open cell set
'************************************************************************
cst.Open

'************************************************************************
'*** Standard HTML to collect Sever Name and MDX Query Information
'*** Note that post action posts back to same page to process
'*** thus using state of Session Variables to change look of page
'************************************************************************
%>
<form action="ASPADOComplex.asp" method="POST" id="form1" name="form1">
<table>
<tr><td align="left">
<b>Olap Server name:</b><br><input type="text" id="strServerName" name="strServerName" value="<%=Session("ServerName")%>" size="20">
<br>
<b>Catalog name:</b><br><input type="text" id="strInitialCatalog" name="strInitialCatalog" value="<%=Session("InitialCatalog")%>" size="20">
</td><td align="center">
<b>MDX Query:</b><br>
<textarea rows="7" cols="70" id="textareaMDX" name="MDXQuery" wrap="soft">
<%=Session("MDXQuery")%>
</textarea>
</td></tr>
</table>
<table>
<tr><td>
<input type="submit" value="Submit MDX Query" id="submit1" name="submit1">
</td><td>
<input type="reset" value="Reset" id="reset1" name="reset1">
</td></tr>
</table>
</form>
<p align="left">
<font color="Black" size="-3">
<%=strSource%>
</font>
</p>
<%
'************************************************************************
'*** Set Dimension Counts minus 1 for Both Axes to intDC0, intDC1
'*** Set Position Counts minus 1 for Both Axes to intPC0, intPC1
'************************************************************************
intDC0 = cst.Axes(0).DimensionCount-1
intDC1 = cst.Axes(1).DimensionCount-1

intPC0 = cst.Axes(0).Positions.Count - 1
intPC1 = cst.Axes(1).Positions.Count - 1

'************************************************************************
'*** Create HTML Table structure to hold MDX Query return Record set
'************************************************************************
Response.Write "<Table width=100% border=1>"

'************************************************************************
'*** Loop to create Column header for all Dimensions based
'*** on Count of Dimensions for Axes(0)
'************************************************************************
For h=0 to intDC0
    Response.Write "<TR>"

'************************************************************************
'*** Loop to create spaces in front of Column headers
'*** to align with Row headers
'************************************************************************
    For c=0 to intDC1
        Response.Write "<TD></TD>"
    Next

'************************************************************************
'*** Check current dimension to see if equal to Last Dimension
'*** If True: Write Table header titles normally to HTML output with out
'*** ColSpan value
'*** If False: Write Table header titles with ColSpan values to HTML
'*** output
'************************************************************************
    If h = intDC0 then

'************************************************************************
'*** Iterate through Axes(0) Positions writing member captions to table
'*** header
'************************************************************************
        For i = 0 To intPC0
            Response.Write "<TH>"
            Response.Write "<FONT size=-2>"
            Response.Write cst.Axes(0).Positions(i).Members(h).Caption
            Response.Write "</FONT>"
            Response.Write "</TH>"
        Next
    Else

'************************************************************************
'*** Iterate through Axes(0) Positions writing member captions to table
'*** header taking into account for the span of columns for duplicate
'*** member captions
'************************************************************************
        CaptionCount = 1
        LastCaption = cst.Axes(0).Positions(0).Members(h).Caption
        Response.Write "<TH"
        For t=1 to intPC0

'************************************************************************
'*** Check to see if LastCaption is equal to current members caption
'*** If True: Add one to CaptionCount to increase Colspan value
'*** If False: Write Table header titles with ColSpan values to HTML
'*** output using current CaptionCount for Colspan and LastCaption for
'*** header string
'************************************************************************
            If LastCaption = _
                cst.Axes(0).Positions(t).Members(h).Caption then
                CaptionCount = CaptionCount+1

'************************************************************************
'*** Check if at last position
'*** If True: Write HTML to finish table row using current
'*** CaptionCount and LastCaption
'************************************************************************
                If t = intPC0 then
                    Response.Write " colspan=" & CaptionCount & _
                        "><FONT size=-2>" & LastCaption & "</FONT></TH>"
                End if

            Else
                Response.Write " colspan=" & CaptionCount & _
                    "><FONT size=-2>" & LastCaption & "</FONT></TH><TH"
                CaptionCount = 1
                LastCaption=cst.Axes(0).Positions(t).Members(h).Caption
            End if
        Next
            End if
            Response.Write "</TR>"
        Next

'************************************************************************
'*** Iterate through Axes(1) Positions first writing member captions
'*** to table row headers then writing cell set data to table structure
'************************************************************************
        Dim aryRows()
        Dim intArray,Marker
        intArray=0

'************************************************************************
'*** Set value of Array for row header formatting
'************************************************************************
        For a=1 To intDC1
            intArray = intArray+(intPC1+1)
        Next
        intArray = intArray-1
        ReDim aryRows(intArray)
        Marker=0

'************************************************************************
'*** Use Array values for row header formatting to provide
'*** spaces under beginning row header titles
'************************************************************************
        For j = 0 To intPC1
            Response.Write "<TR>"
            For h=0 to intDC1
                If h=intDC1 then
                    Response.Write "<TD><B>"
                    Response.Write "<FONT size=-2>"
                    Response.Write cst.Axes(1).Positions(j).Members(h).Caption
                    Response.Write "</FONT>"
                    Response.Write "</B></TD>"
                Else
                    aryRows(Marker) = _
                        cst.Axes(1).Positions(j).Members(h).Caption
                    If Marker < intDC1 then
                        Response.Write "<TD><B>"
                        Response.Write "<FONT size=-2>"
                        Response.Write _
                            cst.Axes(1).Positions(j).Members(h).Caption
                        Response.Write "</FONT>"
                        Response.Write "</B></TD>"
                        Marker = Marker + 1
                    Else
                        If aryRows(Marker) = aryRows(Marker - intDC1) then
                            Response.Write "<TD>&nbsp;</TD>"
                            Marker = Marker + 1
                        Else
                            Response.Write "<TD><B>"
                            Response.Write "<FONT size=-2>"
                            Response.Write _
                                cst.Axes(1).Positions(j).Members(h).Caption
                            Response.Write "</FONT>"
                            Response.Write "</B></TD>"
                            Marker = Marker + 1
                        End if
                    End if
                End if
            Next

'************************************************************************
'*** Alternates Cell background color
'************************************************************************
            If (j+1) Mod 2 = 0 Then
                csw = "#cccccc"
            Else
                csw = "#ccffff"
            End If
            For k = 0 To intPC0
                Response.Write "<TD align=right bgcolor="
                Response.Write csw
                Response.Write ">"
                Response.Write "<FONT size=-2>"

'************************************************************************
'*** FormattedValue property pulls data
'************************************************************************
                Response.Write cst(k, j).FormattedValue
                Response.Write "</FONT>"
                Response.Write "</TD>"
            Next
            Response.Write "</TR>"
        Next
        Response.Write "</Table>"

%>
</font>
</body>
</html>


CubeDef の例 (VBScript)

この例では、Web ページ上にキューブ メタデータを表示します。

<%@ Language=VBScript %>
<%
Response.Buffer=True
'Response.Expires=0
%>
<html>
<head>
<meta NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</head>
<body>

<%
Server.ScriptTimeout=360
Dim cat,cdf,di,hi,le,mem,strServer,strSource,strCubeName

'************************************************************************
'*** Set Session Variables
'************************************************************************
Session("CubeName") = Request.Form("strCubeName")
Session("CatalogName") = Request.Form("strCatalogName")
Session("ServerName") = Request.Form("strServerName")
Session("chkDim") = Request.Form("chkDimension")
Session("chkHier") =  Request.Form("chkHierarchy")
Session("chkLev") =  Request.Form("chkLevel")

'************************************************************************
'*** Create Catalog Object
'************************************************************************************
Set cat = Server.CreateObject("ADOMD.Catalog")

If Len(Session("ServerName")) > 0 Then
    cat.ActiveConnection = "Data Source=" & Session("ServerName") & ";Initial Catalog=" & Session("CatalogName") & ";Provider=msolap;"
Else
'************************************************************************************
'*** Must set OLAPServerName to OLAP Server that is
'*** present on network
'************************************************************************
OLAPServerName = "Please set to present OLAP Server"
    cat.ActiveConnection = "Data Source=" & OLAPServerName & _
        ";Initial Catalog=FoodMart;Provider=msolap;"
    Session("ServerName") = OLAPServerName
    Session("InitialCatalog") = "FoodMart"
End if

If Len(Session("CubeName")) > 0 Then
    Set cdf = cat.CubeDefs(Session("CubeName"))
Else
    Set cdf = cat.CubeDefs("Sales")
    Session("CubeName")="Sales"
End if

'************************************************************************
'*** Collect Information in HTML Form
'************************************************************************
%>
<form action="ASPADOCubeDoc.asp" method="post" id="form1" name="form1">
<table>
    <tr>
        <td>
        <b>Olap Server name:  </b><br><input type="text" id="strServerName" name="strServerName" value="<%=Session("ServerName")%>" size="20"><br>

        <b>Catalog Name:  </b><br><input type="text" id="strCatalogName" name="strCatalogName" value="<%=Session("CatalogName")%>" size="20"><br>

        <b>Cube Name:  </b><br><input type="text" id="strCubeName" name="strCubeName" value="<%=Session("CubeName")%>" size="20">
        </td>
        <td <TD>
            <b>Add Property Detail:  </b><br>
            Dimension Detail: <input type="checkbox" id="chkDimension" name="chkDimension"><br>

            Hierarchy Detail: <input type="checkbox" id="chkHierarchy" name="chkHierarchy"><br>

            Level Detail: <input type="checkbox" id="chkLevel" name="chkLevel">
        </td>
    </tr>
</table>
<input type="submit" value="Cube Information" id="submit1" name="submit1"><input type="reset" value="Reset" id="reset1" name="reset1">
</form>
<%

'************************************************************************
'*** Start of Report
'************************************************************************
Response.Write "<H3>Report for " & Session("CubeName") & " Cube</H3>"
Response.Write "<OL TYPE='i'>"

'************************************************************************
'*** Show properties of Cube
'************************************************************************
                For i = 0 To cdf.Properties.Count - 1
                    Response.Write "<LI>"
                    Response.Write "<FONT size=-2>" & cdf.Properties(i).Name & ": " & cdf.Properties(i).Value & "</FONT>"
                Next
                Response.Write "</OL>"
                Response.Write "<UL TYPE='SQUARE'>"
 '************************************************************************
'*** Loop to display Dimension Name and Properties if Check box is
'*** Checked
'************************************************************************
        For di = 0 To cdf.Dimensions.Count - 1
            Response.Write "<LI>"
            Response.Write "<FONT size=4><B>Dimension: " & _
                cdf.Dimensions(di).Name & "</B></FONT>"
            If Request.Form("chkDimension") = "on" Then
                Response.Write "<OL TYPE='1'>"
                For i = 0 To cdf.Dimensions(di).Properties.Count - 1
                    Response.Write "<LI>"
                    Response.Write "<FONT size=-2>" & _
                        cdf.Dimensions(di).Properties(i).Name & ": " & _
                        cdf.Dimensions(di).Properties(i).Value & "</FONT>"
                Next
                Response.Write "</OL>"
            End If
            Response.Write "<UL TYPE= 'Circle'>"
'************************************************************************
'*** Loop to display Hierarchy Name and Properties if Check box is
'*** Checked
'************************************************************************
            For hi = 0 To cdf.Dimensions(di).Hierarchies.Count - 1
                Response.Write "<LI>"
                Response.Write "<FONT size=3><B>Hierarchy: " & _
                    cdf.Dimensions(di).Hierarchies(hi).Name & "</B></FONT>"
                If Request.Form("chkHierarchy") = "on" Then
                    Response.Write "<OL TYPE='1'>"
                    For i = 0 To _
                        cdf.Dimensions(di).Hierarchies(hi).Properties.Count - 1
                        Response.Write "<LI>"
                        Response.Write "<FONT size=-2>" & _
                            cdf.Dimensions(di).Hierarchies(hi).Properties(i). _
                            Name & ": " & _
                            cdf.Dimensions(di).Hierarchies(hi).Properties(i). _
                            Value & "</FONT>"
                    Next
                    Response.Write "</OL>"
                End If
                Response.Write "<UL TYPE='Disc'>"
'************************************************************************
'*** Loop to display Level Name and Properties if Check box is Checked
'************************************************************************
        For le = 0 To cdf.Dimensions(di).Hierarchies(hi).Levels.Count - 1
                    Response.Write "<LI>"
                    Response.Write "<FONT size=2><B>Level: " & _
                        cdf.Dimensions(di).Hierarchies(hi).Levels(le).Name & _
                        " with a Member Count of: " & _
                        cdf.Dimensions(di).Hierarchies(hi).Levels(le). _
                        Properties("LEVEL_CARDINALITY") & "</B></FONT>"
                    If Request.Form("chkLevel") = "on" Then
                        Response.Write "<OL TYPE='1'>"
                        For i = 0 To cdf.Dimensions(di).Hierarchies(hi).Levels(le). _
                            Properties.Count - 1
                            Response.Write "<LI>"
                            Response.Write "<FONT size=-2>" & _
                                cdf.Dimensions(di).Hierarchies(hi).Levels(le). _
                                Properties(i).Name & ": " & _
                                cdf.Dimensions(di).Hierarchies(hi).Levels(le). _
                                Properties(i).Value & "</FONT>"
                        Next
                        Response.Write "</OL>"
                    End If
                Next
                Response.Write "</UL>"
            Next
            Response.Write "</UL>"
        Next
        Response.Write "</UL>"
%>
</body>
</html>


絶対 URL <定義>

絶対 URL

インターネット、およびイントラネット上のリソースの場所を示す完全な URL。アクセス手段、ホスト名、ドメイン名、パス名、ファイル名などすべて記述します。関連項目: URL、相対 URL


ActiveX コントロール <定義>

ActiveX コントロール

デザイン時または実行時のどちらかで表示要素を備えることの多い自己登録型、インプロセス COM コンポーネント。ActiveX コントロールは、Microsoft Internet Explorer など、Active Document コンテナとの通信機能も備えています。


ADISAPI <定義>

ADISAPI (アドバンスド データ インターネット サーバー アプリケーション プログラミング インターフェイス)

解析、オートメーション コントロール、Recordset マーシャリング、MIME パッケージ化を提供する ISAPI DLL。ADISAPI コンポーネントは、Microsoft Internet Information Services (IIS) が提供する API で機能します。関連項目: ISAPI


集計関数 <定義>

集計関数

クエリにおいて、テーブルの列の全行を使って値を計算する COUNT、AVG、または STDEV などの関数。式の記述やプログラミングでは、SQL 集計関数 (前述の 3 つの関数など) のほか、ドメイン集計関数を使って、さまざまな統計を取ることができます。


エイリアス <定義>

エイリアス

SQL SELECT ステートメント内の列または式に指定する別名。多くの場合は、元の列や式よりも短く、意味がわかりやすくなるように付けます。たとえば、BobSales は、"Select wr-Sales as BobSales from SalesDB." の SELECT ステートメントのエイリアスです。エイリアスでは、動的に列を割り当てて、DataControl オブジェクトのバインドを制御することができます。


アパートメント スレッド <定義>

アパートメント スレッド

1 つのオブジェクトに対するすべての呼び出しが 1 つのスレッドで行われる COM スレッド モデル。アパートメント スレッドでは、COM によって呼び出しの同期とマーシャリングが行われます。関連項目: COM


非同期操作 <定義>

非同期操作

操作の終了を待たずに呼び出し元のプログラムに制御を戻す操作。操作が完了する前にコードの実行が継続されます。関連項目: 同期操作


バインディング エントリ <定義>

バインディング エントリ

テーブルと変数間のマップ。ADO Visual C++ の拡張機能では、Recordset フィールドは C/C++ 変数にマップされています。


ビットマスク <定義>

ビットマスク

一般には、パラメータや戻り値のオプションにフラグを設定するときに使う、他の数値とのビット単位で値を比較するための数値。通常は、この比較は、Visual Basic の And や Or、C++ の & や | で行います。

たとえば、ADO FieldAttributeEnum 値は、フィールドの属性を決めるビットマスクとして利用できます。更新できるかどうかがわからないフィールドがあるとします。Visual Basic では、次の式でテストできます。

Field.Attributes AND adFldUpdatable

結果が TRUE の場合は、フィールドは更新できます。


ブックマーク <定義>

ブックマーク

複数の行セット中の 1 つの行を簡単に参照できるように付ける、識別用のマーカー。


ビジネス オブジェクト <定義>

ビジネス オブジェクト

データ確認やビジネス ルール論理など、一連の定義済み操作を実行するオブジェクト。ビジネス オブジェクトは通常、中間層に位置します。


ビジネス ルール <定義>

ビジネス ルール

企業内の業務処理を定めた原則です。入力規則を使用した編集、ログオンの確認、データベースの照合、方針、アルゴリズム変換などの組み合わせ。"ビジネス ロジック" とも呼ばれます。


計算式 <定義>

計算式

結果が一定ではなく、ほかの値によって値が決まる式。計算時には、一般的にほかのフィールドや行など、別のソースから値を取得して計算します。


チャプタ <定義>

チャプタ

データ ソースの一定範囲の行セットに対する参照。ADO では、通常、チャプタは別の Recordset への参照です。

チャプタ列では、チャプタ列が含まれる Recordset が "親" で、チャプタが表す Recordset が "子" という、"親子関係" を定義できます。


チャプタ エイリアス <定義>

チャプタ エイリアス

親に追加された列を参照するエイリアス。


文字セット <定義>

文字セット

文字セットのそれぞれの数値に対する対応表。たとえば Unicode は、既知のすべての文字をコード化した 16 ビットの文字セットであり、国際的な文字コード化の基準として利用されています。


子 <定義>

子

階層関係の従属側。子とは、階層構造の中で上 (よりルートに近い方) に別のノードがあるノードをいいます。関連項目: 子エイリアス、親子関係、親


子エイリアス <定義>

子エイリアス

子を参照するエイリアス。関連項目: エイリアス、子


CLSID (クラス識別子) <定義>

CLSID (クラス識別子)

COM コンポーネントを識別する汎用一意識別子 (UUID)。各 COM コンポーネントは、Windows レジストリ内に CLSID を持つため、ほかのアプリケーションからもロードできます。関連項目: ProgID、COM


クライアント層 <定義>

クライアント層

分散システムの論理層。通常はユーザーにデータを提供し、ユーザーからの入力を処理します。"フロント エンド" とも呼ばれます。一般には、クライアント層は入力に基づいてサーバーにデータを要求し、結果をフォーマットして表示します。関連項目: 中間層、データ ソース層、分散アプリケーション


COM (コンポーネント オブジェクト モデル) <定義>

COM (コンポーネント オブジェクト モデル)

開発言語や常駐するコンピュータに関係なく、ネットワーク環境でオブジェクトどうしの操作をするためのバイナリ標準。COM 方式のテクノロジには、ActiveX コントロール、オートメーション、および OLE (オブジェクトのリンクと埋め込み) があります。COM では、ほかのコンポーネントに対してオブジェクトの機能を公開したり、オブジェクトでアプリケーションのホスティングができます。COM は、オブジェクトの公開方法や、その公開がプロセスやネットワーク間でどのように機能するかを定義します。さらに、COM は、オブジェクトの有効期間を定義します。


COM コンポーネント <定義>

COM コンポーネント

オブジェクトを提供するために、COM 標準をサポートするバイナリ ファイル (.dll ファイル、.ocx ファイル、および一部の .exe ファイルなど)。これらのファイルには、1 つ以上のクラス ファクトリ、COM クラス、レジストリ エントリ機構、コードのロードなどに使うコードを収めます。


比較演算子 <定義>

比較演算子

2 つの式を比較し、ブール型 (Boolean) の値を返す演算子。

">" (より大きい)、"<" (より小さい)、"=" (等しい)、">=" (以上)、"<=" (以下)、"<>" (等しくない)、または "like" (パターン マッチング) などで表される条件パラメータ。


コンポーネント <定義>

コンポーネント

データとコードの両方をカプセル化して、一般的に有用な機能を適切に盛り込んだオブジェクト。


複合ファイル <定義>

複合ファイル

複数ファイルにまたがる COM 構造化された記憶領域の実装。複合ファイルでは、ストレージ オブジェクトとストリーム オブジェクトという 2 つのメイン要素からなる 1 つの構造化ファイルに、別々のオブジェクトを格納します。この 2 つが 1 つのファイル内で、ファイル システムのように働きます。詳細については、Microsoft® Platform SDK の「Compound Files」を参照してください。

1 つの物理ファイルにバインドした複数のファイル。複合ファイル内の各ファイルには、1 つの物理ファイルのようにアクセスできます。


定数 <定義>

定数

変化しない数値または文字列値。名前付き ADO 列挙 (列挙定数) は、コード内で実数の代わりに使うことができます。たとえば adUseClient は値が 3 の定数です (Const adUseClient = 3)。関連項目: 列挙


カーソル <定義>

カーソル

レコードの移動、データの更新、別のユーザーによるデータベース変更の参照可能範囲を制御するデータベースの要素。


データ バインディング <定義>

データ バインディング

アプリケーションのオブジェクトやコントロールをデータ ソースに関連付けるプロセス。データ ソースに関連付けられたコントロールを "データ連結コントロール" といいます。

データ連結コントロールの内容は、データベースの値に関連付けられます。たとえば、Recordset オブジェクトにバインドされたグリッド コントロールは、Recordset 内の行が更新された時に更新される場合があります。Recordset によって新しい値が取得されると、新しい値がグリッドに表示されます。


データ プロバイダ <定義>

データ プロバイダ

ADO アプリケーションにデータを直接公開するソフトウェア。関連項目: サービス プロバイダ


データ シェイプ <定義>

データ シェイプ

データだけでなく、ほかの Recordset オブジェクトやほかの Recordset に基づいて計算した値の両方またはどちらかの参照を格納する特別な Recordset オブジェクト (シェイプされた Recordset) を正規化構文 (Shape 言語) を使って定義する方法。


DCOM <定義>

DCOM (分散コンポーネント オブジェクト モデル)

COM コンポーネントどうしがネットワークを介して直接通信できるようにするためのオンライン プロトコルです。関連項目: COM、コンポーネント


DDL (データ定義言語) <定義>

DDL (データ定義言語)

SQL言語における、データを定義するステートメント。データ操作のステートメントと対応するものです。データベース スキーマは、DLL で作成または変更します。たとえば、CREATE TABLE、CREATE INDEX、GRANT、および REVOKE は SQL DDL ステートメントです。


既定ストリーム <定義>

既定ストリーム

Microsoft OLE DB Provider for Internet Publishing など、一定の OLE DB プロバイダを使うときに、Record オブジェクトまたは Recordset オブジェクトに関連付けられる (Stream オブジェクトで表した) テキストまたはバイナリ ストリーム。既定ストリームには、通常は Web サイトのルート用の HTML コードなどのファイルの内容を格納します。


接続されていない Recordset <定義>

接続されていない Recordset

サーバーとの接続が既に切られた状態の、クライアント キャッシュ内にある Recordset オブジェクト。データの更新など何らかの理由で基となるデータ ソースにアクセスする場合、再接続が必要です。ただし、接続されていない Recordset のコレクション、プロパティ、およびメソッドには、切断後もアクセスできます。


分散アプリケーション <定義>

分散アプリケーション

ネットワーク上の複数のコンピュータで処理を分割できるように記述されたプログラム。一般には、分散アプリケーションはプレゼンテーション、ビジネス ロジック、およびデータ記憶層に、または "層" に分割されます。関連項目: クライアント層、中間層、データ ソース層


DLL (ダイナミック リンク ライブラリ) <定義>

DLL (ダイナミック リンク ライブラリ)

1 つまたは複数の関数を含むファイル。これらの関数を使用するプロセスとは別にコンパイル、リンク、格納されます。オペレーティング システムは、呼び出しプロセスの起動時または実行時に、DLL をそのプロセスのアドレス空間にマップします。


DML (データ操作言語) <定義>

DML (データ操作言語)

SQL言語における、データを操作するステートメント。データ定義のステートメントと対応するものです。データベース内の値は、DML で選択し、変更します。たとえば、INSERT、UPDATE、DELETE、および SELECT は SQL DML ステートメントです。


ドキュメント ソース プロバイダ <定義>

ドキュメント ソース プロバイダ

プロバイダの特別クラス。フォルダとドキュメントを管理します。ドキュメントが Record オブジェクトで表される場合や、ドキュメント フォルダが Recordset オブジェクトで表される場合、ドキュメント ソース プロバイダは、実際のドキュメントではなく、ドキュメントの特性を記述する一意のフィールド セットでこれらのオブジェクトを作成します。関連項目: リソース レコード


DSN (データ ソース名) <定義>

DSN (データ ソース名)

アプリケーションを特定の ODBC データベースに接続するための情報の集まり。ODBC ドライバ マネージャは、この情報を基にデータベースとの接続を確立します。DSN は、ファイル (ファイル DSN) または Windows レジストリ (コンピュータ DSN) に格納できます。


データ ソース層 <定義>

データ ソース層

SQL Server データベースなど、DBMS を実行するコンピュータを表す分散システムの論理階層。関連項目: クライアント層、中間層、分散アプリケーション


ダイナミック プロパティ <定義>

ダイナミック プロパティ

データ プロバイダまたはカーソル サービスに固有のプロパティです。データ プロバイダまたはカーソル サービスでは、オブジェクトの Properties コレクションは、自動的 (動的) に作成されます。特定のデータ プロバイダでデータ ソースに接続しない限り、オブジェクトにダイナミック プロパティは設定されません。関連項目: データ プロバイダ、カーソル


列挙 <定義>

列挙

名前付き定数の一覧。一意でない値でも列挙できます。ただし、値のそれぞれの名前は、列挙を定義した範囲内では一意であるものとします。ADO では、列挙は数値のパラメータと戻り値に用い、開発者が (バージョンごとに変化する可能性のある) 数値に惑わされないように ADO コードに意味を与えるものです。たとえば、静的 Recordset を開くには、adOpenStatic 列挙値を使います。

Recordset.Open ,,adOpenStatic

"列挙定数" とも呼ばれます。関連項目: 定数


イベント <定義>

イベント

応答用のコードの記述対象になるオブジェクトによって認識される動作。イベントは、コマンドの実行、トランザクションの完了、レコードセットの移動、データの更新、その他の動作によって生成されます。関連項目: イベント ハンドラ


イベント ハンドラ <定義>

イベント ハンドラ

イベントの発生時に実行されるコード。関連項目: イベント


ハンドラ <定義>

ハンドラ

エラー回復やデータ管理など、一般的で比較的単純な条件や操作を管理するルーチン。


階層 Recordset <定義>

階層 Recordset

別の Recordset が組み込まれた Recordset。関連項目: データ シェイプ、チャプタ

詳細については、「階層 Recordset 内の行へのアクセス」を参照してください。


階層 <定義>

階層

一般に、最上位レベルから、その下位のレベルで構成された順位の定められた構造。ADO では、階層 Recordset でレコードとチャプタ間の親子関係を表します。また、ADO では、Record オブジェクトと Stream オブジェクトは、フォルダやドキュメントなどの階層ツリー構造へのアクセスにも利用できます。ADO MD には、OLAP キューブ内の次元のレベル間の関係を表す Hierarchy オブジェクトもあります。関連項目: 階層 Recordset、親子関係、チャプタ、ツリー


ISAPI <定義>

ISAPI (インターネット サーバー アプリケーション プログラミング インターフェイス)

Microsoft Internet Information Services (IIS) がインストールされている Windows NT Server/Windows 2000 Server などの、インターネット サーバー用の関数のセット。


キー <定義>

キー

行を一意に識別する、テーブル内の 1 つ、または複数の列。通常はテーブルのインデックスの作成に使います。


マーシャリング <定義>

マーシャリング

インターフェイス メソッドのパラメータを、スレッドまたはプロセスの境界を越えて、パッケージ化して送ったり、パッケージ化を解除するプロセス。


中間層 <定義>

中間層

分散システム内の論理的な階層。ユーザー インターフェイスまたは Web クライアントとデータベースとの間に位置します。一般に、この階層にビジネス オブジェクトがインスタンス化されます。中間層は、情報を受け取ると生成、操作される、ビジネス ルールと機能の集合です。これを可能にしているビジネス ルールは、頻繁に変更されることがあるため、アプリケーション ロジックから物理的に分離されたコンポーネントにカプセル化されています。"アプリケーション サーバー層" とも呼ばれます。関連項目: 分散アプリケーション、クライアント層、データ ソース層


MIME <定義>

MIME (Multi-purpose Internet Mail Extension)

元は、異種のネットワーク環境、コンピュータ環境、電子メール環境間で、情報量の多い電子メール メッセージのやりとりを目的として開発されたインターネット プロトコル。実際には、MIME はメール アプリケーション以外にも採用され、幅広く利用されています。

MIME は、インターネットでバイナリ データを公開して読むための規格です。バイナリ データを格納したファイルのヘッダーには、MIME 型のデータを組み込みます。これで、クライアント プログラム (Web ブラウザやメール パッケージなど) に対して、通常のテキストとは異なる方法でデータを処理する必要があることを伝えます。たとえば、JPEG 画像を格納した Web ドキュメントのヘッダーには、JPEG ファイル形式固有の MIME 型を組み込みます。これにより、JPEG ファイルがある場合、ブラウザは JPEG ビューワでファイルを表示できます。


ノード <定義>

ノード

階層ツリー構造内の要素。ノードは、ルートや、別のノードの子になります。また、ノードは複数の子の親になる場合もあります。関連項目: 階層、ツリー、ルート、子、親


オブジェクト変数 <定義>

オブジェクト変数

オブジェクトの参照を含む変数。たとえば、objCustomObject は、CustomObject 型のオブジェクトを参照する変数です。

Set objCustomObject = CreateObject(adodb.Recordset)


ODBC <定義>

ODBC (オープン データベース コネクティビティ)

さまざまなデータ ソースへの接続に使われる標準プログラミング言語インターフェイス。一般にはコントロール パネルからアクセスします。特定の ODBC ドライバにデータ ソース名 (DSN) を割り当てることができます。


OLE DB <定義>

OLE DB

COM を使って、さまざまなソースからデータを公開するインターフェイスのセット。さまざまな情報ソースに格納されているデータも、OLE DB インターフェイスがあれば同じようにアクセスできます。このインターフェイスでは、データ ソースに適したさまざまな DBMS 機能をサポートしてデータの共有を可能にしています。関連項目: COM


共有的ロック <定義>

共有的ロック

Update メソッドに対する呼び出しの前後を除き、Update メソッドでレコードを更新中は、編集するレコードも含めて 1 つ以上のレコードを持つデータ ページに、ほかのユーザーがアクセスできないようにするロックの種類。

共有的ロックは、LockType パラメータまたは LockType プロパティを adLockOptimistic または adLockBatchOptimistic に設定して Recordset オブジェクトを開いた場合に有効です。関連項目: 排他的ロック


序数値 <定義>

序数値

順番に並んだ項目の数値で表される位置。ADO コレクションでは、最初の項目の序数はゼロ (0) です。その次は 1、2 と続きます。


パラメータ化コマンド <定義>

パラメータ化コマンド

コマンドの実行前にパラメータ値を設定するためのクエリまたはコマンド。たとえば、SQL 文字列にパラメータ マーカー ('?' 文字で指定) を埋め込むと、SQL 文字列をパラメータ化できます。これにより、アプリケーションは各パラメータの値を指定し、コマンドを実行します。


親 <定義>

親

階層関係にあって制御する側。階層構造では、親には 1 つ以上の子がそのすぐ下にあります。関連項目: 親エイリアス、親子関係、子


親エイリアス <定義>

親エイリアス

親を参照するエイリアス。関連項目: エイリアス、親


親子関係 <定義>

親子関係

階層構造において、親が子の 1 層上にあり、1 つ以上の子と直接関連付けられている関係。子は親の 1 層下にあって、必ず親を 1 つ持ちます。関連項目: 親、子


永続化 <定義>

永続化

Recordset をファイルに保存するときのように、データを恒久的に保存すること。


排他的ロック <定義>

排他的ロック

編集中のレコードも含め、1 つ以上のレコードを持つページにほかのユーザーがアクセスできないようにして、更新を確実に行うためのロックの種類。排他的ロックの動作は、OLE DB プロバイダによって定義されます。一般に、Update メソッドが終了するまで、編集中のレコードはロックされてアクセスできません。

排他的ロックは、LockType パラメータまたは LockType プロパティを adLockPessimistic に設定して Recordset オブジェクトを開いた場合に有効です。関連項目: 共有的ロック


プール <定義>

プール

オブジェクトまたはデータベース接続などで、既に割り当てられたリソースのコレクションを使うことによるパフォーマンスの最適化。新しいリソースを作成するよりも、プールから既存のリソースを取り出す方が効率的です。


ProgID (プログラム識別子) <定義>

ProgID (プログラム識別子)

COM アプリケーションによって Windows レジストリにマップされる一意の名前。ADO 接続用の ProgID は、"ADODB.Connection" です。関連項目: CLSID、COM


プロキシ <定義>

プロキシ

インターフェイス固有のオブジェクト。異なるスレッドや別のプロセスなど、異なる実行環境で動作しているアプリケーション オブジェクトを、クライアントから呼び出すときに必要なパラメータ マーシャリングおよび通信を提供します。プロキシはクライアント側にあり、クライアントから呼び出したアプリケーション オブジェクトで指定する対応スタブと通信します。関連項目: スタブ


相対 URL <定義>

相対 URL

部分修飾の URL。絶対 URL や等価 ADO 接続オブジェクトで指定した起点からの相対的位置にあるインターネットやイントラネットのリソースを指定します。実際には、絶対 URL と相対 URL を組み合わせて完全な URL を構成します。関連項目: URL、絶対 URL


リモート データ ソース <定義>

リモート データ ソース

(クライアント アプリケーションを実行している) ローカル システムではなく別のコンピュータにあるデータ ソースのこと。


リソース レコード <定義>

リソース レコード

フォルダやドキュメントの定義および記述用のフィールドを備えた、ドキュメント ソース プロバイダが提供するレコード。ドキュメント自体がリソース レコードにあるわけではなく、一般には既定ストリームや、URL を含むリソース レコード内のフィールドでアクセスします。関連項目: ドキュメント ソース プロバイダ、既定ストリーム、URL


ルート <定義>

ルート

階層ツリー構造の最上位のレベル。ルート ノードは、親を持つことはありませんが、子を持つ場合はあります。関連項目: 階層、ツリー、親、子


行セット <定義>

行セット

データ ソースから返される 1 組の行で、すべて同じフィールド スキーマを持ちます。行セットは、テーブルの、すべてのフィールドまたは一部のフィールドを表します。また、クエリで作成した仮想テーブルや、2 つ以上のテーブルを結合した仮想テーブルを表す場合もあります。ADO では、行セットは Recordset オブジェクトで表されます。


スキーマ <定義>

スキーマ

データベースからデータベース管理システム (DBMS) に対するデータベースに関する記述。通常は、DBMS が提供するデータ定義言語によって生成されます。スキーマは、テーブル、列、プロパティなど、データベースの属性を定義します。


適用範囲 <定義>

適用範囲

オブジェクトや変数の参照範囲、またはビューやテーブル内のレコードの範囲。たとえば、ローカル変数はそれを定義したプロシージャ内だけで参照できます。パブリック変数はアプリケーションのどこからでもアクセスできます。カレント データベースなどのオブジェクトは、定義済みの検索パスにある場合に適用範囲内になります。レコードの範囲は、さまざまなコマンドの Scope 節で指定できます。


サービス プロバイダ <定義>

サービス プロバイダ

データの作成や利用によってサービスをカプセル化し、ADO アプリケーションの機能を拡張するソフトウェア。プロバイダは、データを直接公開する代わりにクエリ処理などのサービスを提供します。サービス プロバイダは、データ プロバイダによって提供されたデータを処理します。関連項目: データ プロバイダ


シェイプされた Recordset <定義>

シェイプされた Recordset

データだけでなく、ほかの Recordset オブジェクトや Recordset オブジェクトに基づく計算値の両方またはどちらかに対する参照 (チャプタ) を格納できるように、列に特別な定義をした Recordset。


兄弟 <定義>

兄弟

階層構造で、同じレベルにある複数のノード。ルート ノードには兄弟はありません。


ストアド プロシージャ <定義>

ストアド プロシージャ

SQL ステートメントや、必要に応じての制御フロー ステートメントなどのコンパイル済みのコード コレクション。名前を付けて保存し、1 つの単位として処理されます。ストアド プロシージャは、データベース内に保存します。アプリケーションからの 1 回の呼び出しで実行でき、ユーザー宣言変数、条件付き実行、その他強力な機能を備えています。


スタブ <定義>

スタブ

インターフェイス固有のオブジェクト。異なるスレッドや別のプロセスなど、異なる実行環境で動作しているクライアントからの呼び出しを、アプリケーション オブジェクトが受けるときに必要なパラメータ マーシャリングおよび通信を提供します。スタブはアプリケーション オブジェクトで指定し、アプリケーション オブジェクトを呼び出したクライアントで指定する対応プロキシと通信します。関連項目: プロキシ


サブノード <定義>

サブノード

関連項目: 子


同期操作 <定義>

同期操作

コードによって開始され、次の操作の開始前に終了する操作。関連項目: 非同期操作


ツリー <定義>

ツリー

要素 (ノード) 間の階層関係を表す構造。ツリーの最上位レベル (ルート) には、ノードは 1 つしかありません。ルートの下には複数の子を配置できます。子は、それぞれほかの子の親になることができ、こうして木のように枝分かれします。ツリー構造の代表例として、ドキュメントやほかのフォルダを収めたフォルダがあります。関連項目: 階層、ノード、ルート、子、親


URL (Uniform Resource Locator) <定義>

URL (Uniform Resource Locator)

インターネットやイントラネット上にあるリソースの場所を指定します。完全な URL は、スキーマ (FTP、HTTP、mailto、file など) と、それに続くコロン、サーバー名、およびリソース (ドキュメント、グラフィック、またはその他のファイル) の絶対パスから成ります。次に、URL の例を示します。

http://www.domain.com/default.html
ftp://ftp.server.somewhere/ftp.file
file://Server/Share/File.doc

関連項目: 絶対URL、相対 URL


Web サーバー <定義>

Web サーバー

イントラネットやインターネットのユーザーに対し、Web サービスと Web ページを提供するコンピュータ。


手順 2: コマンドの作成 (ADO チュートリアル) サイドバー

コマンドは、"パラメータ化" することができます。パラメータ化コマンドはコマンド テキストから構成され、そのテキストは、コマンドが実行されるごとにユーザー指定の値で変更することができます。

プレースホルダ ('?') は、コマンド テキスト内で変更可能な部分を示します。コマンド テキスト内の各プレースホルダは、コマンドが実行される時に Parameters コレクション内の対応する Parameter オブジェクトの値に置き換えられます。

Parameter オブジェクトを作成し、それを Command オブジェクトの Parameters コレクションに追加するには、2 通りの方法があります。1 つは、Parameter オブジェクトを作成して、Name、Type、Direction、Size、および Value の各プロパティを個別に設定してから、Parameters コレクションに追加する方法です。もう 1 つは、Parameter オブジェクトを Command オブジェクトの CreateParameter メソッドで作成してプロパティを設定する方法、つまり、新しく作成された Parameter オブジェクトを追加するのに、すべてを 1 つのステートメントで行う方法です。

最後に、Command. Execute または Recordset. Open メソッドを呼び出して、パラメータでプレースホルダを置き換え、Recordset を取得します。Parameter オブジェクトの Value プロパティを別の名前に変更します。その後、Execute または Recordset. Close と Open メソッドを再び呼び出し、別の著作者のために新しい Recordset を取得します。

パラメータ化コマンドのパフォーマンスを Prepared プロパティで最適化します。Execute メソッドでは、Recordset オブジェクトの CursorType または LockType プロパティを指定できないことに注意してください。

次に、簡単な例を示します。

Public Sub main()
Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim prm As ADODB.Parameter
Dim strCmd As String

strCmd = "SELECT * FROM Authors WHERE au_lname = ?"
cmd.CommandText = strCmd
cmd.Parameters.Append _
    cmd.CreateParameter("last name", adVarChar, adParamInput, 40, "")

cnn.Open "dsn=Pubs;uid=sa;pwd=;"
cmd.ActiveConnection = cnn

cmd.Parameters("last name") = "Ringer"
DisplayRst cmd.Execute
cmd.Parameters("last name") = "Karsen"
DisplayRst cmd.Execute

cnn.Close
End Sub

Private Sub DisplayRst(rst As ADODB.Recordset)
If rst.EOF = True Then
    Debug.Print "No recordset returned for Name = '"; _
                    rst.ActiveCommand.Parameters(0); "'"
End If
While rst.EOF = False
    Debug.Print "Name = '"; rst!au_fname; " "; rst!au_lname; "'"
    rst.MoveNext
Wend
End Sub

戻る 手順 2: コマンドの作成


手順 4: データの操作 (ADO チュートリアル) のスキーマ

次の表は、Pubs データベースの Authors テーブルのスキーマです。

列名 | データ型 (長さ) | Null 値
au_id | ID (11) | 不可
au_lname | varchar(40) | 不可
au_fname | varchar(20) | 不可
Phone | char(12) | 不可
Address | varchar(40) | 可
City | varchar(20) | 可
State | char(2) | 可
Zip | char(5) | 可
Contract | bit | 不可

戻る 手順 4: データの操作