استخدم كائنات ADO للوصول إلى بيانات ODBC في برامج DELPHI
-------------------------------------------------- ----------------------------------
باعتباري من عشاق ASP، كثيرًا ما أستخدم كائنات ADO في صفحات ASP لتشغيل قواعد بيانات ODBC، وأشعر أنه من الملائم حقًا استخدام ASP لإنشاء أنظمة تطبيقات الويب. على الرغم من أن المؤلف في مسيرتي المهنية في مجال البرمجة يفضل منتجات سلسلة Borland وهو منفر قليلاً لمنتجات Microsoft، إلا أنني استثناء لـ ASP. في أحد الأيام، خطر لي فجأة أن كائن ADO هو كائن OLE قياسي. سيكون من الرائع استخدام ADO لتشغيل قاعدة البيانات في تطبيق دلفي. خاصة عند استخدام DELPHI كتطبيق قاعدة بيانات شبكة، إذا كان موقع الويب هو موقع WINNT ويدعم صفحات ASP، فيمكنك استخدام كائنات ADO للوصول إلى قاعدة بيانات ODBC دون تحميل مثل هذا الحجم الكبير من BDE إلى الموقع. بهذه الطريقة، يمكنك الاستفادة الكاملة من مزايا البرمجة DELPHI وASP لتحسين ISAPI/NSAPI/CGI. بعد البرمجة والاختبار، يمكنك استخدام كائنات ADO بنجاح للوصول إلى قواعد بيانات ODBC في دلفي. الآن سأقوم بتدوين تجربتي ومشاركتها مع الجميع، حتى نتمكن من الحصول على طريقة أخرى للوصول إلى قواعد بيانات ODBC.
في دلفي 32 بت، يمكنك إعلان متغير متغير (مثل AVariant)، ثم إنشاء كائن OLE من خلال CreateOleObject، مثل AVariant:=CreateOleObject ('ADODB.Connection') للحصول على مثيل لكائن اتصال قاعدة البيانات، وبعد ذلك يمكنك استخدام أساليب وخصائص هذا الكائن لتشغيل قاعدة بيانات ODBC.
ما يلي هو مقدمة مختصرة عن كائنات ADO المستخدمة للوصول إلى قواعد بيانات ODBC وأساليبها وخصائصها.
1. كائن اتصال قاعدة البيانات (ADODB.Connection)
يتم استخدام هذا الكائن لتأسيس اتصال بقاعدة بيانات ODBC، ويتم تنفيذ كافة العمليات على قاعدة البيانات من خلال هذا الاتصال.
يعمل كائن اتصال قاعدة البيانات ADODB مثل كائن TDatabase في دلفي.
طريقة إنشاء كائن اتصال هي (AConnection هو متغير نوع متغير):
AConnection:=CreateOleObject('A DODB.Connection')
الطريقة المستخدمة لتأسيس الاتصال هي Open، وصياغة الاستخدام هي (مع أخذ الكائن AConnection كمثال):
AConnection.Open (سلسلة الاتصال، معرف المستخدم، كلمة المرور)
المعلمات الثلاث جميعها من نوع السلسلة، حيث يكون UserId وPassword هما اسم المستخدم وكلمة مرور المستخدم، والتي يمكن حذفها عند استخدامها للوصول إلى قاعدة البيانات، لأنه يمكن أيضًا تحديد اسم المستخدم وكلمة مرور المستخدم في ConnectionString. سلسلة الاتصال عبارة عن سلسلة تُستخدم لوصف معلومات مصدر بيانات ODBC، وتنسيقها هو:
'PRovider=ProviderName;DSN=DSNName;
في:
الموفر: موفر البيانات، MSDASQL بشكل افتراضي، Microsoft OLEDB، يتم حذفه عادةً؛
DSN: مصدر بيانات نظام obdc (DSN) المطابق لقاعدة البيانات التي سيتم فتحها هو معلمة اختيارية؛
برنامج التشغيل: اسم برنامج التشغيل المستخدم في قاعدة البيانات المراد فتحه، مثل الوصول المطابق لـ Microsoft Access Driver (*.mdb)، وهو معلمة اختيارية؛
SERVER: اسم الخادم الذي توجد به قاعدة البيانات التي سيتم فتحها، وهو متاح على هذا الجهاز (محلي)، وهو معلمة اختيارية؛
DATABASE: اسم قاعدة البيانات التي سيتم فتحها، وهو معلمة اختيارية؛
UID: اسم المستخدم، المستخدم للوصول إلى قاعدة البيانات، هو معلمة اختيارية؛
الأشخاص ذوي الإعاقة: كلمة مرور المستخدم، المستخدمة للوصول إلى قاعدة البيانات، هي معلمة اختيارية.
تعتبر المعلمات المذكورة أعلاه اختيارية، ولكن يجب توفير معلومات كافية لوصف مصدر بيانات النظام.
إذا تم تعريف DSN لنظام ODBC وتم تسميته MyDsn، فيمكنك استخدام العبارة التالية لتأسيس اتصال بقاعدة البيانات:
AConnection.Open('DSN=MyDsn');
لمنع حدوث أخطاء في تشغيل التطبيق عند عدم وجود DSN أو تعديل إعداداته بواسطة الآخرين، يمكنك استخدام ADODB.Connection لإنشاء مصدر بيانات ODBC مؤقت، مما يضمن صحة إعدادات معلمات نظام DSN الذي نستخدمه . يمكن أن تقوم العبارة التالية بإنشاء نظام ODBC مؤقت DSN، يتوافق مع قاعدة بيانات ACCESS، والمسار هو C:Inetpub wwwroot test.mdb:
AConnection.open('Driver= {Microsoft Access Driver (*.mdb)};DBQ=C:inetpub wwwroot est.mdb')
بعد إنشاء ADODB.Connection، إذا لم تكن هناك حاجة لإرجاع نتائج العملية (مثل الحذف والتعديل والتحديث وما إلى ذلك)، فيمكنك إجراء عمليات SQL عادية على قاعدة البيانات في هذا الوقت، هناك طريقة أخرى لـ ADODB.Connection ، تنفيذ، يستخدم بناء الجملة:
AConnection.Execute( strSQL );
من بينها، strSQL هي عبارة SQL لتنفيذ العملية، على سبيل المثال، يمكن أن تكون عملية الحذف: حذف من wfjcommu. استخدم AConnection.Close لإغلاق اتصال قاعدة البيانات.
2. كائن مجموعة البيانات (ADODB.RecordSet)
إذا كنت تريد تنفيذ عمليات الاستعلام وإرجاع نتائج الاستعلام، أو إذا كنت تريد تشغيل جدول البيانات بشكل أكثر ملاءمة، فستحتاج إلى استخدام كائن مجموعة البيانات.
كائن مجموعة البيانات ADODB.RecordSet يعمل مثل كائن TTable أو TQuery في دلفي.
طريقة إنشاء كائن مجموعة بيانات هي (ARecordSet هو متغير نوع متغير):
ARecordSet:=CreateOleObject ('ADODB.RecordSet')
طريقة الحصول على البيانات من جدول البيانات هي الطريقة المفتوحة وطريقة الاستخدام المحددة هي:
ARecordSet.Open( strCommand,ActiveConnection,int CursorType,intLockType, intCommandType);
في:
strCommand: سلسلة، وهي معلمة أمر يمكن أن تكون اسم جدول، أو عبارة SQL، أو اسم إجراء مخزن (StoredProc) على الخادم. يجب تحديد المعلمة المحددة بواسطة المعلمة التالية intCommandType.
ActiveConnection: اتصال قاعدة البيانات المطلوب استخدامه هو كائن اتصال ADODB.
intCursorType: عدد صحيح طويل، نوع المؤشر لمجموعة البيانات، معلمات اختيارية، يرجى الاطلاع على التعليقات في البرنامج.
intLockType: عدد صحيح طويل، نوع القفل لجدول البيانات، المعلمات الاختيارية، يرجى الرجوع إلى التعليقات في البرنامج.
intCommandType: عدد صحيح طويل، نوع معلمة الأمر، المستخدم للإشارة إلى دور strCommand. يمكنك تحديد strCommand كأمر (مثل عبارة SQL) أو جدول بيانات (TTable) أو إجراء مخزن (StoredProc). المعلمات، يرجى الاطلاع على التعليقات في البرنامج.
لتنفيذ استعلام SQL، يمكنك استخدام العبارة التالية:
ARecordSet.Open('Select * from wfjcommu',adOpenStatic,ad LockOptimistic,adCmdText);
الخصائص والأساليب الشائعة الأخرى مقارنة بـ TTable وTQuery هي كما يلي (راجع ملف تعليمات ASP للحصول على التفاصيل):
إوف، بوف: إوف، بوف. MoveFirst، MoveLast: الأول، LastMovePrevious، MoveNext: قبل، NextMove: MoveByAddNew: appendUpdate: PostClose: إغلاق
حذف زائد تحديث: حذف، جميع التعديلات على جدول البيانات يجب أن تستخدم التحديث لجعل العملية فعالة، وهو يختلف عن دلفي.
الحقول [رقم الحقل]: الحقول [رقم الحقل]
الحقول['FieldName']: FieldByName('FieldName')
3. الكائنات الشائعة الأخرى (الكائنات المقابلة لدلفي):
ADODB.Field: TField ADODB.المعلمة: TPara ADODB.Error: EDBEngineError
ADODB.Command: لا يوجد ADODB.Property: لا يوجد
دعونا نلقي نظرة على مثال التطبيق:
الإجراء 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; // سجل القفل أثناء تحديث الدفعة
فار
AConnection، ARecordSet: متغير؛
longintTemp : عدد صحيح؛
strTemp: سلسلة؛
intIndex : عدد صحيح؛
يبدأ
{قم بإنشاء مصدر بيانات ODBC مؤقت، وأشر إلى قاعدة بيانات MsAccess، واستخدم DSN هذا لتأسيس اتصال بقاعدة البيانات}
AConnection := CreateOleObject('ADODB.Connection');
AConnection.Open('Driver={Microsoft Access Driver (*.mdb)};DBQ=C:inetpubwwwroot est');
{إنشاء كائن مجموعة بيانات واستخراج البيانات من جدول البيانات}
ARecordSet := CreateOleObject('ADODB.RecordSet');
ARecordSet.open( 'wfjcommu',AConnection,adOpenStatic,adLockOptimistic,adCmdTable );
memo1.lines.clear;
memo1.lines.add('المحتوى الأصلي لجدول بيانات ******** كما يلي ********');
{عرض اسم المجال لكل مجال}
strTemp := '';
بالنسبة لـ intIndex:= 0 إلى ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].name+';';
memo1.lines.add(strTemp);
{عرض محتوى كل مجال}
في حين لا ARecordSet.eof القيام به
يبدأ
strTemp := '';
بالنسبة لـ intIndex:= 0 إلى ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add(strTemp);
ARecordSet.MoveNext;// انتقل إلى الشريط التالي، التالي
نهاية؛
{إضافة سجل}
ARecordSet.AddNew;//إضافة،إلحاق
ARecordSet.Fields['AName'] := '1';//الوصول عن طريق FieldByName
ARecordSet.Fields['Portable'] := '2';
ARecordSet.Fields(2) := '3';// الوصول في شكل حقول[فهرس]
ARecordSet.Fields(3) := '4';
ARecordSet.Fields(4) := '5';
ARecordSet.Update;//تحديث، نشر
ARecordSet.MoveFirst;// انتقل إلى العنصر الأول، أولاً
memo1.lines.add('********محتوى جدول البيانات بعد إضافة سجل هو كما يلي*********');
{عرض محتوى كل مجال}
في حين لا ARecordSet.eof القيام به
يبدأ
strTemp := '';
بالنسبة لـ intIndex:= 0 إلى ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add(strTemp);
ARecordSet.MoveNext;// انتقل إلى الشريط التالي، التالي
نهاية؛
{تعديل السجل الأخير}
ARecordSet.MoveLast;
ARecordSet.Fields['AName'] := '11';//الوصول باستخدام FieldByName
ARecordSet.Fields['Portable'] := '22';
ARecordSet.Fields(2) := '33';// الوصول في شكل حقول[فهرس]
ARecordSet.Fields(3) := '44';
ARecordSet.Fields(4) := '55';
ARecordSet.Update;//تحديث، نشر
ARecordSet.MoveFirst;// انتقل إلى العنصر الأول، أولاً
memo1.lines.add('********محتوى جدول البيانات بعد تعديل السجل الأخير هو كما يلي*********');
{عرض محتوى كل مجال}
في حين لا ARecordSet.eof القيام به
يبدأ
strTemp := '';
بالنسبة لـ intIndex:= 0 إلى ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add(strTemp);
ARecordSet.MoveNext;// انتقل إلى الشريط التالي، التالي
نهاية؛
{حذف السجل الأخير}
ARecordSet.MoveLast;// انتقل إلى الشريط الأخير، Last
ARecordSet.delete;//حذف، حذف
ARecordSet.Update;// التحديث غير مطلوب في دلفي
ARecordSet.MoveFirst;// انتقل إلى العنصر الأول، أولاً
memo1.lines.add('********محتويات جدول البيانات بعد حذف السجل الأخير هي كما يلي*********');
{عرض محتوى كل مجال}
في حين لا ARecordSet.eof القيام به
يبدأ
strTemp := '';
بالنسبة لـ intIndex:= 0 إلى ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add(strTemp);
ARecordSet.MoveNext;// انتقل إلى الشريط التالي، التالي
نهاية؛
ARecordSet.Close;{أغلق مجموعة البيانات}
{استخدم عبارة SQL للاستعلام عن السجلات المسماة "Zhang San"}
{لاحظ أنه في عبارات SQL، يجب وضع السلاسل بين علامتي اقتباس مفردتين}
ARecordSet.open( 'اختر * من wfjcommu حيث 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 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add(strTemp);
ARecordSet.MoveNext;// انتقل إلى الشريط التالي، التالي
نهاية؛
{إغلاق مجموعة البيانات واتصال قاعدة البيانات}
ARecordSet. Close;
AConnection.Close;
نهاية؛
الاستماع إلى الآخرين يقولون أنه من الأفضل تجربة ذلك بنفسك من خلال رؤية الأمثلة الفعلية. في هذا المثال، سنوضح كيفية استخدام كائنات ADO للاستعلام وإضافة السجلات وتعديل السجلات وحذف السجلات في جدول البيانات. يرجى الرجوع إلى التعليقات الموجودة في البرنامج لمعرفة الاستخدام المحدد. إذا كان لديك بعض الخبرة في برمجة قواعد بيانات دلفي، أعتقد أنه ليس من الصعب فهمها.
قاعدة البيانات المستخدمة في مثالنا هي Test.MDB، والتي تحتوي على جدول بيانات يسمى wfjcommu، مع خمسة حقول AName وPortable وTel وBP وPostAddress، والتي تمثل الاسم ورقم الهاتف المحمول ورقم الهاتف ورقم النداء والعنوان البريدي. على التوالى.
تم تصحيح أخطاء البرنامج أعلاه وتمريره ضمن PWIN98+ Delphi 3.0+PWS (Personal Web Server) 4.0.