Verwenden von dynamischen Accessoren

Mit dynamischen Accessoren können Sie auf eine Datenquelle zugreifen, wenn Sie kein Wissen über das Datenbankschema (zugrunde liegende Struktur) haben. Die OLE DB-Vorlagenbibliothek bietet mehrere Klassen, die Ihnen helfen.

Im Beispiel "DynamicConsumer " wird gezeigt, wie Sie mithilfe der dynamischen Accessorklassen Spalteninformationen abrufen und Accessoren dynamisch erstellen.

Verwenden von CDynamicAccessor

Mit CDynamicAccessor können Sie auf eine Datenquelle zugreifen, wenn Sie kein Wissen über das Datenbankschema haben (die zugrunde liegende Struktur der Datenbank). CDynamicAccessor Methoden rufen Spalteninformationen wie Spaltennamen, Anzahl und Datentyp ab. Sie verwenden diese Spalteninformationen, um einen Accessor dynamisch zur Laufzeit zu erstellen. Die Spalteninformationen werden in einem Puffer gespeichert, der von dieser Klasse erstellt und verwaltet wird. Abrufen von Daten aus dem Puffer mithilfe der GetValue-Methode .

Beispiel: CDynamic-Accessoren

// 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;
}

Verwenden von CDynamicStringAccessor

CDynamicStringAccessor funktioniert wie CDynamicAccessor, außer auf eine wichtige Weise. Fordert zwar CDynamicAccessor Daten im vom Anbieter gemeldeten systemeigenen Format an, fordert jedoch an, dass der Anbieter alle Daten abruft, CDynamicStringAccessor auf die vom Datenspeicher als Zeichenfolgendaten zugegriffen wird. Der Vorgang ist besonders nützlich für einfache Aufgaben, die keine Berechnung von Werten im Datenspeicher erfordern, z. B. das Anzeigen oder Drucken des Inhalts des Datenspeichers.

Verwenden Sie CDynamicStringAccessor Methoden zum Abrufen von Spalteninformationen. Sie verwenden diese Spalteninformationen, um einen Accessor dynamisch zur Laufzeit zu erstellen. Die Spalteninformationen werden in einem puffer gespeichert, der von dieser Klasse erstellt und verwaltet wird. Abrufen von Daten aus dem Puffer mithilfe von CDynamicStringAccessor::GetString oder Speichern im Puffer mithilfe von CDynamicStringAccessor::SetString.

Beispiel: 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;
}

Verwenden von CDynamicParameterAccessor

CDynamicParameterAccessor ähnelt CDynamicAccessor, mit der Ausnahme, dass CDynamicParameterAccessor Parameterinformationen durch Aufrufen der ICommandWithParameters-Schnittstelle festgelegt werden. Der Anbieter muss ICommandWithParameters unterstützen, damit der Consumer diese Klasse verwenden kann.

Die Parameterinformationen werden in einem Puffer gespeichert, der von dieser Klasse erstellt und verwaltet wird. Abrufen von Parameterdaten aus dem Puffer mithilfe von CDynamicParameterAccessor::GetParam und CDynamicParameterAccessor::GetParamType.

Ein Beispiel für die Verwendung dieser Klasse zum Ausführen einer gespeicherten SQL Server-Prozedur und zum Abrufen der Ausgabeparameterwerte finden Sie im DynamicConsumer-Beispielcode im Microsoft VCSamples-Repository auf GitHub.

Siehe auch

Verwenden von Zugriffsmethoden
CDynamicAccessor-Klasse
CDynamicStringAccessor-Klasse
CDynamicParameterAccessor-Klasse
DynamicConsumer-Beispiel