الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استعمال كائنات Sql-dmo في دلفي

بدأه najy_zl في 24 سبتمبر 2008 · 3 رد · 1,493 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم...

أعتقد أن أفضل الطرق للتعامل مع كائنات SQL Server (قواعد البيانات و الجداول و الحقول و الفهارس و غيرها) هو استعمال مكتبة الأنواع (Type Library) التي يوفرها SQL Server نفسه و المعروفة باسم Microsoft SQLDMO Object Library (حيث DMO اختصار من Data Management Objects).

لاستعمال تلك الكائنات نحتاج أولاً إلى استيراد تلك المكتبة و إنشاء وحدة برمجية (Unit) خاصة بها في دلفي. و لإنجاز ذلك نقوم بالتالي (لمرة واحدة فقط):

1. من القائمة Project نختار الأمر Import Type Library. ستظهر لنا النافذة التالية:

post-28631-1222237472_thumb.jpg

طبعاً محتويات القائمة تعتمد على البرامج و المكتبات المسجلة في النظام.

2. نبحث في القائمة عن Microsoft SQLDMO Object Library و نقوم بتحديده. سنلاحظ أن قائمة Class Names ستعرض أسماء الأصناف (Classes) التي تضمها المكتبة.

post-28631-1222237497_thumb.jpg

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 الموجودة في أعلى الوحدة البرمجية التابعة لبرنامجك:

  1. interface
  2.  
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, DNSDGen, SQLDMO_TLB;
  6.  

ثم اضغط المفتاح Ctrl و انقر على الاسم SQLDMO_TLB. و عند فتحها ايحث عن الاسم (DistributionArticle2Disp_) لاحظ أنه يبدأ بشرطة سفلية من اليسار و ليس من اليمين، ثم قم بالتعديل الذي ذكرناه سابقاً و لا تنس الحفظ.

بعد ذلك يمكنك استعمال الوحدة SQLDMO_TLB.pas في أي مشروع بإضافة الاسم SQLDMO_TLB إلى عبارة uses.

مثال توضيحي:

1. في البداية يجب إنشاء كائن يمثل الـ SQL Server نفسه و تأسيس اتصال به:

  1. var
  2. MyServer: SQLDMO_TLB.SQLServer2;
  3.  
  4. // ...
  5. // ...
  6.  
  7. MyServer := CoSQLServer2.Create;
  8. MyServer.LoginSecure := True;
  9. MyServer.Connect('(LOCAL)', EmptyParam, EmptyParam);
  10.  

الآن يمكننا استعمال الكائن MyServer للوصول إلى SQL Server، فمثلاً السطر التالي يعطينا عدد قواعد البيانات المسجلة في الـ Server:

  1. MyServer.Databases.Count
  2.  

و يمكننا المرور عبر قواعد البيانات بحلقة كهذه:

  1. var
  2. Index: Integer;
  3. // ...
  4. // ...
  5. for Index := 1 to MyServer.Databases.Count do begin
  6. // ...
  7. // ...
  8. end;
  9.  

لاحظ أن الحلقة تبدأ بـ 1 إلى Count (و ليس من 0 إلى Count - 1 كما هو معتاد في دلفي) و هذه هي طريقة ترقيم الكائنات في الـ ActiveX Collections.

إذا أردنا التعامل مع كائن يمثل قاعدة بيانات فإننا سنحتاج إلى تعريف متغير من النوع Database، و إذا أردنا التعامل مع كائن يمثل جدولاً فإننا سنحتاج إلى تعريف متغير من النوع Table:

  1. var
  2. ADatabase: SQLDMO_TLB.Database;
  3. ATable: SQLDMO_TLB.Table;
  4.  

حيث يمكننا الوصول إلى أي قاعدة بيانات إما بترتيبها (رقمها) أو باسمها:

  1. // بالرقم - أي بالترتيب
  2. ADatabase := MyServer.Databases.Item(3, EmptyParam); // الوصول إلى قاعدة البيانات الثالثة - أي رقم 3
  3.  
  4. // بالاسم
  5. ADatabase := MyServer.Databases.Item('MyDB', EmptyParam); // الوصول إلى قاعدة البيانات المحددة بالاسم
  6.  

طبعاً بدل MyDB ستضع اسم قاعدة البيانات التي تريد الوصول إليها.

الأمر نفسه ينطبق على الجداول في إحدى قواعد البيانات:

  1. var
  2. TblIndex: Integer;
  3. // ...
  4. // ...
  5.  
  6. for TblIndex := 1 to ADatabase.Tables.Count do begin
  7. ATable := ADatabase.Tables.Item(TblIndex, EmptyParam);
  8. //...
  9. //..
  10. end;
  11.  

أيضاً يمكننا الوصول إلى الجدول برقم ترتيبه في قاعدة البيانات، أو باسمه.

أخيراً... لدينا الكود التالي الذي يبين كيفية الوصول إلى خصائص أحد الأعمدة (الحقول) في جدول:

  1. var
  2. ADatabase: SQLDMO_TLB.Database;
  3. ATable: SQLDMO_TLB.Table;
  4. AColumn: SQLDMO_TLB.Column;
  5. // ...
  6. // ...
  7. ADatabase := MyServer.Databases.Item('SchoolDB', EmptyParam);
  8. ATable := ADatabase.Tables.Item('StudentsData', EmptyParam);
  9. AColumn := ATable.Columns.Item(3); // العمود أو الحقل الثالث
  10.  
  11. Label1.Caption := AColumn.Name;
  12. Label2.Caption := AColumn.Datatype;
  13. Label3.Caption := IntToStr(AColumn.Length);
  14. if AColumn.AllowNulls then
  15. Label4.Caption := 'AllowNulls = Yes'
  16. else
  17. Label4.Caption := 'AllowNulls = No';
  18. Label5.Caption := AColumn.DRIDefault.Text;
  19. if AColumn.Identity then
  20. Label6.Caption := 'Identity = Yes'
  21. else
  22. Label6.Caption := 'Identity = No';
  23.  

و... ملاحظة أخيرة ضرورية: أغلق الاتصال بالـ Server عند الانتهاء من العمل معه:

  1.  
  2. MyServer.Close;
  3.  

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#2

موضوع ممتاز ومميز جدا من شخص متميز

بارك الله فيك اخي الكريم

تحياتي

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا وانفع الناس بنا واغفر لنا وارحمنا

#3

بارك الله بك اخي ناجي, على هذا الطرح الطيب, مكتبة SQLDMO الخاصة بال SQL server هي أقوى طريقة للتحكم بكل شيئ تريده بال SQL Server, و يمكن عمل الكثير من الامور التي لا نستطيع الوصول إليها باستخدام ADO + تعليمات SQL.

موضوع مميز, و جزاك الله خيرا:)

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#4

بداية مبشرة الحمد لله

نتمنى المزيد وبارك الله فيك

Comming Soon

مواضيع مشابهة