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

درس ربط Ado بقواعد البيانات

بدأه طلال بلال في 25 يونيو 2009 · 8 رد · 12,198 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

1-مقدمة

ADO كلمة تعني Activex Data Objects وهو نظام اتصال بقواعد بيانات تعتبر منهجية للبرمجة في win 32 ل ميكرو سوفت وانا اجد صوبة في ايجاد الفرق بين كل النظم ADO OLE DB OLAP ODBC

اما dbGo عملت خصيصا لكي نستطيع التنقل الي الدلفي دوت نت vcl بسهولة .

وهي نوع من الواجهات التي تمثل برممجيات OLE DB والذي يعتبر الوصيلة التي ابتكرتها شركة Microsoft للوصول الى قواعد اليانات المختلفة وذلك عن طريق النوع COM (Component Object Model)

وODBC (Open DataBase Connectivity) و الذي يسمح لنا بالاتصال مع مع قواعد البيانات العلائقية

وايضا OLE DB الذي يتصل بجل الانواع حتي الغير علاءقية

اما ADO.net فلا يختلف كثيرا على ado حيث هو مجموعة من الفيئات للتعامل مع مختلف قواعد البيانات

ويتعامل ايضا مع

  1. مخازن قواعد البيانات الغير متناسقة مثال الملفات النصية TEXT FILES
  2. مخازن قواعد البيانات المتناسقة الغير متدرجة CSV- EXCEL FILES
  3. XML FILES المخازن الهرمية
  4. المخازن المرتبطة SQL-SERVER / ACCESS /ORACLE

ADO يتعامل مع بيئة المتصل فقط لما ADO.net فهو يتعامل مع الاثنين

2-ADO/BDE

قبل ان نبدأ بشرح ربط Ado مع قواعد البيانات . دعونا نتعرف على على مكونات dbGo ومايقابلها في BDE

مكون dbGo ---------- الوصف --------------- المكون المكافئ في BDE

ADOConnection ----------- وصلة الى قاعدة البيانات --------- . المكافئ له --------- database

ADOCommand ----------- ينفذ امر SQL --------- . المكافئ له --------- لآيوجد مكافئ

ADODataSe ----------- جميع الاهداف المشتقة من --------- . المكافئ له ------- لايوجد مكافئ

ADOTable --------- يغلف جدولاً --------- . المكافئ له ----------- Table

ADOQuery ---------- يغلف SQL Select ---------- . المكافئ له ------------ Query

ADOStoredProc ------------ يغلف اجرائية مخزنة ------------- . المكافئ له ------- StoredProc

RDSConnection ------------- وصلةRemote Data Service ------ . المكافئ له ------ لايوجد مكافئ

يتم تحقيق المكونات الاربعة لمجموعة البيانات (ADODataSe , ADOTable ADOQuery, ADOStoredProc,) بشكل كامل على الاغلب بواسطة الصنف الاساس لها TCustomADODataSet . حيث يوفر هذا المكون الجزء الاعظم من وظائفها .

3-انواع الاتصلات مع قواعد البيانات

1-ADO مع ACCESS

ربط ADO مع ACCESS

نفتح مشروع جديد , نضيف DataModule

من dbGo نضيف ADOConnection , وADOTable , ومن Data Access نضيف TDataAccess

نضغظ ديل كليك على ADOConnectin . يظهر لدينا خيارين للربط مع قاعدة البيانات كما في الصورة , سنقوم بدراسة الخيارين مع العلم ان قاعدة البيانات محمية بكلمة مرور

post-169385-1245923080_thumb.jpg

- نبدأ بالخيار الأول ,

نضغط على BUILD تظهر امامنا صفحة provider

نختارمنها Microsoft Jet 4.0 OLE DB Provider ثم next

post-169385-1245923273_thumb.jpg

تظهر عندنا صفحة Connection نضغط على المفتاح لتحديد مسار قاعدت البيانات .

post-169385-1245923507_thumb.jpg

هذا يكفي لو لم يكن لدينا كلمة سر . اما نحن هنا لدينا كلمة سر

نحدد الصفحة ALL ثم نذهب الى Jet OLEDB : Database Password نحددها ثم نضغظ على Edit Value أو نضغط عليها مرتتين .

تظهر امامنا مربع حوار Edit Property Value نضع كلمة المرور فية . ثن موافق

ثم نجرب اختبار الاتصال بقاعدت البيانات

