Bagikan melalui


Menyederhanakan Akses Data dengan Atribut Database

Topik ini menunjukkan penggunaan atribut database untuk menyederhanakan operasi database.

Cara dasar untuk mengakses informasi dari database adalah dengan membuat kelas perintah (atau tabel) dan kelas rekaman pengguna untuk tabel tertentu dalam database. Atribut database menyederhanakan beberapa deklarasi templat yang sebelumnya harus Anda lakukan.

Untuk menunjukkan penggunaan atribut database, bagian berikut menunjukkan dua deklarasi kelas rekaman pengguna dan tabel yang setara: yang pertama menggunakan atribut dan yang kedua menggunakan Templat OLE DB. Kode deklarasi tersebut biasanya ditempatkan dalam file header bernama untuk tabel atau objek perintah, misalnya, Authors.h.

Dengan membandingkan dua file, Anda dapat melihat seberapa sederhana menggunakan atribut. Di antara perbedaannya adalah:

  • Menggunakan atribut, Anda hanya perlu mendeklarasikan satu kelas: CAuthors, sementara dengan templat Anda harus mendeklarasikan dua: CAuthorsNoAttrAccessor dan CAuthorsNoAttr.

  • Panggilan db_source dalam versi yang diatribusikan setara dengan OpenDataSource() panggilan dalam deklarasi templat.

  • Panggilan db_table dalam versi yang diatribusikan setara dengan deklarasi templat berikut:

    class CAuthorsNoAttr : public CTable<CAccessor<CAuthorsNoAttrAccessor>>
    
  • db_column Panggilan dalam versi yang diatribusikan setara dengan peta kolom (lihat BEGIN_COLUMN_MAP ... END_COLUMN_MAP) dalam deklarasi templat.

Atribut menyuntikkan deklarasi kelas rekaman pengguna untuk Anda. Kelas rekaman pengguna sama dengan CAuthorsNoAttrAccessor dalam deklarasi templat. Jika kelas tabel Anda adalah CAuthors, kelas rekaman pengguna yang disuntikkan diberi nama CAuthorsAccessor, dan Anda hanya dapat melihat deklarasinya dalam kode yang disuntikkan. Untuk informasi selengkapnya, lihat "Kelas Rekaman Pengguna yang Disuntikkan Atribut" di Rekaman Pengguna.

Dalam kode atribut dan templat, Anda harus mengatur properti set baris menggunakan CDBPropSet::AddProperty.

Untuk informasi tentang atribut yang dibahas dalam topik ini, lihat Atribut Konsumen OLE DB.

Catatan

Pernyataan berikut include diperlukan untuk mengkompilasi contoh di bawah ini:

#include <atlbase.h>
#include <atlplus.h>
#include <atldbcli.h>

Deklarasi Tabel dan Aksesor Menggunakan Atribut

Kode berikut memanggil db_source dan db_table pada kelas tabel. db_source menentukan sumber data dan koneksi yang akan digunakan. db_table menyuntikkan kode templat yang sesuai untuk mendeklarasikan kelas tabel. db_column tentukan peta kolom dan masukkan deklarasi aksesor. Anda dapat menggunakan atribut konsumen OLE DB dalam proyek apa pun yang mendukung ATL.

Berikut adalah deklarasi tabel dan aksesor menggunakan atribut:

//////////////////////////////////////////////////////////////////////
// Table and accessor declaration using attributes
// authors.h
//////////////////////////////////////////////////////////////////////

