SQL تخصيص عبارة SQL الخاص بك لمجموعة السجلات (ODBC)

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

  • كيفية قيام إطار العمل بإنشاء عبارة SQL

  • كيفية تجاوز عبارة SQL

ملاحظة

هذا الموضوع يُطبق على فئات MFC ODBC. إذا كنت تعمل مع فئات MFC DAO راجع الموضوع "مقارنة من SQL مشغّل قاعدة بيانات Microsoft Jet و ANSI SQL" في تعليمات DAO.

إنشاء عبارة SQL

أساسات مجموعة السجلات الخاصة بك تسجل التحديد بشكل أساسي على عبارة SQL SELECT . عند التصريح بالفئة باستخدام معالج ، فإنه يكتب إصداراً متجاوزاً من دالة العضو GetDefaultSQL التي تبدو كشيء مثل هذا (لفئة مجموعة سجلات تسمى CAuthors).

CString CAuthors::GetDefaultSQL()
{
    return "AUTHORS";
}

بشكل افتراضي، هذا التجاوز يقوم بإرجاع اسم الجدول الذي حددته في المعالج. في المثال ، اسم الجدول هو "AUTHORS." عند استدعاء دالة العضو Open لمجموعة السجلات فيما بعد ، تقوم Open بإنشاء عبارة SELECT نهائية للنموذج:

SELECT rfx-field-list FROM table-name [WHERE m_strFilter] 
       [ORDER BY m_strSort]

حيث يتم الحصول علي table-name عن طريق استدعاء GetDefaultSQL و يتم الحصول علي rfx-field-list من إستدعاءات دالة RFX في DoFieldExchange. هذا ما تحصل عليه لعبارة SELECT إلا إذا قمت باستبداله بإصدار متجاوز في وقت التشغيل على الرغم من أنه يمكنك أيضاً تعديل العبارة الافتراضية بمعلمات أو عامل تصفية.

ملاحظة

إذا قمت بتحديد اسم عمود يحتوي على (أو يمكن أن يحتوي) مسافات, يجب عليك إحاطة الاسم بقوسين مربعين. على سبيل المثال ، يجب أن يكون الاسم "First Name" هو "[First Name]".

لتجاوز عبارة SELECT الافتراضية ، قم بتمرير سلسلة تحتوي على عبارة SELECT كاملة عند استدعاء Open. بدلاً من إنشاء السلسلة الافتراضية الخاصة به ، تستخدم مجموعة السجلات سلسلة توفرها انت. إذا كانت جملة الاستبدال تحتوي على WHERE، لا تقم بتحديد عامل تصفية في m_strFilter لأنه عندئذ سيكون لديه اثنين من عبارات عامل التصفية. وبشكل مماثل، إذا احتوت عبارة الاستبدال علي جملة ORDER BY، لا تحدد فرز في m_strSort بحيث لا يكون لديك عبارتين للفرز .

ملاحظة

إذا استخدمت السلاسل الحرفية في عوامل التصفية الخاصة بك (أو أجزاء أخرى من عبارة SQL) ، فقد يتوجب عليك "إحاطة" (إحاطة بالمحددات المحددة) تلك السلاسل ببادئة حرفية خاصة بـ DBMS و لاحقة حرفية من حرف (أو أحرف).

أيضاً قد تواجه متطلبات لبناء الجملة خاصة من أجل عمليات مثل الصلات الخارجية اعتماداً على DBMS الخاص بك. قم باستخدام وظائف ODBC للحصول على هذه المعلومات من برنامج التشغيل لـ (DBMS). على سبيل المثال ، قم باستدعاء :: SQLGetTypeInfo لنوع بيانات معين مثل SQL_VARCHAR ، لطلب الأحرف LITERAL_PREFIX و LITERAL_SUFFIX . في حالة كتابة تعليمات برمجية بشكل مستقل عن قاعدة البيانات ، راجع الملحق C في المرجع الخاص بمبرمجي SDK ODBC على القرص المضغوط لمكتبة MSDN للحصول على معلومات مفصلة لبناء الجملة.

