共用方式為


使用動態存取子

動態存取子可讓您在不知道資料庫架構 (基礎結構) 時存取數據源。 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::GetParamCDynamicParameterAccessor::GetParamType 從緩衝區取得參數數據。

如需示範如何使用這個類別來執行 SQL Server 預存程式並取得輸出參數值的範例,請參閱 GitHub 上 Microsoft VCSamples 存放庫中的 DynamicConsumer 範例程式代碼。

另請參閱

使用存取子
CDynamicAccessor 類別
CDynamicStringAccessor 類別
CDynamicParameterAccessor 類別
DynamicConsumer 範例