// Table class declaration
// (Note that you must provide your own connection string for db_source.)
[
   db_source(L"your connection string"),
   db_table("Authors")
]
class CAuthors
{
public:
   DBSTATUS m_dwAuIDStatus;
   DBSTATUS m_dwAuthorStatus;
   DBSTATUS m_dwYearBornStatus;
   DBLENGTH m_dwAuIDLength;
   DBLENGTH m_dwAuthorLength;
   DBLENGTH m_dwYearBornLength;
   [db_column("1", status = "m_dwAuIDStatus", length = "m_dwAuIDLength")] LONG m_AuID;
   [db_column("2", status = "m_dwAuthorStatus", length = "m_dwAuthorLength")] TCHAR m_Author[51];
   [db_column("3", status = "m_dwYearBornStatus", length = "m_dwYearBornLength")] SHORT m_YearBorn;
   void GetRowsetProperties(CDBPropSet* pPropSet)
   {
      pPropSet->AddProperty(DBPROP_CANFETCHBACKWARDS, true);
      pPropSet->AddProperty(DBPROP_CANSCROLLBACKWARDS, true);
      pPropSet->AddProperty(DBPROP_IRowsetChange, true);
   }
};

Deklarasi Tabel dan Aksesor Menggunakan Templat

Berikut adalah tabel dan deklarasi aksesor menggunakan templat.

//////////////////////////////////////////////////////////////////////
// Table and user record class declaration using templates
// authors.h
//////////////////////////////////////////////////////////////////////

// User record class declaration
class CAuthorsNoAttrAccessor
{
public:
   DWORD m_dwAuIDStatus;
   DWORD m_dwAuthorStatus;
   DWORD m_dwYearBornStatus;
   DWORD m_dwAuIDLength;
   DWORD m_dwAuthorLength;
   DWORD m_dwYearBornLength;
   LONG m_AuID;
   TCHAR m_Author[51];
   SHORT m_YearBorn;
   void GetRowsetProperties(CDBPropSet* pPropSet)
   {
      pPropSet->AddProperty(DBPROP_CANFETCHBACKWARDS, true);
      pPropSet->AddProperty(DBPROP_CANSCROLLBACKWARDS, true);
      pPropSet->AddProperty(DBPROP_IRowsetChange, true);
   }
   HRESULT OpenDataSource()
   {
      CDataSource _db;

HRESULT hr;
      hr = _db.OpenFromInitializationString(L"your connection string");
      if (FAILED(hr))
      {
#ifdef _DEBUG
         AtlTraceErrorRecords(hr);
#endif
         return hr;
      }
      return m_session.Open(_db);
   }
   void CloseDataSource()
   {
      m_session.Close();
   }
   operator const CSession&()
   {
      return m_session;
   }
   CSession m_session;
   BEGIN_COLUMN_MAP(CAuthorsNoAttrAccessor)
      COLUMN_ENTRY_LENGTH_STATUS(1, m_AuID, m_dwAuIDLength, m_dwAuIDStatus)
      COLUMN_ENTRY_LENGTH_STATUS(2, m_Author, m_dwAuthorLength, m_dwAuthorStatus)
      COLUMN_ENTRY_LENGTH_STATUS(3, m_YearBorn, m_dwYearBornLength, m_dwYearBornStatus)
   END_COLUMN_MAP()
};
class CAuthorsNoAttr : public CTable<CAccessor<CAuthorsNoAttrAccessor>>
{
public:
   HRESULT OpenAll()
   {
HRESULT hr;
      hr = OpenDataSource();
      if (FAILED(hr))
         return hr;
      __if_exists(GetRowsetProperties)
      {
         CDBPropSet propset(DBPROPSET_ROWSET);
         __if_exists(HasBookmark)
         {
            propset.AddProperty(DBPROP_IRowsetLocate, true);
         }
         GetRowsetProperties(&propset);
         return OpenRowset(&propset);
      }
      __if_not_exists(GetRowsetProperties)
      {
         __if_exists(HasBookmark)
         {
            CDBPropSet propset(DBPROPSET_ROWSET);
            propset.AddProperty(DBPROP_IRowsetLocate, true);
            return OpenRowset(&propset);
         }
      }
      return OpenRowset();
   }
   HRESULT OpenRowset(DBPROPSET *pPropSet = NULL)
   {
HRESULT hr = Open(m_session, "Authors", pPropSet);
#ifdef _DEBUG
      if(FAILED(hr))
         AtlTraceErrorRecords(hr);
#endif
      return hr;
   }
   void CloseAll()
   {
      Close();
      CloseDataSource();
   }
};

Lihat juga

Atribut Konsumen OLE DB