使用動態存取子
動態存取子可以讓您在不知道資料庫結構描述 (基礎結構) 時存取資料來源。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 的作用很相似於 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 預存程序和取得輸出參數值的方法範例,請參閱知識庫 (Knowledge Base) 文件 Q058860<HOWTO: Execute Stored Procedure using CDynamicParameterAccessor>。您可以在 MSDN Library 的 Visual Studio 文件或 https://support.microsoft.com 中找到知識庫文件。