مجموعة السجلات جلب سجلات في تجمع (ODBC)

هذا الموضوع يُطبق على فئات MFC ODBC.

الفئة CRecordset توفر دعم إحضار صفوف كبير الحجم مما يعني أن سجلات متعددة يمكن استردادها مرة واحدة أثناء إحضار واحد بدلاً من استرداد سجل واحد في كل مرة من مصدر البيانات. يمكنك تنفيذ إحضار صفوف كبير الحجم فقط في فئة CRecordset مشتقة. عملية نقل البيانات من مصدر البيانات إلى كائن مجموعة السجلات يسمي تبادل حقل سجلات مجمع (RFX مجمع). لاحظ أنه إذا لم تكن تستخدم إحضار صفوف كبيرة الحجم في الفئة المشتقة من CRecordset، البيانات يتم نقلها بواسطة تبادل حقل السجل (RFX). للحصول على المزيد من المعلومات حول RFX ، راجع تبادل حقل السجل (RFX).

هذا الموضوع يوضح :

  • كيف يدعم CRecordset إحضار صفوف كبيرة الحجم.

  • بعض الاعتبارات الخاصة عند استخدام إحضار الصفوف كبيرة الحجم .

  • كيفية تنفيذ تبادل حقل السجلات المجمع.

كيف يدعم CRecordset الإحضار كبير الحجم .

قبل فتح كائن مجموعة السجلات ، يمكنك تعريف حجم مجموعة صفوف بدالة العضو SetRowsetSize . حجم مجموعة الصفوف يحدد عدد السجلات التي يجب استردادها أثناء إحضار مفرد. بعد تنفيذ إحضار صف كبير، الحجم مجموعة الصفوف الافتراضي هو 25. إذا كانت مجمعة في إحضار صف هو غير مطبقة، الحجم مجموعة الصفوف يظل ثابتاً عند 1.

بعد تهيئة حجم مجموعة الصفوف ، قم باستدعاء دالة العضو Open . هنا يجب عليك تحديد خيار CRecordset::useMultiRowFetch للمعلمة dwOptions لتنفيذ إحضار صفوف كبيرة الحجم. يمكنك أيضاً تعيين خيار CRecordset::userAllocMultiRowBuffers . تستخدم آلية تبادل حقل السجلات المجمع مصفوفات لتخزين صفوف البيانات المتعددة التي تم استردادها أثناء إحضار بيانات. يمكن تخصيص هذه المخازن المؤقتة تلقائياً بواسطة إطار العمل أو يمكنك تخصيصها يدوياً. تحديد الخيار CRecordset::userAllocMultiRowBuffers يعني أنك ستقوم بعمل التخصيص.

يسرد الجدول التالي دالات العضو التي يوفرها CRecordset لإحضار صفوف كبيرة الحجم.

دالة العضو

الوصف

CheckRowsetError

الدالة الظاهرية التي تعالج أية أخطاء تحدث أثناء الإحضار.

DoBulkFieldExchange

تطبق تبادل حقل السجلات المجمع تستدعي تلقائياً لنقل صفوف بيانات متعددة من مصدر البيانات إلى كائن مجموعة السجلات.

GetRowsetSize

يسترد الإعداد الحالي لحجم مجموعة الصفوف.

GetRowsFetched

يخبر عن عدد الصفوف التي تم استردادها فعلياً بعد إحضار مُعطَى. في معظم الحالات، يكون هذا هو حجم مجموعة الصفوف إلا إذا تم جلب مجموعة صفوف غير كاملة.

GetRowStatus

يرجع حالة الإحضار لصف محدد داخل مجموعة صفوف.

RefreshRowset

تحدث البيانات و الحالة لصف محدد داخل مجموعة صفوف.

SetRowsetCursorPosition

تنقل المؤشر لصف محدد داخل مجموعة صفوف.

SetRowsetSize

دالة ظاهرية تغير إعداد حجم مجموعة الصفوف إلى القيمة المحددة.

