Bagikan melalui


Kelas yang Dihasilkan Wizard Konsumen

Wizard Konsumen ATL OLE DB tidak tersedia di Visual Studio 2019 dan yang lebih baru. Anda masih dapat menambahkan fungsionalitas secara manual.

Saat Anda menggunakan Wizard Konsumen ATL OLE DB untuk menghasilkan konsumen, Anda memiliki pilihan untuk menggunakan Templat OLE DB atau atribut OLE DB. Dalam kedua kasus, wizard menghasilkan kelas perintah dan kelas rekaman pengguna. Kelas perintah berisi kode untuk membuka sumber data dan himpunan baris yang Anda tentukan dalam wizard. Kelas rekaman pengguna berisi peta kolom untuk tabel database yang Anda pilih. Namun, kode yang dihasilkan berbeda dalam setiap kasus:

  • Jika Anda memilih konsumen yang di-template, wizard akan menghasilkan kelas perintah dan kelas rekaman pengguna. Kelas perintah akan memiliki nama yang Anda masukkan di kotak Kelas di wizard (misalnya, CProducts), dan kelas rekaman pengguna akan memiliki nama formulir "ClassNameAccessor" (misalnya, CProductsAccessor). Kedua kelas ditempatkan dalam file header konsumen.

  • Jika Anda memilih konsumen yang diatribusikan, kelas rekaman pengguna akan memiliki nama formulir "_ClassNameAccessor" dan akan disuntikkan. Artinya, Anda hanya dapat melihat kelas perintah di editor teks; Anda hanya dapat melihat kelas rekaman pengguna sebagai kode yang disuntikkan. Untuk informasi tentang melihat kode yang disuntikkan, lihat Debugging Kode yang Disuntikkan.

Contoh berikut menggunakan kelas perintah yang dibuat pada Products tabel Northwind database untuk menunjukkan kode konsumen yang dihasilkan wizard untuk kelas perintah dan kelas rekaman pengguna.

Kelas Rekaman Pengguna Templat

Jika Anda membuat konsumen OLE DB menggunakan Templat OLE DB (bukan atribut OLE DB), wizard menghasilkan kode seperti yang dijelaskan di bagian ini.

Anggota Data Kolom

Bagian pertama dari kelas rekaman pengguna mencakup deklarasi anggota data dan status dan anggota data panjang untuk setiap kolom yang terikat data. Untuk informasi tentang anggota data ini, lihat Anggota Data Status Bidang di Aksesor yang Dihasilkan Wizard.

Catatan

Jika Anda mengubah kelas rekaman pengguna atau menulis konsumen Anda sendiri, variabel data harus datang sebelum variabel status dan panjang.

Catatan

Wizard Konsumen ATL OLE DB menggunakan DB_NUMERIC jenis untuk mengikat jenis data numerik. Ini sebelumnya digunakan DBTYPE_VARNUMERIC (format yang dijelaskan oleh DB_VARNUMERIC jenis; lihat Oledb.h). Jika Anda tidak menggunakan wizard untuk membuat konsumen, disarankan agar Anda menggunakan DB_NUMERIC.

// Products.H : Declaration of the CProducts class

class CProductsAccessor
{
public:
   // Column data members:
   LONG m_ProductID;
   TCHAR m_ProductName[41];
   LONG m_SupplierID;
   LONG m_CategoryID;
   TCHAR m_QuantityPerUnit[21];
   CURRENCY m_UnitPrice;
   SHORT m_UnitsInStock;
   SHORT m_UnitsOnOrder;
   SHORT m_ReorderLevel;
   VARIANT_BOOL m_Discontinued;

   // Column status data members:
   DBSTATUS m_dwProductIDStatus;
   DBSTATUS m_dwProductNameStatus;
   DBSTATUS m_dwSupplierIDStatus;
   DBSTATUS m_dwCategoryIDStatus;
   DBSTATUS m_dwQuantityPerUnitStatus;
   DBSTATUS m_dwUnitPriceStatus;
   DBSTATUS m_dwUnitsInStockStatus;
   DBSTATUS m_dwUnitsOnOrderStatus;
   DBSTATUS m_dwReorderLevelStatus;
   DBSTATUS m_dwDiscontinuedStatus;

