Utilizzo delle funzioni di accesso dinamiche

Le funzioni di accesso dinamiche consentono di accedere a un'origine dati quando non si ha alcuna conoscenza dello schema del database (struttura sottostante). La libreria dei modelli OLE DB offre diverse classi utili.

L'esempio DynamicConsumer illustra come usare le classi di funzioni di accesso dinamiche per ottenere informazioni sulle colonne e creare funzioni di accesso in modo dinamico.

Uso di CDynamicAccessor

CDynamicAccessor consente di accedere a un'origine dati quando non si ha alcuna conoscenza dello schema del database (la struttura sottostante del database). CDynamicAccessor i metodi ottengono informazioni sulla colonna, ad esempio nomi di colonna, conteggio e tipo di dati. Queste informazioni sulla colonna vengono usate per creare una funzione di accesso in modo dinamico in fase di esecuzione. Le informazioni sulla colonna vengono archiviate in un buffer creato e gestito da questa classe. Ottenere dati dal buffer usando il metodo GetValue .

Esempio: Funzioni di accesso 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;
}

Uso di CDynamicStringAccessor

CDynamicStringAccessor funziona come CDynamicAccessor, tranne in un modo importante. Mentre CDynamicAccessor richiede dati nel formato nativo segnalato dal provider, CDynamicStringAccessor richiede che il provider recuperi tutti i dati a cui si accede dall'archivio dati come dati stringa. Il processo è particolarmente utile per attività semplici che non richiedono il calcolo dei valori nell'archivio dati, ad esempio la visualizzazione o la stampa del contenuto dell'archivio dati.

Usare CDynamicStringAccessor i metodi per ottenere informazioni sulle colonne. Queste informazioni sulla colonna vengono usate per creare una funzione di accesso in modo dinamico in fase di esecuzione. Le informazioni sulla colonna vengono archiviate in un buffer creato e gestito da questa classe. Ottenere dati dal buffer usando CDynamicStringAccessor::GetString o archiviarlo nel buffer usando CDynamicStringAccessor::SetString.

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

Uso di CDynamicParameterAccessor

CDynamicParameterAccessor è simile a CDynamicAccessor, ad eccezione del fatto che CDynamicParameterAccessor ottiene le informazioni sui parametri da impostare chiamando l'interfaccia ICommandWithParameters . Il provider deve supportare ICommandWithParameters in modo che il consumer usi questa classe.

Le informazioni di parametro vengono archiviate in un buffer creato e gestito da questa classe. Ottenere i dati dei parametri dal buffer usando CDynamicParameterAccessor::GetParam e CDynamicParameterAccessor::GetParamType.

Per un esempio che illustra come usare questa classe per eseguire una stored procedure di SQL Server e ottenere i valori dei parametri di output, vedere il codice di esempio DynamicConsumer nel repository Microsoft VCSamples in GitHub.

Vedi anche

Uso delle funzioni di accesso
Classe CDynamicAccessor
Classe CDynamicStringAccessor
Classe CDynamicParameterAccessor
Esempio DynamicConsumer