Aracılığıyla paylaş


Dinamik Erişimcileri Kullanma

Dinamik erişimciler veritabanı şeması hakkında bir bilgi sahibi olmadığınızda veri kaynağına erişmenize olanak sağlar (altta yatan yapı). OLE DB Şablon kitaplığı bunu yapmanıza yardımcı olacak birçok sınıf sağlar.

DynamicConsumer örneği sütun bilgisi edinmek ve dinamik olarak erişimciler oluşturmak için dinamik erişimci sınıflarının nasıl kullanılacağını gösterir.

CDynamicAccessor Kullanma

CDynamicAccessor veritabanı şeması (veritabanının temel yapısı) hakkında bir bilgi sahibi olmadığınızda veri kaynağına erişmenize olanak sağlar. CDynamicAccessoryöntemleri; sütun adları, sayım ve veri türü gibi sütun bilgilerini edinir. Çalışma zamanında dinamik olarak bir erişimci oluşturmak için bu sütun bilgilerini kullanın. Sütun bilgisi bu sınıf tarafından oluşturulan ve yönetilen bir arabellekte saklanır. GetValue yöntemini kullanarak ara bellekten veri elde edin.

Örnek

Kod

// 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 Kullanma

CDynamicStringAccessor önemli bir yol haricinde CDynamicAccessor gibi çalışır. CDynamicAccessor veriyi sağlayıcı tarafından bildirilen özgün biçimde isterken, CDynamicStringAccessor sağlayıcının veri deposundan erişilen tüm veriyi dize veri olarak almasını ister. Bu, veri deposu içeriğinin görüntülenmesi veya yazdırılması gibi veri deposundaki değerlerin hesaplamasını gerektirmeyen basit görevler için özellikle kullanışlıdır.

Sütun bilgisi edinmek için CDynamicStringAccessor kullanın. Çalışma zamanında dinamik olarak bir erişimci oluşturmak için bu sütun bilgilerini kullanın. Sütun bilgisi bu sınıf tarafından oluşturulan ve yönetilen bir arabellekte saklanır. CDynamicStringAccessor::GetString kullanarak ara bellekten veri elde edin veya CDynamicStringAccessor::SetString kullanarak ara belleğe veri depolayın.

Örnek

Kod

// 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 Kullanma

CDynamicParameterAccessor başvurusunun ICommandWithParameters arabirimini çağırarak ayarlanacak olan parametre bilgilerini alması dışında, CDynamicParameterAccessor, CDynamicAccessor'a benzer. Sağlayıcı bu sınıfı kullanan tüketicinin yararına ICommandWithParameters öğesini desteklemelidir.

Parametre bilgileri bu sınıf tarafından oluşturulan ve yönetilen bir arabellekte saklanır. CDynamicParameterAccessor::GetParam ve CDynamicParameterAccessor::GetParamType kullanarak ara bellekten parametre elde edin.

Bir sınıfın bir SQL Sunucusu depolanmış yordamı yürütmek ve çıkış parametresi değerlerini almak için nasıl kullanılacağını gösteren bir örnek için, Bilgi Bankası makale Q058860 "HOWTO:CDynamicParameterAccessor kullanarak Depolanmış Yordamı Yürütme." Bilgi Tabanı makalelerini MSDN Kitaplığı Visual Studio belgelerinde veya https://support.microsoft.com sitesinde bulabilirsiniz.

Ayrıca bkz.

Görevler

DynamicConsumer Sample: Uses Dynamic Accessor and Schema Rowset Classes to Read Metadata from a Database

Başvuru

CDynamicAccessor Class

CDynamicStringAccessor Class

CDynamicParameterAccessor Class

Kavramlar

Erişimcileri Kullanma