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
danCAuthorsNoAttr
.Panggilan
db_source
dalam versi yang diatribusikan setara denganOpenDataSource()
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 (lihatBEGIN_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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk