Bagikan melalui


Menggunakan Aksesor Dinamis

Aksesor dinamis memungkinkan Anda mengakses sumber data ketika Anda tidak memiliki pengetahuan tentang skema database (struktur yang mendasar). Pustaka Templat OLE DB menyediakan beberapa kelas untuk membantu Anda.

Sampel DynamicConsumer menunjukkan cara menggunakan kelas pengakses dinamis untuk mendapatkan informasi kolom dan membuat aksesor secara dinamis.

Menggunakan CDynamicAccessor

CDynamicAccessor memungkinkan Anda mengakses sumber data ketika Anda tidak memiliki pengetahuan tentang skema database (struktur dasar database). CDynamicAccessor metode mendapatkan informasi kolom seperti nama kolom, jumlah, dan jenis data. Anda menggunakan informasi kolom ini untuk membuat aksesor secara dinamis pada waktu proses. Informasi kolom disimpan dalam buffer yang dibuat dan dikelola oleh kelas ini. Dapatkan data dari buffer menggunakan metode GetValue .

Contoh: Aksesor 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;
}

Menggunakan CDynamicStringAccessor

CDynamicStringAccessor berfungsi seperti CDynamicAccessor, kecuali dengan satu cara penting. Saat CDynamicAccessor meminta data dalam format asli yang dilaporkan oleh penyedia, CDynamicStringAccessor permintaan agar penyedia mengambil semua data yang diakses dari penyimpanan data sebagai data string. Proses ini sangat berguna untuk tugas sederhana yang tidak memerlukan perhitungan nilai di penyimpanan data, seperti menampilkan atau mencetak konten penyimpanan data.

Gunakan CDynamicStringAccessor metode untuk mendapatkan informasi kolom. Anda menggunakan informasi kolom ini untuk membuat aksesor secara dinamis pada waktu proses. Informasi kolom disimpan dalam buffer yang dibuat dan dikelola oleh kelas ini. Dapatkan data dari buffer menggunakan CDynamicStringAccessor::GetString atau simpan ke buffer menggunakan CDynamicStringAccessor::SetString.

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

Menggunakan CDynamicParameterAccessor

CDynamicParameterAccessor mirip dengan CDynamicAccessor, kecuali yang CDynamicParameterAccessor mendapatkan informasi parameter yang akan diatur dengan memanggil antarmuka ICommandWithParameters . Penyedia harus mendukung ICommandWithParameters konsumen untuk menggunakan kelas ini.

Informasi parameter disimpan dalam buffer yang dibuat dan dikelola oleh kelas ini. Dapatkan data parameter dari buffer dengan menggunakan CDynamicParameterAccessor::GetParam dan CDynamicParameterAccessor::GetParamType.

Untuk contoh yang menunjukkan cara menggunakan kelas ini untuk menjalankan prosedur tersimpan SQL Server dan mendapatkan nilai parameter output, lihat kode sampel DynamicConsumer di repositori Microsoft VCSamples di GitHub.

Lihat juga

Menggunakan Accessors
Kelas CDynamicAccessor
Kelas CDynamicStringAccessor
Kelas CDynamicParameterAccessor
Sampel DynamicConsumer