post-169385-1245923723_thumb.jpg

post-169385-1245923776_thumb.jpg

تم تعديل هذه المشاركة بواسطة زكيري عبد العالي في 28 يونيو 2009 في 16:03

1
#2

الاتصال عن طريق الخيار الثاني Use Data Link File

للاتصال بقاعدة البيانات عن طريق هذا الخيار . يحب ان نضيف ملف TEXT من

File - New -Ather- Ather File – TEXT, كما في الصورة

post-169385-1245967416_thumb.jpg

ثم نقوم بحفظة بلاحقة UDL في مجلد البرنامج

post-169385-1245967526_thumb.jpg

post-169385-1245967621_thumb.jpg

ثم نفتحه ونقوم بنفس الخطوات السابقة تماما. بعد ذلك نذهب الى ADOConnectio نضغط عليها مرتين . ونحدد الخيار الاول الذي هو Use Data Link File

من Browse نحدد مسار الملف كما في الصورة

post-169385-1245971355_thumb.jpg

بقي في كلا الحالتين اضافة الجداول الى datamodule وهي طريقة واحدة

اولا من ADOConnection نغير الخاصية Login Prompt الى False

نحدد الجدول , ومن ADOCOnnection نحدد خيار الاتصال . والذي سيكون ADOConnection 1

ثم نذهب الى الخاصية Table Name ونحدد الجدول الذي نريد ربطة

post-169385-1245971555_thumb.jpg

ثم نحدد Datasource . ثم نذهب الى الخاصية DataSet ونربطها مع الجدول المربوط كما في الصورة

post-169385-1245971683_thumb.jpg

الاتصال مع Accessبرمجيا .

سوف نحتاج الى الاتصال مع Accessبرمجيا .أكثر من الطريقة الاولى . لآنه عند الاتصال بالطريقة الاولى وتغيير مسار قاعدت البيانات . سيفشل الاتصال مع قاعدة البيانات ويعطينا رسالة خطأ عن مسارها

كيف تم الاتصال برمجيا . أعتقد انها كثيرة المواضيع التي غطت هذا الاتصال وفي منتدانا تحديدا .

ال Data Module لها حدثان ON Create , و ON Destory

ما علينا هو تحديد مسار قاعدة البيانات في الحدث ON Create

  1.  
  2. uses ADODB,DB;
  3. public { Public declarations }
  4. MyConn:TADOConnection;
  5.  
  6. procedure TDataModule2.DataModuleCreate(Sender: TObject);
  7. BEGIN
  8. MyConn:=TADOConnection.Create(nil);
  9. TRY
  10. MyConn.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +Getcurrentdir +
  11. 'ARABTEAM.mdb;'+'Jet OLEDB:Database Password=arabteam';
  12. MyConn.Open;
  13. FINALLY
  14. END;
  15.  
  16.  

وفي الحدث ON Destory نغلق الجدول

  1. procedure TDataModule2.DataModuleDestroy(Sender: TObject);
  2. BEGIN
  3. IF MyConn <> nil THEN
  4. BEGIN
  5. ADOTABLE1.Close;
  6. MyConn.Close;
  7. MyConn.Free;
  8. END;
  9.  
  10.  

ArabTeam.rar

تم تعديل هذه المشاركة بواسطة زكيري عبد العالي في 26 يونيو 2009 في 10:06

1
#3

ADO With SQL Server

لايختلف الاتصال ب SQL SERVER كثيرا عن ACCESS

نبدأ بفتح مشروع جديد . نضيف ADOConnection وننقر عليها مرتين . تظهر لنا كما في المرحلة السابقة واجهة للاتصال .

نختار الخيار الثاني Build

من Provider نختار : Mecrosoft OLE DB Provider SQL Server

post-169385-1246840722_thumb.jpg

ثم Next تظهر لدينا ال Connection

الخيار الاول الذي يطالب بوضع اسم السيرفر نضع فية القيمة 0

الخيار الثاني نحدد اسم مستخدم قاعدة البيانات . هل هو مستخدم الوينوز ام حساب اخر

الخيار الثالث نختار قاعدة البيانات

ثم نختبر الاتصال .

post-169385-1246840807_thumb.jpg

الاتصال برمجيا مع SQL SERVER

