Aracılığıyla paylaş


Dinamik Erişimcileri Kullanma

Dinamik erişimciler, veritabanı şeması (temel alınan yapı) hakkında bilginiz olmadığında bir veri kaynağına erişmenizi sağlar. OLE DB Şablonları kitaplığı size yardımcı olacak çeşitli sınıflar sağlar.

DynamicConsumer örneği, sütun bilgilerini almak ve erişimcileri dinamik olarak 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 bilginiz olmadığında bir veri kaynağına erişmenizi sağlar. CDynamicAccessor yöntemleri sütun adları, sayı ve veri türü gibi sütun bilgilerini alır. Çalışma zamanında dinamik olarak bir erişimci oluşturmak için bu sütun bilgilerini kullanırsınız. Sütun bilgileri, bu sınıf tarafından oluşturulan ve yönetilen bir arabellekte depolanır. GetValue yöntemini kullanarak arabellekten veri alın.

Örnek: CDynamic accessors

// 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 yöntem dışında CDynamicAccessor gibi çalışır. Sağlayıcı tarafından bildirilen yerel biçimde veri isteğinde bulunurken CDynamicAccessor , CDynamicStringAccessor sağlayıcının veri deposundan erişilen tüm verileri dize verileri olarak getirmesini istemektedir. bu işlem özellikle veri deposunun içeriğini görüntüleme veya yazdırma gibi veri deposundaki değerlerin hesaplanması gerektirmeyen basit görevler için kullanışlıdır.

Sütun bilgilerini almak için yöntemleri kullanın CDynamicStringAccessor . Çalışma zamanında dinamik olarak bir erişimci oluşturmak için bu sütun bilgilerini kullanırsınız. Sütun bilgileri, bu sınıf tarafından oluşturulan ve yönetilen bir arabellekte depolanır. CDynamicStringAccessor::GetString kullanarak arabellekten veri alın veya CDynamicStringAccessor ::SetString kullanarak arabelleğe depolayın.

Örnek: 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;
}

CDynamicParameterAccessor Kullanma

CDynamicParameterAccessor, CDynamicAccessor'a benzer, ancak buCDynamicParameterAccessor, ICommandWithParameters arabirimi çağrılarak ayarlanacak parametre bilgilerini alır. Sağlayıcının tüketicinin bu sınıfı kullanmasını desteklemesi ICommandWithParameters gerekir.

Parametre bilgileri, bu sınıf tarafından oluşturulan ve yönetilen bir arabellekte depolanır. CDynamicParameterAccessor::GetParam ve CDynamicParameterAccessor::GetParamType kullanarak arabellekten parametre verilerini alın.

Sql Server saklı yordamını yürütmek ve çıkış parametresi değerlerini almak için bu sınıfın nasıl kullanılacağını gösteren bir örnek için GitHub'daki Microsoft VCSamples deposundaki DynamicConsumer örnek koduna bakın.

Ayrıca bkz.

Erişimcileri Kullanma
CDynamicAccessor Sınıfı
CDynamicStringAccessor Sınıfı
CDynamicParameterAccessor Sınıfı
DynamicConsumer Örneği