يوفر مكون TADOQuery دلفي للمطورين القدرة على جلب البيانات من جدول واحد أو عدة جداول من قاعدة بيانات ADO باستخدام SQL.
يمكن أن تكون عبارات SQL هذه عبارات DDL (لغة تعريف البيانات) مثل CREATE TABLE ، ALTER INDEX ، وما إلى ذلك ، أو يمكن أن تكون عبارات DML (لغة معالجة البيانات) ، مثل SELECT و UPDATE و حذف. ومع ذلك ، فإن العبارة الأكثر شيوعًا هي عبارة SELECT ، التي تنتج طريقة عرض مشابهة لتلك المتوفرة باستخدام مكون جدول.
ملاحظة: على الرغم من أن تنفيذ الأوامر باستخدام مكون ADOQuery ممكن ، فإن أمر ADOCمكون أكثر ملاءمة لهذا الغرض. يتم استخدامه غالبًا لتنفيذ أوامر DDL أو لتنفيذ إجراء مخزن (على الرغم من أنه يجب عليك استخدامTADOStoredProc لمثل هذه المهام) التي لا تُرجع مجموعة نتائج.
يجب أن تكون SQL المستخدمة في مكون ADOQuery مقبولة لبرنامج ADO المستخدم. بمعنى آخر ، يجب أن تكون على دراية بالاختلافات في كتابة SQL بين ، على سبيل المثال ، MS Access و MS SQL.
كما هو الحال عند العمل مع مكون ADOTable ، يتم الوصول إلى البيانات الموجودة في قاعدة البيانات باستخدام اتصال مخزن البيانات الذي أنشأه مكون ADOQuery باستخدامسلسلة الاتصال الخاصية أو من خلال مكون ADOConnection منفصل محدد في الإتصالخاصية.
لجعل نموذج دلفي قادرًا على استرداد البيانات من قاعدة بيانات Access مع مكون ADOQuery ، قم ببساطة بإسقاط كل المكونات ذات الصلة بالوصول إلى البيانات والوعي بالبيانات عليها وإنشاء رابط كما هو موضح في الفصول السابقة من هذا دورة. مكونات الوصول إلى البيانات: DataSource و ADOConnection مع ADOQuery (بدلاً من ADOTable) ومكون واحد مدرك للبيانات مثل DBGrid هو كل ما نحتاجه.
كما هو موضح بالفعل ، باستخدام Object Inspector ، قم بتعيين الارتباط بين هذه المكونات على النحو التالي:
DBGrid1.DataSource = DataSource1
DataSource1.DataSet = ADOQuery1
ADOQuery1.Connection = ADOConnection1
// إنشاء ConnectionString
ADOConnection1.ConnectionString = ...
ADOConnection1.LoginPrompt = خطأ
القيام باستعلام SQL
لا يحتوي مكون TADOQuery على اسم الطاولةالخاصية كما يفعل TADOTable. يحتوي TADOQuery على خاصية (TStrings) تسمى SQL الذي يستخدم لتخزين جملة SQL. يمكنك تعيين قيمة خاصية SQL باستخدام مفتش الكائنات في وقت التصميم أو من خلال التعليمات البرمجية في وقت التشغيل.
في وقت التصميم ، قم باستدعاء محرر الخصائص لخاصية SQL عن طريق النقر فوق زر القطع في مفتش الكائنات. اكتب عبارة SQL التالية: "SELECT * FROM Authors".
يمكن تنفيذ جملة SQL بإحدى طريقتين ، اعتمادًا على نوع العبارة. بشكل عام يتم تنفيذ عبارات لغة تعريف البيانات مع ExecSQL طريقة. على سبيل المثال لحذف سجل معين من جدول معين ، يمكنك كتابة عبارة DELETE DDL وتشغيل الاستعلام باستخدام طريقة ExecSQL.
يتم تنفيذ عبارات SQL (العادية) عن طريق تعيين TADOQuery. نشيط الملكية ل صحيح أو عن طريق الاتصال بـافتح طريقة (في الأساس نفسه). يشبه هذا الأسلوب استرداد بيانات جدول مع مكون TADOTable.
في وقت التشغيل ، يمكن استخدام عبارة SQL في خاصية SQL كأي كائن StringList:
مع ADOQuery1 تبدأ إغلاق ؛
SQL.Clear ؛
SQL.Add: = 'SELECT * FROM Authors' SQL.Add: = 'ORDER BY authorname DESC' Open؛
النهاية؛
الكود أعلاه ، في وقت التشغيل ، يغلق مجموعة البيانات ، يفرغ سلسلة SQL في خاصية SQL ، يعين أمر SQL جديد وينشط مجموعة البيانات عن طريق استدعاء الأسلوب Open.
لاحظ أنه من الواضح أن إنشاء قائمة مستمرة بكائنات الحقول لمكون ADOQuery لا معنى له. في المرة التالية التي تقوم فيها باستدعاء الأسلوب Open ، يمكن أن تكون SQL مختلفة جدًا بحيث يمكن أن تتغير مجموعة كاملة من الأسماء (والأنواع) المودعة. بالطبع ، ليس هذا هو الحال إذا كنا نستخدم ADOQuery لجلب الصفوف من جدول واحد فقط مع مجموعة ثابتة من الحقول - وتعتمد المجموعة الناتجة على جزء WHERE من عبارة SQL.
استعلامات ديناميكية
واحدة من الخصائص الرائعة لمكونات TADOQuery هي Params خاصية. الاستعلام ذو المعلمة هو الذي يسمح بتحديد صف / عمود مرن باستخدام معلمة في جملة WHERE من عبارة SQL. تتيح الخاصية Params معلمات قابلة للاستبدال في عبارة SQL المعرفة مسبقًا. المعلمة هي عنصر نائب لقيمة في عبارة WHERE ، يتم تعريفها قبل فتح الاستعلام مباشرةً. لتحديد معلمة في استعلام ، استخدم نقطتين (:) تسبق اسم المعلمة.
في وقت التصميم ، استخدم المفتش الكائن لتعيين خاصية SQL على النحو التالي:
ADOQuery1.SQL: = 'SELECT * FROM Applications WHERE type =: apptype'
عند إغلاق نافذة محرر SQL ، افتح نافذة المعلمات بالنقر فوق زر القطع في مفتش الكائنات.
تم تسمية المعلمة في عبارة SQL السابقةنوع. يمكننا تعيين قيم المعلمات في مجموعة Params في وقت التصميم عبر مربع حوار Parameters ، ولكن في معظم الوقت سنقوم بتغيير المعلمات في وقت التشغيل. يمكن استخدام مربع حوار المعلمات لتحديد أنواع البيانات والقيم الافتراضية للمعلمات المستخدمة في الاستعلام.
في وقت التشغيل ، يمكن تغيير المعلمات وإعادة تنفيذ الاستعلام لتحديث البيانات. من أجل تنفيذ استعلام ذي معلمات ، من الضروري توفير قيمة لكل معلمة قبل تنفيذ الاستعلام. لتعديل قيمة المعلمة ، نستخدم إما خاصية Params أو أسلوب ParamByName. على سبيل المثال ، بالنظر إلى عبارة SQL على النحو الوارد أعلاه ، يمكننا في وقت التشغيل استخدام الكود التالي:
مع ADOQuery1 تبدأ
قريب؛
SQL.Clear ؛
SQL.Add ('SELECT * FROM Applications WHERE type =: apptype')؛
ParamByName ('apptype'). القيمة: = 'multimedia'؛
افتح؛
النهاية؛
كما هو الحال عند العمل مع مكون ADOTable ، يقوم ADOQuery بإرجاع مجموعة أو سجلات من جدول (أو اثنين أو أكثر). يتم التنقل عبر مجموعة بيانات بنفس مجموعة الطرق الموضحة في فصل "خلف البيانات في مجموعات البيانات".
تصفح وتحرير الاستعلام
بشكل عام ، يجب عدم استخدام مكون ADOQuery عند إجراء التعديل. يتم استخدام الاستعلامات المستندة إلى SQL في الغالب لأغراض إعداد التقارير. إذا أرجع الاستعلام مجموعة نتائج ، فمن الممكن في بعض الأحيان تحرير مجموعة البيانات التي تم إرجاعها. يجب أن تحتوي مجموعة النتائج على سجلات من جدول واحد ويجب ألا تستخدم أي دالات SQL تجميعية. تحرير مجموعة بيانات تم إرجاعها بواسطة ADOQuery هو نفس تحرير مجموعة بيانات ADOTAble.
مثال
لمشاهدة بعض إجراءات ADOQuery ، سنشفر مثالًا صغيرًا. لنقم بعمل استعلام يمكن استخدامه لجلب الصفوف من جداول مختلفة في قاعدة بيانات. لإظهار قائمة بجميع الجداول في قاعدة بيانات يمكننا استخدام GetTableNamesطريقة الاتصال مكون. يملأ GetTableNames في الحدث OnCreate من النموذج ComboBox بأسماء الجدول ويستخدم الزر لإغلاق الاستعلام وإعادة إنشائه لاسترداد السجلات من جدول تم انتقاؤه. يجب أن تبدو معالجات الأحداث () كما يلي:
الإجراء TForm1.FormCreate (المرسل: TObject) ؛
ابدأ
ADOConnection1.GetTableNames (ComboBox1.Items) ؛
النهاية؛
الإجراء TForm1.Button1Click (المرسل: TObject) ؛
var tblname: string؛
ابدأ
إذا كان ComboBox1.ItemIndex ثم خروج ؛
tblname: = ComboBox1.Items [ComboBox1.ItemIndex] ؛
مع ADOQuery1 تبدأ
قريب؛
SQL.Text: = 'SELECT * FROM' + tblname؛
افتح؛
النهاية؛
النهاية؛
لاحظ أن كل هذا يمكن القيام به باستخدام ADOTable وخاصية TableName الخاصة به.