Freigeben über


Verwenden von dynamischen Accessoren

Dynamische Accessoren ermöglichen es Ihnen, auf eine Datenquelle zuzugreifen, wenn Ihnen das Datenbankschema (die zugrunde liegende Struktur) nicht bekannt ist. Die OLE DB-Vorlagenbibliothek enthält verschiedene Klassen, die Sie hierbei unterstützen.

Das Beispiel DynamicConsumer verdeutlicht, wie Sie mithilfe der dynamischen Accessorklassen Spalteninformationen abrufen und Accessoren dynamisch erstellen können.

Verwenden von CDynamicAccessor

CDynamicAccessor ermöglicht es Ihnen, auf eine Datenquelle zuzugreifen, wenn Ihnen das Datenbankschema (die zugrunde liegende Struktur) nicht bekannt ist. CDynamicAccessor-Methoden beziehen Spalteninformationen (z. B. Spaltennamen, Anzahl, Datentyp usw.). Sie verwenden diese Spalteninformationen, um einen Accessor zur Laufzeit dynamisch zu erstellen. Die Spalteninformation wird in einem Puffer gespeichert, der von dieser Klasse erstellt und verwaltet wird. Ermitteln Sie Daten aus dem Puffer mithilfe der GetValue-Methode.

Beispiel

Code

// 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, jedoch mit einer wichtigen Ausnahme. Während CDynamicAccessor Daten im vom Anbieter erfassten systemeigenen Format anfordert, fordert CDynamicStringAccessor, dass der Anbieter alle Daten, auf die über den Datenspeicher zugegriffen wird, als Zeichenfolgendaten abruft. Dies ist besonders hilfreich für einfache Aufgaben, die keine Berechnungen von Werten im Datenspeicher erfordern, z. B. das Anzeigen oder Drucken des Datenspeicherinhalts.

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

Beispiel

Code

// 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 entspricht im Wesentlichen CDynamicAccessor. Der einzige Unterschied besteht darin, dass CDynamicParameterAccessor festzulegende Parameterinformationen durch Aufrufen der ICommandWithParameters-Schnittstelle bezieht. Der Anbieter muss ICommandWithParameters für den Consumer unterstützen, damit diese Klasse verwendet werden kann.

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

Ein Beispiel zur Demonstration der Verwendung dieser Klassen zum Ausführen einer gespeicherten SQL Server-Prozedur sowie zum Abrufen der Ausgabeparameterwerte finden Sie im Knowledge Base-Artikel Q058860, "HOWTO: Execute Stored Procedure using CDynamicParameterAccessor" (nur auf Englisch verfügbar). Knowledge Base-Artikel sind in der MSDN Library Visual Studio-Dokumentation oder unter https://support.microsoft.com/?in=de verfügbar.

Siehe auch

Aufgaben

DynamicConsumer-Beispiel: Verwendet von dynamischen Accessors und Schema Rowset-Klassen zum Lesen von Metadaten aus einer Datenbank

Referenz

CDynamicAccessor Class

CDynamicStringAccessor Class

CDynamicParameterAccessor Class

Konzepte

Verwenden von Accessoren