يقوم كائن مجموعة السجلات بإنشاء عبارة SQL يستخدمها لتحديد السجلات إلا إذا قمت بتمرير عبارة SQL مخصصة . كيفية إجراء ذلك يعتمد بشكل رئيسي على القيمة التي تمررها في المعلمة lpszSQL لدالة العضو Open.

الشكل العام لعبارة SQL ـ SELECT هو:

SELECT [ALL | DISTINCT] column-list FROM table-list
    [WHERE search-condition][ORDER BY column-list [ASC | DESC]]

إحدي الطرق لإضافة الكلمة الأساسية DISTINCT إلى عبارة SQL الخاصة بمجموعة السجلات هى بتضمين الكلمة الأساسية في استدعاء دالة RFX الأول في DoFieldExchange. فعلى سبيل المثال:

...
    RFX_Text(pFX, "DISTINCT CourseID", m_strCourseID);
...

ملاحظة

استخدم هذه التقنية فقط لمجموعة سجلات مفتوحة للقراءة فقط.

تجاوز عبارة SQL

يعرض الجدول التالي إمكانيات المعلمة lpszSQL لـ Open. الحالات في الجدول مشروحة بعد الجدول

معلمة lpszSQL و سلسلة SQL الناتجة

الحالة

ما تمرره في lpszSQL

عبارة SELECT الناتجة

1

NULL

SELECTrfx-field-listFROMtable-name

تقوم CRecordset::Open بإستدعاء GetDefaultSQL للحصول على اسم الجدول. السلسلة الناتجة واحدة من الحالات 2 إلى 5, اعتماداً على ماتقوم GetDefaultSQL بإرجاعه.

2

اسم جدول

SELECTrfx-field-listFROMtable-name

قائمة الحقول تؤخذ من عبارات RFX في DoFieldExchange. إذا كان m_strFilter و m_strSort غير خاليين ، يضيف عبارات WHERE و/أو ORDER .

3 *

عبارة SELECT كاملة ولكن بدون عبارة WHERE أو ORDER

كما تم التمرير. إذا كان m_strFilter و m_strSort غير خاليين ، يضيف عبارات WHERE و/أو ORDER .

4 *

عبارة SELECT كاملة مع عبارة WHERE و/أو ORDER

كما تم التمرير. m_strFilter و/او m_strSortيجب أن تبقى فارغ، أو عامل تصفية الثاني و/او إنتاج عبارات فرز.

5 *

استدعاء لإجراء مخزن

كما تم التمرير.

* يجب أن تكون m_nFields أقل من أو تساوي عدد الأعمدة المحددة في عبارة SELECT. نوع بيانات كل عمود المحدد في عبارة SELECT يجب أن تكون هو نفسه نوع بيانات عمود إخراج RFX المطابق.

حالة 1   lpszSQL = NULL

تحديد مجموعة السجلات يعتمد على ما تقوم GetDefaultSQL بإرجاعه عند إستدعاء CRecordset::Open لها. تصف الحالات 2 إلى 5 السلاسل المحتملة.

حالة 2   lpszSQL = a Table Name

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

المثال التالي يقوم بإنشاء عبارة SQL التي تحدد السجلات من تطبيق قاعدة بيانات MFC. عندما يستدعي إطار العمل دالة العضو GetDefaultSQL ، تقوم الدالة بإرجاع اسم الجدول، SECTION.

CString CEnrollSet::GetDefaultSQL()
{
    return "SECTION";
}

للحصول على أسماء الأعمدة لعبارة SQLـ SELECT، يقوم إطار العمل بإستدعاء دالة العضو DoFieldExchange .

