動的アクセサの使用
更新 : 2007 年 11 月
動的アクセサを使用すると、データベース スキーマ (基になる構造) が不明な場合でもデータ ソースにアクセスできます。OLE DB テンプレート ライブラリには、動的アクセサの使用に役立つクラスがいくつか用意されています。
DynamicConsumer のサンプルには、動的アクセサ クラスを使用して、列情報を取得し、アクセサを動的に作成する方法が示されています。
CDynamicAccessor の使い方
CDynamicAccessor を使用すると、データベース スキーマ (データベースの基本的な構造) を理解していない場合でも、データ ソースにアクセスできます。CDynamicAccessor メソッドは、列名、列数、およびデータ型などの列情報を取得します。この列の情報は、実行時にアクセサを動的に作成するときに使用します。列情報は、このクラスによって作成および管理されるバッファに格納されます。GetValue メソッドを使用してバッファからデータを取得します。
例
コード
// Using_Dynamic_Accessors.cpp
// compile with: /c /EHsc
#include <stdio.h>
#include <objbase.h>
#include <atldbcli.h>
int main( int argc, char* argv[] )
{
HRESULT hr = CoInitialize( NULL );
CDataSource ds;
CSession ss;
CTable<CDynamicAccessor> rs;
// The following is an example initialization string:
hr = ds.OpenFromInitializationString(L"Provider=SQLOLEDB.1;"
L"Integrated Security=SSPI;Persist Security Info=False;"
L"Initial Catalog=Loginname;Data Source=your_data_source;"
L"Use Procedure for Prepare=1;Auto Translate=True;"
L"Packet Size=4096;Workstation ID=LOGINNAME01;"
L"Use Encryption for Data=False;"
L"Tag with column collation when possible=False");
hr = ss.Open( ds );
hr = rs.Open( ss, "Shippers" );
hr = rs.MoveFirst( );
while( SUCCEEDED( hr ) && hr != DB_S_ENDOFROWSET )
{
for( size_t i = 1; i <= rs.GetColumnCount( ); i++ )
{
DBTYPE type;
rs.GetColumnType( i, &type );
printf_s( "Column %d [%S] is of type %d\n",
i, rs.GetColumnName( i ), type );
switch( type )
{
case DBTYPE_WSTR:
printf_s( "value is %S\n",
(WCHAR*)rs.GetValue( i ) );
break;
case DBTYPE_STR:
printf_s( "value is %s\n",
(CHAR*)rs.GetValue( i ) );
default:
printf_s( "value is %d\n",
*(long*)rs.GetValue( i ) );
}
}
hr = rs.MoveNext( );
}
rs.Close();
ss.Close();
ds.Close();
CoUninitialize();
return 0;
}
CDynamicStringAccessor の使い方
CDynamicStringAccessor は、1 つの重要な点を除いて CDynamicAccessor と同様に動作します。CDynamicAccessor はプロバイダによって報告されたネイティブな形式でデータを要求しますが、CDynamicStringAccessor はアクセスされるすべてのデータをデータ ストアから文字列データとしてフェッチするようにプロバイダに要求します。これは、特にデータ ストアのコンテンツの表示または印刷などのように、データ ストアの値の計算を要求しない単純なタスクで役に立ちます。
列情報を取得するには CDynamicStringAccessor メソッドを使用します。この列の情報は、実行時にアクセサを動的に作成するときに使用します。列情報は、このクラスによって作成および管理されるバッファに格納されます。バッファからデータを取得するには、CDynamicStringAccessor::GetString を使用します。また、データをバッファに格納するには、CDynamicStringAccessor::SetString を使用します。
例
コード
// Using_Dynamic_Accessors_b.cpp
// compile with: /c /EHsc
#include <stdio.h>
#include <objbase.h>
#include <atldbcli.h>
int main( int argc, char* argv[] )
{
HRESULT hr = CoInitialize( NULL );
if (hr != S_OK)
{
exit (-1);
}
CDataSource ds;
CSession ss;
CTable<CDynamicStringAccessor> rs;
// The following is an example initialization string:
hr = ds.OpenFromInitializationString(L"Provider=SQLOLEDB.1;"
L"Integrated Security=SSPI;Persist Security Info=False;"
L"Initial Catalog=Loginname;Data Source=your_data_source;"
L"Use Procedure for Prepare=1;Auto Translate=True;"
L"Packet Size=4096;Workstation ID=LOGINNAME01;"
L"Use Encryption for Data=False;"
L"Tag with column collation when possible=False");
hr = ss.Open( ds );
hr = rs.Open( ss, "Shippers" );
hr = rs.MoveFirst( );
while( SUCCEEDED( hr ) && hr != DB_S_ENDOFROWSET )
{
for( size_t i = 1; i <= rs.GetColumnCount( ); i++ )
{
printf_s( "column %d value is %s\n",
i, rs.GetString( i ) );
}
hr = rs.MoveNext( );
}
rs.Close();
ss.Close();
ds.Close();
CoUninitialize();
return 0;
}
CDynamicParameterAccessor の使い方
CDynamicParameterAccessor は CDynamicAccessor と同様ですが、CDynamicParameterAccessor は ICommandWithParameters インターフェイスを呼び出すことで設定されるパラメータ情報を取得する点が異なります。コンシューマがこのクラスを使用するには、プロバイダで ICommandWithParameters がサポートされている必要があります。
パラメータ情報は、このクラスによって作成および管理されるバッファに格納されます。パラメータ データは、CDynamicParameterAccessor::GetParam と CDynamicParameterAccessor::GetParamType を使用してバッファから取得します。
このクラスを使用して SQL Server のストアド プロシージャを実行し、出力パラメータ値を取得する方法の例については、サポート技術情報の「HOWTO: Execute Stored Procedure Using CDynamicParmeterAccesor (Q198519)」を参照してください。サポート技術情報の文書は、MSDN ライブラリの Visual Studio のドキュメント、または https://support.microsoft.com で参照できます。
参照
処理手順
DynamicConsumer サンプル : 動的アクセサとスキーマ行セット クラスを使用したデータベースのメタデータの読み取り