فئات المستهلك التى تم انشاءها بواسطة المعالج
إذا استخدمت معالج مستهلك ATL OLE DB لإنشاء مستهلك ، لديك خيار استخدام قوالب OLE DB أو سمات OLE DB. في كلتا الحالتين،المعالج ينشئ فئة أمر و فئة سجل المستخدم. فئة الأمر تحتوي على تعليمات برمجية لفتح مصدر البيانات و مجموعة الصفوف التي حددتها في المعالج. فئة سجل المستخدم تحتوي على مخطط عمود لجدول قاعدة البيانات الذي حددته. ومع ذلك، تختلف التعليمات البرمجية المنشأة في كل حالة:
إذا قمت بتحديد مستهلك من القوالب، ينشئ المعالج فئة أمر و فئة سجل المستخدم. فئة الأمر سيكون لها الاسم الذي تدخله في مربع الفئة في المعالج (على سبيل المثال، CProducts) ، وسيكون لفئة سجل المستخدم اسم فى شكل " اسم_الفئة Accessor" (على سبيل المثال، CProductsAccessor). يتم وضع كلا الفئتين في ملف الرأس الخاص بالمستهلك.
إذا قمت بتحديد مستهلك ذى سمات، سيكون لفئة سجل المستخدم اسم فى شكل اسم_الفئة Accessor" و سيتم إدخاله. أي، ستكون قادراً على رؤية فئة الأمر فقط في محرر نص ; يمكنك فقط رؤية فئة سجل المستخدم كتعليمات برمجية مُدخَلَة. للحصول على معلومات حول عرض التعليمات البرمجية المدخلة، راجع تصحيح التعليمات البرمجية المدخلة .
تستخدم الأمثلة التالية فئة أمر تم إنشاؤه على جدول المنتجات (Products) الخاص بقاعدة بيانات Northwind لعرض التعليمات البرمجية الخاصة بالمستخدم التى تم إنشاؤها من قبل المعالج لفئة الأمر و فئة سجل المستخدم.
فئات سجل المستخدم التى فى القوالب
إذا قمت بإنشاء مستهلك OLE DB باستخدام قوالب OLE DB (بدلاً من سمات OLE DB) ، المعالج ينشئ تعليمات برمجية كما هو موضح في هذا المقطع.
أعضاء بيانات العمود
يتضمن الجزء الأول من فئة سجل المستخدم التصريحات بأعضاء بيانات الحالة والطول لكل عمود مرتبط البيانات. للحصول على معلومات عن أعضاء البيانات هذه، راجع "أعضاء بيانات حالة الحقل" في الموصلات المنشأة من قبل المعالج .
ملاحظة
إذا قمت بتعديل فئة سجل المستخدم أو كتابة المستهلك الخاص بك ، يجب أن تسبق متغيرات البيانات الحالةَ و الطولَ.
ملاحظة
يستخدم معالج المستهلك ATL OLE DB النوع DB_NUMERIC لربط أنواع البيانات الرقمية. استخدم سابقاً DBTYPE_VARNUMERIC (تم وصف تنسيقه بواسطة النوع DB_VARNUMERIC ؛ راجع Oledb.h). في حالة استخدام المعالج لإنشاء مستخدمين, ينصح باستخدام 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;
خصائص مجموعة الصفوف
بعد ذلك, يحدد المعالج خصائص مجموعة الصفوف إذا حددت تغيير (Change)، أو إدراج (Insert) أو حذف (Delete) في معالج مستهلك ATL OLE DB يتم تعيين الخصائص الملائمة هنا (يتم دوماً تعيين DBPROP_IRowsetChange, ثم واحد أو أكثر من DBPROPVAL_UP_CHANGE DBPROPVAL_UP_INSERT و/أو 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);
}
فئة الأمر أو الجدول
إذا حددت فئة أمر, يقوم المعالج بالتصريح بفئة الأمر؛للتعليمات البرمجية التى فى القوالب، يبدو الأمر هكذا :
DEFINE_COMMAND_EX(CProductsAccessor, L" \
SELECT \
ProductID, \
ProductName, \
SupplierID, \
CategoryID, \
QuantityPerUnit, \
UnitPrice, \
UnitsInStock, \
UnitsOnOrder, \
ReorderLevel, \
Discontinued \
FROM dbo.Products")
مخطط عمود
ثم يقوم المعالج بإنشاء ارتباطات العمود أو مخطط العمود. لإصلاح المشكلات المتعددة مع بعض الموفرين، التعليمات البرمجية التالية قد تربط الأعمدة بترتيب مختلف عن الذي تم الإعلان عنه من قبل الموفر.
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()
};
التصريح بالفئة
وأخيراً، يقوم المعالج بإنشاء تصريح بفئة الأمر كالتالي:
class CProducts : public CCommand<CAccessor<CProductsAccessor> >
فئات سجل المستخدم مدخلة السمة
إذا قمت بإنشاء مستهلكين OLE DB باستخدام سمات قاعدة البيانات (db_commandأو db_table )، تقوم السمات بإدخال فئة سجل مستخدم مع اسم فى شكل "_اسم_الفئةAccessor". على سبيل المثال، إذا قمت بتسمية فئة الأمر الخاص بك COrders ، فئة سجل المستخدم ستكون _COrdersAccessor. على الرغم من أن فئة سجل المستخدم تظهر في عرض الفئة، النقر المزدوج فوقها ينقل إلى فئة الأمر أو الجدول في ملف الرأس بدلاً من ذلك. في هذه الحالات، يمكنك فقط عرض التصريح الفعلي بفئة سجل المستخدم عن طريق عرض التعليمات البرمجية مدخلة السمة.
يمكن أن يكون هناك تعقيدات محتملة إذا قمت باضافة أو تجاوز الأساليب في العملاء ذوى السمات. على سبيل المثال، يمكنك إضافة المنشئ _COrdersAccessor إلى التصريح بـ COrders ولكن لاحظ أن ذلك يؤدي في الحقيقة إلى إضافة منشئ إلى فئة COrdersAccessor المدخلة. مثل هذا المنشئ يمكنه تهيئة الأعمدة/المعلمات ولكن لا يمكنك إنشاء منشئ للنسخ بهذه الطريقة لأنه يتعذر إنشاء مثيل من الكائن COrdersAccessorمباشرة . إذا كنت تحتاج إلى منشئ (أو أسلوب آخر) مباشرة على الفئة COrders ، فينصح بتعريف فئة جديدة مشتقة من COrders و إضافة الأساليب الضرورية هناك.
في المثال التالي، يقوم المعالج بإنشاء تصريح بالفئة COrders ، ولكن فئة سجل المستخدم COrdersAccessor لا تظهر لأن السمات تقوم بإدخالها.
#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];
};
التصريح بفئة الأمر المُدخَل يبدو مثل هذا:
class CProducts : public CCommand<CAccessor<_CProductsAccessor> >
معظم التعليمات البرمجية المدخلة التي تم إدراجها هى نفسها أو مشابهة للإصدار الذى فى القوالب. توجد اختلافات أساسية في الأساليب المدخلة الموصوفة في أساليب المستخدم المنشأة من قبل المعالج .
للحصول على معلومات حول عرض التعليمات البرمجية المدخلة، راجع تصحيح التعليمات البرمجية المدخلة .