type
  TDM = class(TDataModule)
	procedure DataModuleCreate(Sender: TObject);
	procedure DataModuleDestroy(Sender: TObject);
  private
	  Function connect():Boolean;
	Function deconnect():boolean;
	const c_conn =  'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=TIB;Data Source=TALALBE-PC';
	{ Private declarations }
  public
	  AdoConn: TADOConnection;
	{ Public declarations }
  end;

 Function Tdm.connect():Boolean;
BEGIN
		adoconn:= TADOConnection.Create(nil);
	  TRY
	   adoconn.ConnectionString:=C_CONN;
		adoconn.LoginPrompt:=false;
		adoconn.Open();
		Result:= true;
	  EXCEPT ON E:Exception DO
		Result:= false;
	  END;
END;

procedure TDM.DataModuleCreate(Sender: TObject);
begin

   IF NOT connect() THEN
	 BEGIN
		ShowMessage('فشل الاتصال مع قاعدة البيانات');
		Application.Terminate;
	 END;
end;

procedure TDM.DataModuleDestroy(Sender: TObject);
begin
   TRY
	 deconnect();
	adoconn.Free;
	EXCEPT END;
end;

Function TDM.deconnect():boolean;
BEGIN
	  TRY
		adoconn.Close();
		Result:= true;
	  Except
		Result:= false;
	  END;
END;
end.

في المرفق مثال لكلا الحالتين مع ادخال البيانات الى القاعدة عن طريق Table

وفي المرحلة التالية ستكون التعامل مع ADO QUERY و ADO STORE PROC

___________sql_______.rar

arabteam.rar

تم تعديل هذه المشاركة بواسطة طلال بلال في 6 يوليو 2009 في 04:02

1
#4

السلام عليكــم ورحمـة الله وبركاتــه ،،

ADO QUERY

سنحتاج كثيرا الى استخدام ADOQUERY بدلا من ADO TABLE وخصوصا في البرامج المتعددة المستخدمين التي تعمل على الشبكة . لآن DO QUERY اسرع بكثير لآنها تقوم بارسال استعلام الى قاعدة البيانات ومعالجة الامر ضمن قاعدة البيانات وتعود بالنتيجة فقط . هذا مايجعلها اسرع وافضل من ADOTABLE .

أولا : ادخال البيانات

نقوم بتعريف بارمترات بعدد حقول الجدول الذي نريد ادخال البيانات الية

procedure TForm1.Button1Click(Sender: TObject);
begin
 with ADOQuery1 do
	begin

	 Close;
	 SQL.Clear;

	 SQL.Add('INSERT INTO Table_1');
	 SQL.Add('( id,Name,not_)');
	 SQL.Add(' Values');
	 SQL.Add('(:P1,:P2,:P3)');
	 Prepared;
	 Parameters.ParamByName('P1').Value := Edit1.Text;
	 Parameters.ParamByName('P2').Value := Edit2.Text;
	 Parameters.ParamByName('P3').Value := Edit3.Text;

	 ExecSQL;

	   fedit;
		 con;

   end;
end;

ثانيا: البحث

procedure TForm1.SpeedButton5Click(Sender: TObject);
var
 InputString: string;
begin
 InputString:= InputBox('بحث', 'فضلا ادخل رقم العميل', '');
 if InputString = '' then Exit;

with ADOQuery1 do
begin
 Close;
 SQL.Clear;
 SQL.Add('SELECT * FROM Table_1 WHERE id = :P1');
 Prepared;
 Parameters.ParamByName('P1').Value := InputString;
 Open;
End;

if ADOQuery1.RecordCount = 0 then
begin
ShowMessage('لا يوجد عميل بهذا الرقم');
exit;
end else
 begin
 Edit1.Text := ADOQuery1.Fields.Fields[0].AsString;
 Edit2.Text := ADOQuery1.Fields.Fields[1].AsString;
 Edit3.Text := ADOQuery1.Fields.Fields[2].AsString;

end;


end;

ثالثا : التعديل

procedure TForm1.SpeedButton6Click(Sender: TObject);
begin
con;
end;

procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
 with ADOQuery1 do
 begin
   Close;
   SQL.Clear;
   SQL.Add('UPDATE Table_1');
   SQL.Add(' SET ');
   SQL.Add('id = :P1,id = :P2,name =:P3,not_ ');
   SQL.Add(' WHERE id = :PWHERE');
   Prepared;
   Parameters.ParamByName('P1').Value := Edit1.Text;
   Parameters.ParamByName('P2').Value := Edit2.Text;
   Parameters.ParamByName('P3').Value := Edit3.Text;


   Parameters.ParamByName('PWHERE').Value := Edit1.Text; // For WHERE
   ExecSQL
