使用動態存取子
動態存取子可讓您在不知道資料庫架構 (基礎結構) 時存取數據源。 OLE DB 範本連結庫提供數個類別來協助您。
DynamicConsumer 範例示範如何使用動態存取子類別來取得數據行資訊,並動態建立存取子。
使用 CDynamicAccessor
當您不知道資料庫架構時,CDynamicAccessor 可讓您存取數據源(資料庫的基礎結構)。 CDynamicAccessor
方法會取得數據行資訊,例如數據行名稱、計數和數據類型。 您可以使用這個資料行資訊,在運行時間動態建立存取子。 數據行資訊會儲存在由這個類別建立和管理的緩衝區中。 使用 GetValue 方法從緩衝區取得數據。
範例:CDynamic 存取子
// 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 將它儲存至緩衝區。
範例:CDynamicStringAccessor
// 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 預存程式並取得輸出參數值的範例,請參閱 GitHub 上 Microsoft VCSamples 存放庫中的 DynamicConsumer 範例程式代碼。
另請參閱
使用存取子
CDynamicAccessor 類別
CDynamicStringAccessor 類別
CDynamicParameterAccessor 類別
DynamicConsumer 範例