void CEnrollSet::DoFieldExchange(CFieldExchange* pFX)
{
    pFX->SetFieldType(CFieldExchange::outputColumn);
    RFX_Text(pFX, "CourseID", m_strCourseID);
    RFX_Text(pFX, "InstructorID", m_strInstructorID);
    RFX_Text(pFX, "RoomNo", m_strRoomNo);
    RFX_Text(pFX, "Schedule", m_strSchedule);
    RFX_Text(pFX, "SectionNo", m_strSectionNo);
}

عند الإكتمال ، ستبدو عبارة SQL مثل هذا:

SELECT CourseID, InstructorID, RoomNo, Schedule, SectionNo 
    FROM SECTION

حالة 3   lpszSQL = a SELECT/FROM Statement

تقوم بتحديد قائمة الأعمدة يدوياً بدلاً من الاعتماد على RFX في إنشائها تلقائياً. قد تحتاج لفعل هذا عندما:

  • تريد تحديد الكلمة الأساسية DISTINCT بعد SELECT .

    يجب أن تتطابق قائمة الأعمدة مع أسماء الأعمدة و الأنواع في نفس الترتيب كما تم سردها في DoFieldExchange.

  • يوجد سبب لاسترداد قيم الأعمدة يدوياً باستخدام دالة ODBC ـ**:: SQLGetData** بدلاً من الاعتماد على RFX لربط الأعمدة واستردادها لك.

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

    يجب أن تطابق قائمة الأعمدة أسماء الأعمدة والأنواع بنفس الترتيب كما تم سردها فيه في DoFieldExchange ، متبوعة بأسماء الأعمدة المنضمة يدوياً . لمزيد من المعلومات، راجع مجموعة السجلات ربط أعمدة البيانات بشكل حيوي (ODBC) ..

  • تريد وصل جداول بواسطة تحديد جداول متعددة في عبارة FROM.

    لمزيد من المعلومات وللحصول على مثال ، راجع مجموعة السجلات تنفيذ عملية ضمّ (ODBC).

حالة 4   lpszSQL = SELECT/FROM Plus WHERE and/or ORDER BY

أنت تحدد كل شيء : قائمة الأعمدة (استناداً إلى إستدعاءات RFX في DoFieldExchange) ، قائمة الجداول و محتويات عبارة WHERE و/أو ORDER BY. إذا حددت عبارة WHERE و/أو ORDER BY الخاصة بك بهذه الطريقة ، لا تستخدم m_strFilter و/أو m_strSort.

حالة 5   lpszSQL = a Stored Procedure Call

إذا كنت تحتاج إلى إجراء إستدعاء لاستعلام معرف مسبقاً (مثل إجراء مخزن في قاعدة بيانات Microsoft SQL Server) ، يجب كتابة عبارة CALL في السلسلة الت تقوم بتمريرها إلى lpszSQL. لا تعتمد المعالجات التصريح بفئة مجموعة السجلات لاستدعاء استعلام معرف مسبقاً . لا تقوم كافة الاستعلامات المعرفة مسبقاً بإرجاع سجلات.

إذا لم يقوم استعلام معرّف مسبقاً بإرجاع سجلات ، يمكنك استخدام دالة العضو CDatabase ExecuteSQL مباشرة. لاستعلام معرّف مسبقاً لا يقوم بإرجاع سجلات , يجب كتابة إستدعاءات RFX يدوياً في DoFieldExchange للحصول على أية أعمدة يقوم الإجراء بإرجاعها. يجب أن تكون إستدعاءات RFX بنفس الترتيب وتقوم بإرجاع نفس الأنواع كالاستعلام المعرف مسبقاً. لمزيد من المعلومات، راجع مجموعة السجلات للتصريح بفئة للحصول على استعلام معرّف مسبقاً (ODBC) ..

راجع أيضًا:

المبادئ

SQL أنواع بيانات ++C و ODBC) SQL)

SQL إجراء استدعاءات SQL مباشرة (ODBC)