End;

end;

رابعا : الحذف

procedure TForm1.SpeedButton8Click(Sender: TObject);
begin
  if MessageDlg('سيتم حذف السجل ',mtConfirmation,[mbYes,mbno],0)=mryes then
  begin

 with ADOQuery1 do
begin
 Close;
 SQL.Clear;
 SQL.Add('DELETE FROM table_1 WHERE id = :P1');
 Prepared;
 Parameters.ParamByName('P1').Value := Edit1.Text;
 ExecSQL;
 Fedit;
con;

  end
  end
  else
  begin

con;
 end;

end;

end.

اما الاجرائين Fedit فهو لحذف البيانات الموجودة في EDIT

CON: هو من اجل اعادة الاتصال بقاعدة البيانات

 procedure con;
begin
	form1. adoquery1.SQL.Clear;
form1.adoquery1.SQL.add('select*from table_1');
form1.adoquery1.Open;
form1.datasource1.DataSet:=form1.adoquery1;

end;
procedure fedit;
begin
form1.Edit1.Text :='';
form1.Edit2.Text :='';
form1.Edit3.Text :='';

end;

ADOQuery.rar

تم تعديل هذه المشاركة بواسطة طلال بلال في 6 يوليو 2009 في 20:05

1
#5

بقلم الاخ undertaker_2

تعبت من البحث وغالبا مااجد الكود ولكن غير كامل فصممت البحث وعدم اليائس واخيرا تمكنت من الاتصال بقاعدة البيانات (Access) برمجيااااااٌ من دون (Wizerd) لنبدأ بسرعة

اولا: انشاء الاتصال

نفتح مشروع جديد ونضيف 2 Button الاولى اسمها (BtnOpenCon) والثانية اسمها (BtnCloseCon) ثم نذهب الى الكود وناتي عند المكتبات (uses) ونضيف المكتبيتين (ADODB,DB) أي هكذا

uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs,ADODB,DB, StdCtrls;

ثم ناتي عند var ونكون متغير من نوع (TADOConnection) أي هكذا

var
  Form1: TForm1;
  MyCon :TADOConnection;	


ثم نفتح الفورم ونضغط Double click  على 	BtnOpenCon ونكتب الكود التالي  لاحظ هنا ان ملف قاعدة البيانات موجود في القرص C  تحت اسم  db1.mdb
واذا لم يكن موجود قم بانشاء قاعدة بيانات تحت اسم db1.mdb  على القرص C

procedure TForm1. BtnOpenConClick(Sender: TObject);
begin
  MyCon :=TADOConnection.Create(nil);
  Mycon.LoginPrompt := False;
  MyCon.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' + 
                'Data Source=C:\db1.mdb;' + 
                'Mode=ReadWrite|Share Deny None;' + 
                'Persist Security Info=False';
  MyCon.Open; // فتحنا الاتصال بقاعدة البيانات
 end;

لكن ماذا لوغيرت مكان قاعدة البيانات الى المكان الموجود فيه الملف التنفذي للمشروع , هنا يأتي مهمة الدالة (GetCurrentDir) فيصبح الكود بعد التعديل هو

procedure TForm1. BtnOpenConClick(Sender: TObject);
begin
  MyCon :=TADOConnection.Create(nil);
  Mycon.LoginPrompt := True;
  MyCon.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' + // provider for Access2000
                'Data Source=' + GetCurrentDir + '\db1.mdb;' + // databasefile
                'Mode=ReadWrite|Share Deny None;' + // set to ReadWrite
                'Persist Security Info=False';
  MyCon.Open; // فتحنا الاتصال بقاعدة البيانات
 end;

نفتح مرة اخرى الفورم ونضغط Double click على BtnCloseCon ونكتب الكود التالي

procedure TForm1. BtnCloseConClick(Sender: TObject);
begin
MyCon.Close; // اغلاق  الاتصال بقاعدة البيانات
end;

تم تعديل هذه المشاركة بواسطة زكيري عبد العالي في 10 ديسمبر 2009 في 11:45

#6
size]
#7

السلام عليكــم ورحمـة الله وبركاتــهf_masterdelphm_11241d0.jpg

f_masterdelphm_11241d0.jpg

#8
اقتباس

