تبسيط الوصول لبيانات بـسمات قاعدة بيانات
يوضح هذا الموضوع استخدام السمات لتبسيط عمليات قاعدة بيانات.
الطريقة الأساسية ليتم الوصول إلى معلومات من قاعدة البيانات هي إنشاء فئة الأمر (أو جدول) و فئة سجلات مستخدم للحصول على جدول محدد في قاعدة البيانات. سمات قاعدة البيانات تبسط بعض تصريحات القالب التى كان عليك القيام بها مسبقاً .
لشرح استخدام سمات قاعدة البيانات، في المقاطع التالية يظهر جدولان متكافئان و التصريحات بفئات السجلات للمستخدم: يستخدم الأول سمات و يستخدم الثاني قوالب OLE DB. يتم وضع هذه التعليمات البرمجية للتصريح عادةً في ملف رأس مسمى للجدول أو كائن الأمر مثل Authors.h على سبيل المثال،.
عن طريق مقارنة الملفين ، يمكنك مشاهدة مقدار بساطة استخدام سمات. من بين الاختلافات:
باستخدام السمات ، لديك فقط فئة واحدة للتصريح بها: CAuthors ، في حين أن مع القوالب عليك تصريح اثنين: CAuthorsNoAttrAccessor وCAuthorsNoAttr
استدعاء db_source في الإصدار ذى السمات يكافئ استدعاء OpenDataSource() في التصريح بالقالب.
يكافئ استدعاء db_table في الإصدار ذى السمات التصريح بالقالب التالي:
class CAuthorsNoAttr : public CTable<CAccessor<CAuthorsNoAttrAccessor> >
استدعاءات db_column في الإصدار ذى السمات تكافئ مخطط العمود (راجع BEGIN_COLUMN_MAP ... END_COLUMN_MAP) في التصريح بالقالب.
السمات تُدخل تصريحاً بفئة سجلات المستخدم لك. تكافئ فئة سجلات المستخدم CAuthorsNoAttrAccessor في التصريح بالقالب. إذا كانت فئة الجدول الخاصة بك هي CAuthors ، تسمى فئة سجل المستخدم المدخلة CAuthorsAccessor ، كما يمكنك فقط عرض التصريح الخاص بها في التعليمات البرمجية المدخلة. للحصول على المزيد من المعلومات، راجع "فئات سجلات المستخدم مُدخلة السمات" في سجلات المستخدم.
لاحظ أنه في كل من التعليمات البرمجية ذات السمات و الموفرة فى القوالب ، يجب عليك تعيين خصائص مجموعة الصفوف باستخدام CDBPropSet::AddProperty.
للحصول على معلومات حول سمات تمت مناقشتها في هذا الموضوع راجع سمات مستهلك OLE DB.
التصريح بالجدول و الموصلات باستخدام السمات
The following تعليمات برمجية calls db_source و db_table تشغيل the جدول فئة. db_source specifies the بيانات المصدر و اتصال إلى be used. db_table injects the appropriate قالب تعليمات برمجية إلى declare a جدول فئة. db_column specify the عمود مخطط و inject the accessor إعلان. يمكنك استخدام السمات الخاصة بعملاء OLE DB في أي مشروع يدعم ATL.
فيما يلي التصريح بجدول و موصل باستخدام السمات:
//////////////////////////////////////////////////////////////////////
// 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:
DWORD m_dwAuIDStatus;
DWORD m_dwAuthorStatus;
DWORD m_dwYearBornStatus;
DWORD m_dwAuIDLength;
DWORD m_dwAuthorLength;
DWORD 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);
}
};
التصريح بجدول و موصل باستخدام القوالب
فيما يلي التصريح بجدول و موصل باستخدام القوالب:
//////////////////////////////////////////////////////////////////////
// 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();
}
};