باعتباري من عشاق ASP، كثيرًا ما أستخدم كائنات ADO في صفحات ASP لتشغيل قواعد بيانات ODBC، وأشعر أنه من الملائم جدًا استخدام ASP لإنشاء أنظمة تطبيقات الويب. على الرغم من أن المؤلف في مسيرتي المهنية في مجال البرمجة يفضل منتجات سلسلة Borland وهو مثير للاشمئزاز قليلاً لمنتجات Microsoft، إلا أن الاستثناء هو ASP. في أحد الأيام، خطرت ببالي فكرة أن كائن ADO هو كائن OLE قياسي. سيكون من الرائع استخدام ADO لتشغيل قاعدة البيانات في تطبيق DELPHI. خاصة عند استخدام DELPHI كتطبيق قاعدة بيانات شبكة، إذا كان موقع الويب هو موقع WINNT ويدعم صفحات ASP، فيمكنك استخدام كائنات ADO للوصول إلى قاعدة بيانات ODBC دون تحميل مثل هذا الحجم الكبير من BDE إلى الموقع، بحيث يمكنك استخدام كائنات ADO بشكل كامل مزايا برمجة DELPHI وASP لتحسين ISAPI/NSAPI/CGI.
----بعد البرمجة والاختبار، يمكنك استخدام كائنات ADO بنجاح للوصول إلى قاعدة بيانات ODBC في DELPHI. والآن سأقوم بتدوين التجربة ومشاركتها معك.
---- في DELPHI 32 بت، يمكنك تعريف متغير متغير (مثل AVariant)، ثم إنشاء كائن OLE من خلال CreateOleObject، مثل AVariant:=CreateOleObject('ADODB.Connection') للحصول على مثيل لـ كائن اتصال قاعدة البيانات، ثم يمكنك استخدام أساليب وخصائص الكائن لتشغيل قاعدة بيانات ODBC.
----ما يلي هو مقدمة مختصرة عن كائنات ADO المستخدمة للوصول إلى قواعد بيانات ODBC وأساليبها وخصائصها.
---- 1. كائن اتصال قاعدة البيانات (ADODB.Connection)
---- يُستخدم هذا الكائن لتأسيس اتصال بقاعدة بيانات ODBC، ويتم تنفيذ جميع العمليات على قاعدة البيانات من خلال هذا الاتصال.
---- كائن اتصال قاعدة البيانات ADODB.Connection يعمل مثل كائن TDatabase في دلفي.
---- طريقة إنشاء كائن اتصال هي (AConnection هو متغير من النوع المتغير):
---- AConnection:=CreateOleObject('ADODB.Connection')
---- الطريقة المستخدمة لتأسيس الاتصال هي مفتوحة، وصياغة الاستخدام هي (خذ الكائن AConnection كمثال):
---- AConnection.Open(سلسلة الاتصال، معرف المستخدم، كلمة المرور)
----المعلمات الثلاث كلها من نوع السلسلة، حيث يكون معرف المستخدم وكلمة المرور هما اسم المستخدم وكلمة المرور المستخدمة للوصول
---- يُستخدم في قاعدة البيانات، ويمكن حذفه لأنه يمكن أيضًا تحديد اسم المستخدم وكلمة مرور المستخدم في ConnectionString. سلسلة الاتصال عبارة عن سلسلة تُستخدم لوصف معلومات مصدر بيانات ODBC، وتنسيقها هو:
'PRovider=ProviderName;DSN=DSNName;DRIVER=driver=server;
---- في:
---- الموفر: موفر البيانات، الافتراضي هو MSDASQL، وهو Microsoft OLEDB، ويتم حذفه عادةً
---- DSN: مصدر بيانات نظام obdc (DSN) المطابق لقاعدة البيانات التي سيتم فتحها، وهي معلمة اختيارية.
---- برنامج التشغيل: اسم برنامج التشغيل المستخدم لفتح قاعدة البيانات، مثل الوصول المطابق
----Microsoft Access Driver(*.mdb)، هو معلمة اختيارية
---- الخادم: اسم الخادم الذي توجد به قاعدة البيانات التي سيتم فتحها، وهو متوفر على هذا الجهاز (محلي) وهو معلمة اختيارية.
---- قاعدة البيانات: اسم قاعدة البيانات التي سيتم فتحها، وهو معلمة اختيارية
---- UID: اسم المستخدم، المستخدم للوصول إلى قاعدة البيانات، هو معلمة اختيارية
----PWD: كلمة مرور المستخدم، المستخدمة للوصول إلى قاعدة البيانات، هي معلمة اختيارية
---- المعلمات المذكورة أعلاه كلها معلمات اختيارية، ولكن يجب توفير معلومات كافية لوصف مصدر بيانات النظام.
---- إذا تم تعريف DSN لنظام ODBC، باسم MyDsn، فيمكنك استخدام العبارة التالية لإنشاء اتصال بقاعدة البيانات:
----
AConnection.Open('DSN=MyDsn');
---- لمنع حدوث أخطاء في تشغيل التطبيق عند عدم وجود DSN أو تعديل إعداداته من قبل الآخرين، يمكنك استخدام ADODB.Connection لإنشاء مصدر بيانات ODBC مؤقت، مما يضمن ضبط إعدادات المعلمات لنظام DSN نستخدمها صحيحة. يمكن أن تقوم العبارة التالية بإنشاء نظام ODBC مؤقت DSN، يتوافق مع قاعدة بيانات ACCESS، والمسار هو
C:Inetpubwwwrootest.mdb AConnection.open('Driver={Microsoft Access Driver (*.mdb)};DBQ=C:inetpubwwwrootest.mdb')
---- بعد إنشاء ADODB.Connection، إذا لم تكن بحاجة إلى إرجاع نتائج العملية (مثل الحذف والتعديل والتحديث وما إلى ذلك)، فيمكنك إجراء عمليات SQL عادية على قاعدة البيانات في هذا الوقت، استخدم أخرى طريقة تنفيذ ADODB.Connection بناء جملة الاستخدام هو:
AConnection.Execute( strSQL );
---- من بينها، strSQL هي عبارة SQL لتنفيذ العملية. على سبيل المثال، يمكن أن تكون عملية الحذف: استخدم AConnection.Close لإغلاق اتصال قاعدة البيانات.
---- 2. كائن مجموعة البيانات (ADODB.RecordSet)
---- إذا كنت ترغب في تنفيذ عمليات الاستعلام وإرجاع نتائج الاستعلام، أو إذا كنت تريد تشغيل جدول البيانات بشكل أكثر ملاءمة، فستحتاج إلى استخدام كائن مجموعة البيانات.
---- كائن مجموعة البيانات ADODB.RecordSet يعمل مثل كائن TTable أو TQuery في دلفي.
---- طريقة إنشاء كائن مجموعة بيانات هي (ARecordSet هو متغير نوع متغير):
----
ARecordSet:=CreateOleObject('ADODB.RecordSet')
---- طريقة الحصول على البيانات من جدول البيانات هي الطريقة المفتوحة وطريقة الاستخدام المحددة هي:
ARecordSet.Open( strCommand,ActiveConnection,intCursorType,intLockType,intCommandType);
---- من بينها: strCommand: string، وهي معلمة أمر يمكن أن تكون اسم جدول، أو عبارة SQL، أو اسم إجراء مخزن (StoredProc) على الخادم.
---- ActiveConnection: اتصال قاعدة البيانات المطلوب استخدامه هو كائن ADODB.Connection.
---- intCursorType: عدد صحيح طويل، نوع المؤشر لمجموعة البيانات، المعلمات الاختيارية، يرجى الاطلاع على التعليقات في البرنامج.
---- intLockType: عدد صحيح طويل، نوع القفل لجدول البيانات، المعلمات الاختيارية، يرجى الرجوع إلى التعليقات في البرنامج.
---- intCommandType: عدد صحيح طويل، نوع معلمة الأمر، المستخدم للإشارة إلى دور strCommand. يمكنك تحديد strCommand كأمر (مثل عبارة SQL) أو جدول بيانات (TTable) أو إجراء مخزن (StoredProc). للحصول على المعلمات الاختيارية، يرجى الاطلاع على التعليقات في البرنامج.
---- إذا قمت بتنفيذ استعلام SQL، يمكنك استخدام العبارة التالية:
ARecordSet.Open('Select * from wfjcommu',adOpenStatic,adLockOptimistic,adCmdText);
---- الخصائص والأساليب الشائعة الأخرى مقارنة بـ TTable وTQuery هي كما يلي (راجع ملف تعليمات ASP للحصول على التفاصيل):
إوف، بوف: إوف، بوف. MoveFirst، MoveLast: الأول، LastMovePrevious، MoveNext: قبل، NextMove: MoveByAddNew: appendUpdate: PostClose: إغلاق
---- حذف زائد التحديث: حذف، جميع التعديلات على جدول البيانات يجب أن تستخدم التحديث لجعل العملية فعالة، وهو يختلف عن دلفي
الحقول[FieldNo]:Fields[FieldNo]الحقول['FieldName']:FieldByName('FieldName')
---- 3. الكائنات الشائعة الأخرى (الكائنات المقابلة لدلفي):
----
ADODB.Field: TFieldADODB.Parameter: TParaADODB.Error: EDBEngineErrorADODB.Command: لا شيء ADODB.الخاصية: لا شيء
---- دعونا نلقي نظرة على مثال تطبيقي، فمن الأفضل أن تسمع ما يقوله الآخرون بدلاً من رؤية المثال الفعلي بنفسك. في هذا المثال، سنوضح كيفية استخدام كائنات ADO للاستعلام وإضافة السجلات وتعديل السجلات وحذف السجلات في جدول البيانات. يرجى الرجوع إلى التعليقات الموجودة في البرنامج لمعرفة الاستخدام المحدد. إذا كان لديك بعض الخبرة في برمجة قواعد بيانات دلفي، أعتقد أنه ليس من الصعب فهمها.
---- في مثالنا، قاعدة البيانات المستخدمة هي Test.MDB. يوجد جدول بيانات يسمى wfjcommu، والذي يحتوي على خمسة حقول: AName، وPortable، وTel، وBP، وPostAddress، والتي تمثل الاسم ورقم الهاتف المحمول ورقم الهاتف. ورقم النداء على التوالي وعنوان المراسلة.
----
الإجراء TForm1.Button1Click(Sender: TObject);{****************************************** *** ****************
---- استخدم ADO لتشغيل قاعدة بيانات ODBC. في هذا البرنامج، سيتم إنشاء مصدر بيانات نظام ODBC مؤقت، مع الإشارة إلى قاعدة بيانات MsAccess، ومن ثم سيتم عرض جداول البيانات الموجودة فيها وإضافتها وتعديلها وحذفها والاستعلام عنها. ملاحظة: الرجاء النقر فوق "الاستخدامات". يحتوي البيان على وحدة ComObj
*************************************************************************************************************************************************************************** * ***}const{ بعض الإعلانات الثابتة، يرجى الاطلاع على adovbs.inc للحصول على التفاصيل }{ ----وصف ثابت لـ CommandType---- } adCmdUnknown = 0008;// غير معروف، يحتاج إلى الحكم من قبل النظام، بطيء ، القيمة الافتراضية adCmdText = 0001;// عبارة أمر مثل عبارة SQL adCmdTable = 0002;// اسم جدول البيانات adCmdStoredProc = 0004;// اسم الإجراء المخزن {---- وصف ثابت لـ CursorType---- } adOpenForwardOnly = 0;// لا يمكن الوصول إليه إلا في اتجاه واحد من الأمام إلى الخلف، وهو القيمة الافتراضية adOpenKeyset = 1; // تكون التعديلات التي يجريها المستخدمون الآخرون على البيانات مرئية، لكن الإضافات والحذف التي يجريها المستخدمون الآخرون غير مرئية adOpenDynamic = 2;// تكون إضافة البيانات وتعديلها وحذفها من قبل مستخدمين آخرين مرئية adOpenStatic = 3;// تكون إضافة البيانات وتعديلها وحذفها من قبل مستخدمين آخرين مرئية {---- الوصف الثابت لـ LockType ---} adLockReadOnly = 1; // للقراءة فقط، القيمة الافتراضية adLockPessimistic = 2; // عند التعديل، قم بالقفل وفقًا لسجل واحد adLockOptimistic = 3;// قفل بسجل واحد عند التحديث بعد التعديل adLockBatchOptimistic = 4;// قفل السجل عند التحديث على دفعات var AConnection, ARecordSet:variant; مصدر بيانات ODBC، يشير إلى قاعدة بيانات MsAccess، ويستخدم DSN هذا لتأسيس اتصال بقاعدة البيانات} AConnection := CreateOleObject('ADODB.Connection'); AConnection.Open('Driver={Microsoft Access Driver (*.mdb)};DBQ=C:inetpubwwwrootest'); {إنشاء كائن مجموعة بيانات واستخراج البيانات من جدول البيانات} ARecordSet := CreateOleObject('ADODB.RecordSet'); ARecordSet.open( 'wfjcommu',AConnection, adOpenStatic,adLockOptimistic,adCmdTable ); memo1.lines.clear('********المحتوى الأصلي لجدول البيانات هو كما يلي*********'); عرض اسم مجال كل حقل} strTemp := '; for intIndex:= 0 إلى ARecordSet.Fields.count - 1 do strTemp := strTemp + ARecordSet.Fields[intIndex].name+';'; memo1.lines.add( strTemp ); {عرض محتويات كل حقل} بينما لا يبدأ ARecordSet.eof strTemp := '; لـ intIndex := 0 إلى ARecordSet.Fields العد - 1 لـ strTemp := strTemp + ARecordSet.Fields [intIndex].value+';';memo1.lines.add( strTemp );// انتقل إلى السطر التالي، النهاية التالية؛ {إضافة سجل} ARecordSet.AddNew;// إضافة، إلحاق ARecordSet.Fields [ 'AName'] := '1'; // الوصول إلى ARecordSet.Fields['Portable'] باستخدام FieldByName := '2'; ARecordSet.Fields(2) := '3'; //الوصول إلى ARecordSet.Fields(3) := '4'; ; ARecordSet.Update;// تحديث، نشر ARecordSet.MoveFirst;// انتقل إلى العنصر الأول، أولاً memo1.lines.add('********محتوى جدول البيانات بعد إضافة سجل هو كما يلي*********'); {عرض محتويات كل حقل} بينما ليس ARecordSet .eof do begin strTemp := ';for intIndex := 0 to ARecordSet Fields.count - 1 do strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';memo1.lines.add( strTemp ); ARecordSet.MoveNext; // انتقل إلى السجل التالي، النهاية التالية؛ {تعديل السجل الأخير} ARecordSet.MoveLast; 'محمول'] := '22'; ARecordSet.Fields(2) := '33'; // الوصول إلى ARecordSet.Fields(3) كحقول[index] := '44'; ARecordSet.Fields(4) := '55';// تحديث، نشر ARecordSet.MoveFirst;// انتقل إلى العنصر الأول، المذكرة الأولى1.lines.add('********محتويات جدول البيانات بعد تعديل السجل الأخير هي كما يلي************'); محتويات كل حقل } بينما لا ARecordSet.eof يبدأ strTemp := ';for intIndex := 0 إلى ARecordSet.Fields.count - 1 يفعل strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';memo1.lines.add( strTemp ); ARecordSet.MoveNext;// انتقل إلى السجل التالي، النهاية التالية {حذف السجل الأخير} ARecordSet.MoveLast;// انتقل إلى السطر الأخير، آخر ARecordSet.delete;// حذف، احذف ARecordSet.Update;// التحديث، غير مطلوب في دلفي ARecordSet.MoveFirst;// انتقل إلى السطر الأول، أول خطوط المذكرة 1. .add ('*********محتويات جدول البيانات بعد حذف السجل الأخير هي كما يلي*********'); {عرض محتويات كل حقل} بينما لا يوجد ARecordSet.eof ابدأ strTemp := '; for intIndex := 0 إلى ARecordSet.Fields.count - 1 do strTemp := strTemp + ARecordSet. Fields[intIndex].value+';';memo1.lines.add( strTemp );/ / انتقل إلى الشريط التالي، النهاية التالية؛ ARecordSet.Close;{أغلق مجموعة البيانات} {استخدم عبارة SQL للاستعلام، وسجلات الاستعلام المسماة "Zhang San"} {لاحظ أنه في عبارة SQL، يجب وضع السلسلة بين علامتي اقتباس مفردتين} ARecordSet.open( 'select * from wfjcommu Where AName = 'Zhang San' ', AConnection,adOpenStatic,adLockOptimistic, adCmdText ); memo1.lines.add('********محتوى Zhang San كما يلي*********'); memo1.lines.add( 'Total' + IntToStr ( ARecordSet.RecordCount ) + 'مطابقة السجلات' ); {عرض محتويات كل حقل} بينما لا يبدأ ARecordSet.eof strTemp := '; لـ intIndex:= 0 إلى ARecordSet.Fields.count - 1 strTemp: = strTemp + ARecordSet.Fields [intIndex].value+';';memo1.lines.add( strTemp ); ARecordSet.MoveNext;// انتقل إلى الشريط التالي، Next end;