لكن ماذا لوغيرت مكان قاعدة البيانات الى المكان الموجود فيه الملف التنفذي للمشروع , هنا يأتي مهمة الدالة (GetCurrentDir) فيصبح الكود بعد التعديل هو

 

السلام عليكم

لا يفضل إستخدام هذه الدالة وذلك لوكان التطبيق يستدعي ملفات بإستخدام إحدة أدوات Dialogs فإن المسار الخاص بالتطبيق سوف يتغير ويحدث خطأ في الإتصال بقاعدة البيانات ، ولكن إدا أستخدامنا الدالة ExtractFilePath فهي أفضل بكثير بحيث تعطينا موقع الملف التنفيذي والذي في العادة يكون مجاور لملف قاعدة البيانات بحسب طريقة المبرمج ، ومثال على هذا يمكن إستخدامها كالتالي.

ExtractFilePath(Application.exename+'My Data Beas Name');

أما إد كانت قاعدة البيانات موجودة داخل مجلد في نفس مسار الملف التنفيذي فتكتب كالتالي:-

ExtractFilePath(Application.exename+'MyDirectory\MyDataBeas Name');

 

وشكراً

تم تعديل هذه المشاركة بواسطة Salah El Deen في 19 فبراير 2013 في 01:02

من جد وجد ومن زرع حصد

#9
زكيري عبد العالي كتب:

بقلم الاخ undertaker_2

تعبت من البحث وغالبا مااجد الكود ولكن غير كامل فصممت البحث وعدم اليائس واخيرا تمكنت من الاتصال بقاعدة البيانات (Access) برمجيااااااٌ من دون (Wizerd) لنبدأ بسرعة

اولا: انشاء الاتصال

نفتح مشروع جديد ونضيف 2 Button الاولى اسمها (BtnOpenCon) والثانية اسمها (BtnCloseCon) ثم نذهب الى الكود وناتي عند المكتبات (uses) ونضيف المكتبيتين (ADODB,DB) أي هكذا

uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs,ADODB,DB, StdCtrls;
ثم ناتي عند var ونكون متغير من نوع (TADOConnection) أي هكذا

var
  Form1: TForm1;
  MyCon :TADOConnection;	


ثم نفتح الفورم ونضغط Double click  على 	BtnOpenCon ونكتب الكود التالي  لاحظ هنا ان ملف قاعدة البيانات موجود في القرص C  تحت اسم  db1.mdb
واذا لم يكن موجود قم بانشاء قاعدة بيانات تحت اسم db1.mdb  على القرص C

procedure TForm1. BtnOpenConClick(Sender: TObject);
begin
  MyCon :=TADOConnection.Create(nil);
  Mycon.LoginPrompt := False;
  MyCon.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' + 
                'Data Source=C:\db1.mdb;' + 
                'Mode=ReadWrite|Share Deny None;' + 
                'Persist Security Info=False';
  MyCon.Open; // فتحنا الاتصال بقاعدة البيانات
 end;
لكن ماذا لوغيرت مكان قاعدة البيانات الى المكان الموجود فيه الملف التنفذي للمشروع , هنا يأتي مهمة الدالة (GetCurrentDir) فيصبح الكود بعد التعديل هو

procedure TForm1. BtnOpenConClick(Sender: TObject);
begin
  MyCon :=TADOConnection.Create(nil);
  Mycon.LoginPrompt := True;
  MyCon.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' + // provider for Access2000
                'Data Source=' + GetCurrentDir + '\db1.mdb;' + // databasefile
                'Mode=ReadWrite|Share Deny None;' + // set to ReadWrite
                'Persist Security Info=False';
  MyCon.Open; // فتحنا الاتصال بقاعدة البيانات
 end;
نفتح مرة اخرى الفورم ونضغط Double click على BtnCloseCon ونكتب الكود التالي

procedure TForm1. BtnCloseConClick(Sender: TObject);
begin
MyCon.Close; // اغلاق  الاتصال بقاعدة البيانات
end;

 

مشكور أخي الكريم و جزاك الله كل خير

فأنا أيضا تعبت من البحث حتى وجدت مشاركتك حيث انني جديد تماما في عالم الدلفي :)

و لكن أرجو ان تكمل جميلك بالإجابة على هذا السؤال و هو كيف يمكن عمل إستعلام SQL من قواعد البيانات بإستخدام هذه الطريقة

كما أرجو إرفاق مثال بسيط

أكرر شكري و تقديري لك اخي أخي الكريم

تحياتي

336.jpg

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