السلام عليكم...
أعتقد أن أفضل الطرق للتعامل مع كائنات SQL Server (قواعد البيانات و الجداول و الحقول و الفهارس و غيرها) هو استعمال مكتبة الأنواع (Type Library) التي يوفرها SQL Server نفسه و المعروفة باسم Microsoft SQLDMO Object Library (حيث DMO اختصار من Data Management Objects).
لاستعمال تلك الكائنات نحتاج أولاً إلى استيراد تلك المكتبة و إنشاء وحدة برمجية (Unit) خاصة بها في دلفي. و لإنجاز ذلك نقوم بالتالي (لمرة واحدة فقط):
1. من القائمة Project نختار الأمر Import Type Library. ستظهر لنا النافذة التالية:
طبعاً محتويات القائمة تعتمد على البرامج و المكتبات المسجلة في النظام.
2. نبحث في القائمة عن Microsoft SQLDMO Object Library و نقوم بتحديده. سنلاحظ أن قائمة Class Names ستعرض أسماء الأصناف (Classes) التي تضمها المكتبة.
3. امسح الخيار Generate Component Wrapper الموجود في أسفل النافذة.
4. انقر الزر Create Unit.
سيتم إنشاء وحدة (Unit) باسم SQLDMO_TLB.pas في المجلد Imports التابع لدلفي.
ملاحظة مهمة: قد تحتوي هذه الوحدة عند إنشائها على تعارض بسيط في إحدة الواجهات (Interfaces) و هي:
_DistributionArticle2Disp
======================================
_DistributionArticle2Disp = dispinterface
['{10033116-E260-11CF-AE68-00AA004A34D5}']
property ID: Integer writeonly dispid 14;
property Application: Application readonly dispid 1;
property Parent: _IVSQLDMOStdObject readonly dispid 2;
property UserData: Integer dispid 3;
property TypeOf: SQLDMO_OBJECT_TYPE readonly dispid 4;
property Properties: Properties readonly dispid 7;
property Name: WideString dispid 9;
property ID: Integer readonly dispid 10;
property SourceObjectOwner: WideString dispid 11;
property SourceObjectName: WideString dispid 12;
property Description: WideString dispid 13;
procedure Remove; dispid 100;
procedure BeginAlter; dispid 101;
procedure DoAlter; dispid 102;
procedure CancelAlter; dispid 103;
end;
حيث تحتوي على خاصيتين بنفس الاسم، و هو ID (إحداهما للقراءة فقط و الأخرى للكتابة فقط). قم بتغيير اسمي الخاصيتين للتفريق بينهما، مثلاً غير اسم الخاصية الأولى التي للكتابة فقط من ID إلى IDw و غير اسم الخاصية الثانية التي للقراءة فقط من ID إلى IDr. ثم احفظ الوحدة بعد إجراء التعديل.
سؤال: كيف أفتح الوحدة SQLDMO_TLB.pas لتعديلها؟ - اكتب اسمها (SQLDMO_TLB) دون الامتداد pas ضمن عبارة uses الموجودة في أعلى الوحدة البرمجية التابعة لبرنامجك:
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, DNSDGen, SQLDMO_TLB;
ثم اضغط المفتاح Ctrl و انقر على الاسم SQLDMO_TLB. و عند فتحها ايحث عن الاسم (DistributionArticle2Disp_) لاحظ أنه يبدأ بشرطة سفلية من اليسار و ليس من اليمين، ثم قم بالتعديل الذي ذكرناه سابقاً و لا تنس الحفظ.
بعد ذلك يمكنك استعمال الوحدة SQLDMO_TLB.pas في أي مشروع بإضافة الاسم SQLDMO_TLB إلى عبارة uses.
مثال توضيحي:
1. في البداية يجب إنشاء كائن يمثل الـ SQL Server نفسه و تأسيس اتصال به:
- var
- MyServer: SQLDMO_TLB.SQLServer2;
- // ...
- // ...
- MyServer := CoSQLServer2.Create;
- MyServer.LoginSecure := True;
- MyServer.Connect('(LOCAL)', EmptyParam, EmptyParam);
الآن يمكننا استعمال الكائن MyServer للوصول إلى SQL Server، فمثلاً السطر التالي يعطينا عدد قواعد البيانات المسجلة في الـ Server:
- MyServer.Databases.Count
و يمكننا المرور عبر قواعد البيانات بحلقة كهذه:
- var
- Index: Integer;
- // ...
- // ...
- for Index := 1 to MyServer.Databases.Count do begin
- // ...
- // ...
- end;
لاحظ أن الحلقة تبدأ بـ 1 إلى Count (و ليس من 0 إلى Count - 1 كما هو معتاد في دلفي) و هذه هي طريقة ترقيم الكائنات في الـ ActiveX Collections.
إذا أردنا التعامل مع كائن يمثل قاعدة بيانات فإننا سنحتاج إلى تعريف متغير من النوع Database، و إذا أردنا التعامل مع كائن يمثل جدولاً فإننا سنحتاج إلى تعريف متغير من النوع Table:
- var
- ADatabase: SQLDMO_TLB.Database;
- ATable: SQLDMO_TLB.Table;
حيث يمكننا الوصول إلى أي قاعدة بيانات إما بترتيبها (رقمها) أو باسمها:
- // بالرقم - أي بالترتيب
- ADatabase := MyServer.Databases.Item(3, EmptyParam); // الوصول إلى قاعدة البيانات الثالثة - أي رقم 3
- // بالاسم
- ADatabase := MyServer.Databases.Item('MyDB', EmptyParam); // الوصول إلى قاعدة البيانات المحددة بالاسم
طبعاً بدل MyDB ستضع اسم قاعدة البيانات التي تريد الوصول إليها.
الأمر نفسه ينطبق على الجداول في إحدى قواعد البيانات:
- var
- TblIndex: Integer;
- // ...
- // ...
- for TblIndex := 1 to ADatabase.Tables.Count do begin
- ATable := ADatabase.Tables.Item(TblIndex, EmptyParam);
- //...
- //..
- end;
أيضاً يمكننا الوصول إلى الجدول برقم ترتيبه في قاعدة البيانات، أو باسمه.
أخيراً... لدينا الكود التالي الذي يبين كيفية الوصول إلى خصائص أحد الأعمدة (الحقول) في جدول:
- var
- ADatabase: SQLDMO_TLB.Database;
- ATable: SQLDMO_TLB.Table;
- AColumn: SQLDMO_TLB.Column;
- // ...
- // ...
- ADatabase := MyServer.Databases.Item('SchoolDB', EmptyParam);
- ATable := ADatabase.Tables.Item('StudentsData', EmptyParam);
- AColumn := ATable.Columns.Item(3); // العمود أو الحقل الثالث
- Label1.Caption := AColumn.Name;
- Label2.Caption := AColumn.Datatype;
- Label3.Caption := IntToStr(AColumn.Length);
- if AColumn.AllowNulls then
- Label4.Caption := 'AllowNulls = Yes'
- else
- Label4.Caption := 'AllowNulls = No';
- Label5.Caption := AColumn.DRIDefault.Text;
- if AColumn.Identity then
- Label6.Caption := 'Identity = Yes'
- else
- Label6.Caption := 'Identity = No';
و... ملاحظة أخيرة ضرورية: أغلق الاتصال بالـ Server عند الانتهاء من العمل معه:
- MyServer.Close;
نرجو الاستفادة و السلام.