db_command
OLE DB のコマンドを作成します。
[ db_command(
command,
name,
source_name,
hresult,
bindings,
bulk_fetch)
]
パラメーター
command
OLE DB コマンドのテキストが含まれたコマンド文字列。 簡単な例を次に示します。:[ db_command ( command = "Select * from Products" ) ]
コマンド の 構文は 次のとおりです :
binding parameter block 1 OLE DB command binding parameter block 2 continuation of OLE DB command binding parameter block 3 ...
バインディング パラメーターのブロックは 次のように定義されています :
([bindtype 入力] szVar1 [szVar2 [ nVar3 […][出力] )
それぞれの文字について以下に説明します。
( はデータ バインディングのブロックの開始を示します。
**[**bindtype 入力] は次の大文字と小文字列の 1 つです :
[入力] db_column は行セットの列にメンバー変数をバインドします。
[入力] bindto[入力] db_column(と同じ)。
入力パラメーター として [入力] のバインドのメンバー変数。
出力パラメーター として [入力] のバインドのメンバー変数。
入出力パラメーター として [入力出力] のバインドのメンバー変数。
SzVarX は 現在のスコープ内のメンバー変数に解決します。
) はデータ バインディングのブロックの終了を示します。
コマンド文字列が一つ以上の指定子が [入力] 含まれている場合[]または [in/out] db_command はパラメーターのマップを作成します。
コマンド文字列が一つ以上のパラメーターをなどの db_column [入力] または [入力] bindto 含まれている場合はdb_command は行セットこれらの変数を処理するためにアクセサーのマップを生成します。 詳細についてはdb_accessor を参照してください。
注意
[db_command をクラス レベルで使用すると bindtype] 構文と bindings のパラメーターが無効です。
バインディング パラメーターのブロックの例を次に示します。 次の例では Pubs データベースの Authors テーブルの au_fname と au_lname の列に m_au_fname と m_au_lname のデータ メンバーをそれぞれバインドされます :
TCHAR m_au_fname[21]; TCHAR m_au_lname[41]; TCHAR m_state[3] = 'CA'; [db_command ( command = "SELECT au_fname([bindto]m_au_fname), au_lname([bindto]m_au_lname) " \ "FROM dbo.authors " \ "WHERE state = ?([in]m_state)")
]
名前 (省略可能)
は行セットを使用するハンドルの名前。 名前を 指定するとdb_command は行セットを行うかまたは複数のアクションのクエリを実行するために使用できる指定した名前のクラスを生成します。 名前を 指定しなかった場合はユーザーに結果を複数の行に戻すことはできません。source_name (省略可能)
コマンドを実行するかを db_source の属性を持つクラスの CSession の変数またはインスタンスが要素に適用します。 db_source を参照してください。db_command は source_name に使用する変数が有効であるため指定された変数は関数またはグローバル スコープである必要がありますかを確認するチェックします。
hresult (省略可能)
このデータベース コマンドの HRESULT を受け取る変数を識別します。 変数がない場合は属性によって自動的に挿入されます。バインディング (省略可能)
はOLE DB からバインディング パラメーターを区切るされます。bindings の値を指定する場合はdb_command は関連する値を解析し[bindtype] パラメーターを解析されません。 この使用方法はOLE DB プロバイダーの構文を使用できるようになります。 バインディングパラメーターなしの分析を無効にするにはBindings= "" を指定します。
値を指定bindingsしない場合 db_command " (」 「に続く一つ以上の宣言された C++ のメンバー変数にbindtype続く角かっこ [bindtype**]** の後に検索する)バインディング パラメーター」ブロックを解析します。 かっこ内のすべてのテキストはコマンドから削除されこのの列とパラメーター バインディングを作成するためにこれらのパラメーターはコマンドが使用されます。
bulk_fetch(省略可能)
フェッチする行数を指定する整数値。既定値は単一の行フェッチを指定する 1 です (行セットは型 CRowset です。
1 を超える値をバルク行フェッチを指定します。 バルク行フェッチはバルク行セットの機能を複数の行ハンドルをフェッチ示します (行セットは型指定 CBulkRowset と行数では SetRows です。
bulk_fetch が 1 未満の場合SetRows はゼロを返します。
解説
db_command はコマンドを実行するにはOLE DB コンシューマーが使用する CCommand のオブジェクトを構築します。
クラスまたは関数内の db_command を使用して ; 主な違いは CCommand のオブジェクトの範囲です。 関数内でバインディングなどのデータは関数の末尾で終了します。 クラスと関数スコープの両方使用方法はOLE DB コンシューマー テンプレート クラス CCommand<> ですがテンプレート引数は関数およびクラスの例のように異なります。 ローカル変数を構成する関数の場合はクラスは CAccessor- 引数として派生クラスを推論しますがバインディングは アクセサー になります。 クラスの属性として使用される場合はdb_command は db_column を次に示します。
db_command が結果セットを返さないコマンドの実行に使用できます。
コンシューマー属性プロバイダーがクラスにこの属性を適用するとコンパイラは YourClassName はクラスを受け取るとコンパイラは_YourClassNameAccessor から派生 YourClassName と いうクラスを作成する名前です _YourClassNameAccessor にクラスの名前を変更します。 [クラス ビュー] でこれらのクラスを参照してください。
使用例
このサンプルではテーブルの 1 番を姓の列の CA 選択するコマンドを定義します。 db_command はMoveNext などの OpenAll と CloseAllCRowset のメンバー関数などの機能するウィザードで生成された呼び出す行セットを作成し読み込みます。
このコードはpubs データベースに接続する独自の接続文字列を提供する必要があることに注意してください。 開発環境で実行する方法の詳細については 方法 : サーバー エクスプローラーからデータベースに接続する と How to: Add New Data Connections in Server Explorer/Database Explorer を参照してください。
// db_command.h
#include <atlbase.h>
#include <atlplus.h>
#include <atldbcli.h>
#pragma once
[ db_source(L"your connection string"),
db_command(L" \
SELECT au_lname, au_fname \
FROM dbo.authors \
WHERE state = 'CA'") ]
struct CAuthors {
// In order to fix several issues with some providers, the code below may bind
// columns in a different order than reported by the provider
DBSTATUS m_dwau_lnameStatus;
DBSTATUS m_dwau_fnameStatus;
DBLENGTH m_dwau_lnameLength;
DBLENGTH m_dwau_fnameLength;
[ db_column("au_lname", status="m_dwau_lnameStatus", length="m_dwau_lnameLength") ] TCHAR m_au_lname[41];
[ db_column("au_fname", status="m_dwau_fnameStatus", length="m_dwau_fnameLength") ] TCHAR m_au_fname[21];
[ db_param("7", paramtype="DBPARAMIO_INPUT") ] TCHAR m_state[3];
void GetRowsetProperties(CDBPropSet* pPropSet) {
pPropSet->AddProperty(DBPROP_CANFETCHBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
pPropSet->AddProperty(DBPROP_CANSCROLLBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
}
};
// db_command.cpp
// compile with: /c
#include "db_command.h"
int main(int argc, _TCHAR* argv[]) {
HRESULT hr = CoInitialize(NULL);
// Instantiate rowset
CAuthors rs;
// Open rowset and move to first row
strcpy_s(rs.m_state, sizeof(rs.m_state), _T("CA"));
hr = rs.OpenAll();
hr = rs.MoveFirst();
// Iterate through the rowset
while( SUCCEEDED(hr) && hr != DB_S_ENDOFROWSET ) {
// Print out the column information for each row
printf("First Name: %s, Last Name: %s\n", rs.m_au_fname, rs.m_au_lname);
hr = rs.MoveNext();
}
rs.CloseAll();
CoUninitialize();
}
このサンプルではデータ ソース クラス CMySource の db_source を使用してコマンドの db_command は CCommand1 と CCommand2 が用意されています。
// db_command_2.cpp
// compile with: /c
#include <atlbase.h>
#include <atlplus.h>
#include <atldbcli.h>
// class usage for both db_source and db_command
[ db_source(L"your connection string"),
db_command(L" \
SELECT au_lname, au_fname \
FROM dbo.authors \
WHERE state = 'CA'") ]
struct CMySource {
HRESULT OpenDataSource() {
return S_OK;
}
};
[db_command(command = "SELECT * FROM Products")]
class CCommand1 {};
[db_command(command = "SELECT FNAME, LNAME FROM Customers")]
class CCommand2 {};
int main() {
CMySource s;
HRESULT hr = s.OpenDataSource();
if (SUCCEEDED(hr)) {
CCommand1 c1;
hr = c1.Open(s);
CCommand2 c2;
hr = c2.Open(s);
}
s.CloseDataSource();
}
必要条件
属性コンテキスト
対象 |
クラス struct のメンバーはローカル メソッド |
複数回の適用 |
X |
必要な属性 |
なし |
無効な属性 |
なし |
属性コンテキストの詳細については、「属性コンテキスト」を参照してください。