اعتبارات خاصة

على الرغم من أن الإحضار المجمع هو ربح في الأداء ، بعض ميزات تعمل بشكل مختلف. قبل أن تقرر تنفيذ إحضار صفوف كبيرة الحجم ، خذ فى الاعتبار ما يلي:

  • إطار العمل تلقائياً يستدعي دالة العضو DoBulkFieldExchange لنقل البيانات من مصدر البيانات إلى كائن مجموعة السجلات. ومع ذلك، البيانات لا يتم نقلها من مجموعة السجلات مرة أخرى إلى مصدر البيانات. استدعاء دوال العضو AddNew ، Edit أو Delete أو Update تنتج توكيد بالفشل. على الرغم من أن CRecordsetحالياً لا توفر آلية لتحديث صفوف كبيرة من البيانات ، يمكنك كتابة الدوال الخاصة بك بواسطة استخدام دالة API ODBCـ SQLSetPos. لمزيد من المعلومات حولSQLSetPos راجع مرجع مبرمجي SDK ODBC في وثائق MSDN.

  • دالات العضو IsDeleted ، IsFieldDirty ، IsFieldNull ، IsFieldNullable ، SetFieldDirty ، و SetFieldNull لا يمكن استخدامها على مجموعات السجلات التي تقوم بتنفيذ إحضار صفوف كبيرة الحجم. ومع ذلك، يمكنك استدعاء GetRowStatus بدلاً من IsDeleted ، و GetODBCFieldInfo بدلاً من IsFieldNullable.

  • عمليات التحريك (Move‎) تعيد تحديد موضع مجموعة السجلات الخاصة بك بواسطة مجموعة الصفوف. ل مثال، هب أن قمت بفتح مجموعة سجلات الذي يحتوي على 100 سجل بحجم مجموعة صفوف اﻷولى 10. فتح جلب صفوف من 1 إلى 10، مع الحالي سجل توضع في الصف 1. أ يتصل إلى MoveNextجلب مجموعة من التالي الصفوف، لا التالي صف. هذه مجموعة الصفوف يتكون من صفوف من 11 إلى 20، مع الحالي سجل توضع في الصف 11. لاحظ ذلك MoveNextو (1) تحريك متكافئة لا عند إحضار صف المجمعة هو تطبيق. Move (1 تحضر مجموعة الصفوف التي تبدأ بصف 1 من السجل الحالي. في هذا المثال، استدعاء (1) تحريك بعد استدعاء فتح جلب مجموعة صفوف يتكون من صفوف من 2 إلى 11، ذات الحالية سجل توضع على الصف 2. للحصول على مزيد من المعلومات، راجع تحريك للدالة العضو.

  • بعكس تبادل حقل السجل , لا تدعم المعالجات تبادلات حقل السجل كبيرة الحجم. وهذا يعني أنه يجب التصريح بأعضاء بيانات الحقل يدوياً وتجاوز DoBulkFieldExchange يدوياً بكتابة استدعاءات إلي دالات RFX المجمعة. لمزيد من المعلومات، راجع دوال تبادل حقل السجل في مرجع مكتبة الفئات.

كيفية تنفيذ تبادل حقل السجلات المجمع.

تبادل حقل السجلات المجمع ينقل مجموعة صفوف من البيانات من مصدر البيانات إلى كائن مجموعة السجلات. تستخدم دالات RFX المجمعة مصفوفات لتخزين هذه البيانات ، بالإضافة إلى مصفوفات لتخزين طول كل عنصر بيانات في مجموعة الصفوف. في تعريف الفئة ، يجب تعريف أعضاء بيانات الحقل مثل المؤشرات للوصول لمصفوفات البيانات. بالإضافة إلى ذلك، يجب عليك تعريف مجموعة من المؤشرات للوصول لمصفوفات الأطوال. أي عضو بيانات معلمة لا يجب التصريح به كمؤشر ; التصريح بعضو بيانات المعلمة عند استخدام تبادل حقل السجل كبير الحجم هو كالتصريح بهم عند استخدام تبادل حقل السجلات. يوضح المثال التالي التعليمة البرمجية الكاملة.

class MultiRowSet : public CRecordset
{
public:
   // Field/Param Data
      // field data members
      long* m_rgID;
      LPSTR m_rgName;

      // pointers for the lengths
      // of the field data
      long* m_rgIDLengths;
      long* m_rgNameLengths;

      // input parameter data member
      CString m_strNameParam;

   .
   .
   .
}

يمكنك إما تخصيص هذه المخازن المؤقتة يدوياً أو جعل إطار العمل يقوم بالتخصيص. لتخصيص المخازن المؤقتة بنفسك , يجب تحديد خيار CRecordset::userAllocMultiRowBuffers للمعلمة dwOptions في دالة العضو Open . تأكد من أن أحجام المصفوفات علي الأقل تساوي حجم مجموعة الصفوف. إذا كنت تريد جعل إطار العمل يقوم بالتخصيص ، يجب تهيئة المؤشرات لـ NULL عادةً ما يتم هذا في منشئ كائن مجموعة السجلات:

MultiRowSet::MultiRowSet( CDatabase* pDB )
   : CRecordset( pDB )
{
   m_rgID = NULL;
   m_rgName = NULL;
   m_rgIDLengths = NULL;
   m_rgNameLengths = NULL;
   m_strNameParam = "";

   m_nFields = 2;
   m_nParams = 1;

   .
   .
   .
}

وأخيراً، يجب تجاوز دالة العضو DoBulkFieldExchange. لأعضاء بيانات الحقل ، استدع دالات RFX المجمعة ; لأي أعضاء بيانات معلمة ، استدع دالات RFX. إذا قمت بفتح مجموعة السجلات بواسطة تمرير عبارة SQL أو إجراء مخزن إلى Open ، يجب أن يتوافق ترتيب إجرائك لاستدعاءات RFX المجمعة مع ترتيب الأعمدة في مجموعة السجلات ; بالمثل ، ترتيب استدعاءات RFX للمعلمات يجب أن يتوافق مع ترتيب المعلمات في عبارة SQL أو الإجراء المخزن.

void MultiRowSet::DoBulkFieldExchange( CFieldExchange* pFX )
{
   // call the Bulk RFX functions
   // for field data members
   pFX->SetFieldType( CFieldExchange::outputColumn );
   RFX_Long_Bulk( pFX, _T( "[colRecID]" ),
                  &m_rgID, &m_rgIDLengths );
   RFX_Text_Bulk( pFX, _T( "[colName]" ),
                  &m_rgName, &m_rgNameLengths, 30 );


   // call the RFX functions for
   // for parameter data members
   pFX->SetFieldType( CFieldExchange::inputParam );
   RFX_Text( pFX, "NameParam", m_strNameParam );
}

ملاحظة

يجب استدعاء دالة العضو Close قبل أن تخرج الفئة CRecordsetالمشتقة خارج النطاق. هذا يضمن أن أي ذاكرة مخصصة بواسطة الإطار يتم تحريرها. من طرق البرمجة الجيدة أن تقوم دوماً باستدعاء Close‎ بشكل صريح، بغض النظر عما إذا كنت طبقت إحضار صفوف كبيرة الحجم.

للحصول على المزيد من المعلومات حول تبادل حقل السجل (RFX)، راجع تبادل حقل السجل: كيف يعمل RFX للحصول على مزيد من المعلومات حول استخدام المعلمات ، راجع CFieldExchange::SetFieldType مجموعة السجلات : جعل مجموعة السجلات لها ‏معلمات ‬(ODBC)

راجع أيضًا:

المرجع

CRecordset::m_nFields

CRecordset::m_nParams

المبادئ

مجموعة السجلات (ODBC)