   // Column length data members:
   DBLENGTH m_dwProductIDLength;
   DBLENGTH m_dwProductNameLength;
   DBLENGTH m_dwSupplierIDLength;
   DBLENGTH m_dwCategoryIDLength;
   DBLENGTH m_dwQuantityPerUnitLength;
   DBLENGTH m_dwUnitPriceLength;
   DBLENGTH m_dwUnitsInStockLength;
   DBLENGTH m_dwUnitsOnOrderLength;
   DBLENGTH m_dwReorderLevelLength;
   DBLENGTH m_dwDiscontinuedLength;

Properti Himpunan Baris

Selanjutnya, wizard mengatur properti set baris. Jika Anda memilih Ubah, Sisipkan, atau Hapus di Wizard Konsumen ATL OLE DB, properti yang sesuai diatur di sini (DBPROP_IRowsetChange selalu diatur, maka masing-masing satu atau beberapa DBPROPVAL_UP_CHANGE, DBPROPVAL_UP_INSERT, dan/atau DBPROPVAL_UP_DELETE).

void GetRowsetProperties(CDBPropSet* pPropSet)
{
   pPropSet->AddProperty(DBPROP_CANFETCHBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
   pPropSet->AddProperty(DBPROP_CANSCROLLBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
   pPropSet->AddProperty(DBPROP_IRowsetChange, true, DBPROPOPTIONS_OPTIONAL);
   pPropSet->AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);
}

Kelas Perintah atau Tabel

Jika Anda menentukan kelas perintah, wizard mendeklarasikan kelas perintah; untuk kode templat, perintah terlihat seperti ini:

DEFINE_COMMAND_EX(CProductsAccessor, L" \
SELECT \
   ProductID, \
   ProductName, \
   SupplierID, \
   CategoryID, \
   QuantityPerUnit, \
   UnitPrice, \
   UnitsInStock, \
   UnitsOnOrder, \
   ReorderLevel, \
   Discontinued \
   FROM dbo.Products")

Peta Kolom

Wizard kemudian menghasilkan pengikatan kolom atau peta kolom. Untuk memperbaiki beberapa masalah dengan beberapa penyedia, kode berikut mungkin mengikat kolom dalam urutan yang berbeda dari yang dilaporkan oleh penyedia.

   BEGIN_COLUMN_MAP(CProductsAccessor)
      COLUMN_ENTRY_LENGTH_STATUS(1, m_ProductID, m_dwProductIDLength, m_dwProductIDStatus)
      COLUMN_ENTRY_LENGTH_STATUS(2, m_ProductName, m_dwProductNameLength, m_dwProductNameStatus)
      COLUMN_ENTRY_LENGTH_STATUS(3, m_SupplierID, m_dwSupplierIDLength, m_dwSupplierIDStatus)
      COLUMN_ENTRY_LENGTH_STATUS(4, m_CategoryID, m_dwCategoryIDLength, m_dwCategoryIDStatus)
      COLUMN_ENTRY_LENGTH_STATUS(5, m_QuantityPerUnit, m_dwQuantityPerUnitLength, m_dwQuantityPerUnitStatus)
      _COLUMN_ENTRY_CODE(6, DBTYPE_CY, _SIZE_TYPE(m_UnitPrice), 0, 0, offsetbuf(m_UnitPrice), offsetbuf(m_dwUnitPriceLength), offsetbuf(m_dwUnitPriceStatus))
      COLUMN_ENTRY_LENGTH_STATUS(7, m_UnitsInStock, m_dwUnitsInStockLength, m_dwUnitsInStockStatus)
      COLUMN_ENTRY_LENGTH_STATUS(8, m_UnitsOnOrder, m_dwUnitsOnOrderLength, m_dwUnitsOnOrderStatus)
      COLUMN_ENTRY_LENGTH_STATUS(9, m_ReorderLevel, m_dwReorderLevelLength, m_dwReorderLevelStatus)
      _COLUMN_ENTRY_CODE(10, DBTYPE_BOOL, _SIZE_TYPE(m_Discontinued), 0, 0, offsetbuf(m_Discontinued), offsetbuf(m_dwDiscontinuedLength), offsetbuf(m_dwDiscontinuedStatus))
   END_COLUMN_MAP()
};

Deklarasi Kelas

Terakhir, wizard menghasilkan deklarasi kelas perintah seperti berikut ini:

class CProducts : public CCommand<CAccessor<CProductsAccessor>>

Kelas Rekaman Pengguna yang Disuntikkan Atribut

Jika Anda membuat konsumen OLE DB menggunakan atribut database (db_command atau db_table), atribut menyuntikkan kelas rekaman pengguna dengan nama formulir "_ClassNameAccessor." Misalnya, jika Anda menamai kelas COrdersperintah Anda, kelas rekaman pengguna akan menjadi _COrdersAccessor. Meskipun kelas rekaman pengguna muncul di Tampilan Kelas, mengklik dua kali kelas tersebut menavigasi ke perintah atau kelas tabel dalam file header sebagai gantinya. Dalam kasus ini, Anda hanya dapat melihat deklarasi aktual kelas rekaman pengguna dengan melihat kode yang disuntikkan atribut.

Mungkin ada potensi komplikasi jika Anda menambahkan atau mengambil alih metode di konsumen yang diatribusikan. Misalnya, Anda dapat menambahkan _COrdersAccessor konstruktor ke COrders deklarasi, tetapi perhatikan bahwa pada kenyataannya ini menambahkan konstruktor ke kelas yang disuntikkan COrdersAccessor . Konstruktor seperti itu dapat menginisialisasi kolom/parameter, tetapi Anda tidak dapat membuat konstruktor salinan dengan cara ini, karena tidak dapat langsung membuat COrdersAccessor instans objek. Jika Anda memerlukan konstruktor (atau metode lain) langsung di COrders kelas , disarankan agar Anda menentukan kelas baru yang berasal dari COrders dan menambahkan metode yang diperlukan di sana.

Dalam contoh berikut, wizard menghasilkan deklarasi untuk kelas COrders, tetapi kelas COrdersAccessor rekaman pengguna tidak muncul, karena atribut menyuntikkannya.

#define _ATL_ATTRIBUTES
#include <atlbase.h>
#include <atldbcli.h>
[
   db_source(L"your connection string"),
   db_command(L"Select ShipName from Orders;")
]
class COrders
{
public:

   // COrders()            // incorrect constructor name
   _COrdersAccessor()      // correct constructor name
   {
   }
      [db_column(1) ] TCHAR m_ShipName[41];
   };

Deklarasi kelas perintah yang disuntikkan terlihat seperti ini:

class CProducts : public CCommand<CAccessor<_CProductsAccessor>>

Sebagian besar kode yang disuntikkan sama dengan atau mirip dengan versi templat. Perbedaan utamanya adalah dalam metode yang disuntikkan, yang dijelaskan dalam Metode yang Dihasilkan Wizard Konsumen.

Untuk informasi tentang melihat kode yang disuntikkan, lihat Debugging Kode yang Disuntikkan.

Lihat juga

Membuat Konsumen OLE DB Menggunakan Wizard