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