Używanie dynamicznych metod dostępu

Dynamiczne metody dostępu umożliwiają dostęp do źródła danych, gdy nie masz wiedzy na temat schematu bazy danych (podstawowej struktury). Biblioteka szablonów OLE DB udostępnia kilka klas, które ułatwiają.

W przykładzie DynamicConsumer pokazano, jak za pomocą dynamicznych klas dostępu uzyskać informacje o kolumnie i dynamicznie tworzyć metody dostępu.

Korzystanie z CDynamicAccessor

CDynamicAccessor umożliwia dostęp do źródła danych, gdy nie znasz schematu bazy danych (podstawowej struktury bazy danych). CDynamicAccessor metody pobierają informacje o kolumnach, takie jak nazwy kolumn, liczba i typ danych. Te informacje w kolumnie służą do dynamicznego tworzenia metody dostępu w czasie wykonywania. Informacje o kolumnie są przechowywane w buforze utworzonym i zarządzanym przez tę klasę. Pobieranie danych z buforu przy użyciu metody GetValue .

Przykład: akcesory 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;
}

Korzystanie z CDynamicStringAccessor

CDynamicStringAccessor działa jak CDynamicAccessor, z wyjątkiem jednego ważnego sposobu. Podczas gdy CDynamicAccessor żąda danych w formacie natywnym zgłoszonym przez dostawcę, CDynamicStringAccessor dostawca pobiera wszystkie dane, do których uzyskuje dostęp z magazynu danych jako dane ciągu. Ten proces jest szczególnie przydatny w przypadku prostych zadań, które nie wymagają obliczenia wartości w magazynie danych, takich jak wyświetlanie lub drukowanie zawartości magazynu danych.

Użyj CDynamicStringAccessor metod, aby uzyskać informacje o kolumnie. Te informacje w kolumnie służą do dynamicznego tworzenia metody dostępu w czasie wykonywania. Informacje o kolumnie są przechowywane w buforze utworzonym i zarządzanym przez tę klasę. Pobierz dane z buforu przy użyciu CDynamicStringAccessor::GetString lub zapisz je w buforze przy użyciu CDynamicStringAccessor::SetString.

Przykład: 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;
}

Korzystanie z CDynamicParameterAccessor

CDynamicParameterAccessor jest podobny do CDynamicAccessor, z tą różnicą, że CDynamicParameterAccessor pobiera informacje o parametrach do ustawienia przez wywołanie interfejsu ICommandWithParameters . Dostawca musi obsługiwać ICommandWithParameters użytkownika, aby używał tej klasy.

Informacje o parametrach są przechowywane w buforze utworzonym i zarządzanym przez tę klasę. Pobierz dane parametrów z buforu przy użyciu CDynamicParameterAccessor::GetParam i CDynamicParameterAccessor::GetParamType.

Przykład pokazujący, jak używać tej klasy do wykonywania procedury składowanej programu SQL Server i pobierania wartości parametrów wyjściowych, zobacz przykładowy kod DynamicConsumer w repozytorium Microsoft VCSamples w witrynie GitHub.

Zobacz też

Korzystanie z metod dostępu
CDynamicAccessor, klasa
CDynamicStringAccessor, klasa
CDynamicParameterAccessor, klasa
Przykład DynamicConsumer