http://forum.niksalehi.com/showthread.php?t=25360
پايگاه داده ها در دلفي
ارتباطات در پايگاه داده ها
1 . ارتباط يك به يك : بدين مفهوم است كه يك جدول داراي ركورد متناظر در جدول ديگر است .
مثال ) شخص و مشخصات بيمه :
به ازاي هر شخص تنها يك مشخصه بيمه وجود دارد و بر عكس . در جدول , زماني مي تواند اين ارتباط را شامل شود كه فيلد هاي كليد اصلي در دو جدول متناظر و هم تعداد باشند و يا هر Index اي كه ارتباط از طريق آن صورت مي گيرد .
نكته :در هر DBMS ارتباط بين دو فيلد در جدول , زماني قابل شكل گيري است كه نوع دو فيلد يكسان باشد .
2 . ارتباط يك به چند : اين ارتباط بين دو جدول بدين مفهوم است كه به ازاي هر ركورد در جدول اصلي , هر ركورد در جدول Detail وجود خواهد داشت . اين ارتباط ما بين دو جدول زماني قابل ايجاد است كه تعداد فيلد كليد اصلي در جدول Detail (Lesson ) بيشتر از فيلد هاي كليد اصلي Master ( Student ) باشد .
مثال ) به ازاي هر دانشجو در جدول Student , n درس در جدول Lesson وجود دارد .
نكته :به ازاي انتخاب هر ركورد در جدول Master , ركورد هاي مربوط در جدول Detail نمايش داده مي شود كه اين سرعت عمل در تعداد ركورد هاي بالا محسوس تر است . اگر بخواهيم اين عمل را بدون ارتباط توسط خودمان انجام دهيم بسيار كند و طاقت فرسا است .
نكته : با وجود ارتباط , DBMS از قبول داده هاي غير مجاز جدول Detail جلوگيري مي كند . براي مثال در صورتي كه بخواهيم درسي را كه براي دانشجويي كه وجود ندارد انتخاب كنيم پيغامي خطا مبني بر ورود داده غير مجاز به ما مي دهد .
3 . ارتباط n به n : ارتباط بين دو جدول زماني پياده سازي مي شود كه به ازاي هر ركورد در يك جدول , n ركورد در جدول ديگر و به ازاي هر ركورد در جدول دوم , n ركورد در جدول اول وجود داشته باشد . مانند ارتباط بين دو جدول Student و Teacher .
براي اينكه بتوانيم بين دو جدول ارتباط n به m ايجاد كنيم مي بايست از جدول سومي به منظور ايجاد ارتباط استفاده مي كنيم كه جدول سوم حاوي حداقل فيلد هاي كليد اصلي دو جدول ديگر است .
كليد اصلي در جدول :
كليد اصلي در يك جدول فيلد يا فيلد هايي است كه داراي دو شرط زير هستند :
1)منحصر به فرد هستند .
2) تهي (Null ) نباشد .
كليد خارجي در جدول :
كليد خارجي در يك جدول عبارت است از فيلد يا فيلد هايي كه در جدول ديگر به عنوان كليد اصلي وجود داشته باشد . براي مثال در دو جدول student و Lesson , Std-id در جدول ديگر (Lesson ) به عنوان كليد خارجي محسوب مي شود .
نحوه عمليات پايگاه داده ها در نرم افزار دلفي :
براي ارتباط با هر DBMS در دلفي مي توانيم از صفحات كنترل ADO , Data Access , Data Control استفاده نماييم .در هر برنامه پايگاه داده ها در دلفي به صفحه كنترل Data Control نياز داريم اما مي توانيم از بين صفحات Data Access و ADO يكي را انتخاب كنيم .
ملاك انتخاب چيست ؟
1 . قابليت با هر DBMS موجود .
2 . سرعت عمل بالاتر .
3 . ميانچي كمتر (Interface ) .
4 . عدم نياز به ابزار هاي DBMS .
صفحه كنترل ADO
1 . شي ADO Connection
توسط اين شي مي توانيم به هرگونه DBMS متصل شويم و هيچ گونه Interface ( مانند Base ConnectedOpen Data ) نياز نداريد .
نحوه ارتباط با DBMS :
1 . كليك كردن بر روي Connection String و انتخاب گزينه Use Connection String .
2 . انتخاب گزينه Build .
3 . در صورتي كه بخواهيم از DBMS , Access استفاده كنيم , گزينه Microsoftjet 400OLE DB Provider را انتخاب مي كنيم .
4 . كليد Next و فايل DB مورد نظر را انتخاب كرده و OK مي كنيم .
5 . مشخصه Connected در ADO Connection را TRUE مي كنيم .( در صورت برقراري درست ارتباط ما قادر به اين كار خواهيم بود )
نكته: سعي شود هميشه فايل DB در مسير فايل اجرايي انتخاب شود (همان جايي كه برنامه وجود دارد .
2 . شي ADO Table
توسط شي ADO Table مي توانيم به جدول موجود در DB ارتباط برقرار نماييم .
نحوه ارتباط با جدول :
1 . مشخصه Connection مربوط به ADO Table را به ADO Connection مربوطه كه به DB مورد نظر Link شده است , متصل كنيد .
2 . مشخصه TableName را به نام جدول مورد نظر تنظيم کنيد .
2 . در صورتي كه مراحل قبل درست انجام شده باشند مي بايست بتوانيم Active مربوط به ADO Table را True كنيد .
3 . شي ADO Query
توسط اين شي مي توانيم بصورت ايستا يا پويا عمليات هاي مختلف مربوط به يك پايگاه را انجام دهيم كه همان دستورات SQL مي باشند. در اين شي كافيست مشخصه هاي Connection ( همانند ADOTable ) و SQL ( دستورات SQL ) و Active ( براي باقي ماندن ارتباط و عمل انجام شده در SQL مي بايست اين مشخصه True شود .)
مثال)اطلاعات دانشجوياني را نشان دهيد كه حرف اول نام خانوادگي آنها a يا g باشد .
select * from student where stdfamily like 'a%’ or stdfamily like 'g%'
مثال)ركوردهايي از جدول Student را نشان دهيد كه نام خانوادگي آنها احمدي است .
select * from student where stdfamily = 'ahmadi ‘
مثال) ركوردهايي از جدول Student را نشان دهيد كه سن دانشجو كمتر از 25 سال است . select * from student where age<25
مثال)ركوردهايي از جدول Student را نشان دهيد كه كه سن دانشجو بين 20 و 25 است .
select * from student where age >20 and age<25
select * from student where age between 20,25
صفحه كنترل Data Access
در اين صفحه به منظور برقرار کردن ارتباط بين پايگاه داده با اشيا ، از شي DataSource استفاده مي كنيم .
شي Data Source
در اين قسمت ما بايد مشخصه Data Set آن را معادل ADO Tabel ( يا ADO Query ) قرار دهيم .
صفحه كنترل Data Control
از طريق اين صفحه مي توانيم كنترلي بر روي جدول مورد نظرمان انجام دهيم .
در مجموع نحوه تنظيم کردن ارتباط اين اشيا با جدول مورد نظر توسط دو مرحله صورت مي پذيرد :
الف . تنظيم مشخصهDataSource شی به DataSource جدول .
ب . تنظيم مشخصه DataField شی به Field مورد نظر در جدول .
1 . شي DB Grid
توسط اين شي مي توانيم اطلاعات موجود در پايگاه داده مربوط رابه صورت يك جدول مشاهده ،Insert ، Edit نماييم .
2 . شي DB Navigator
توسط اين شي مي توانيم عمل خاصي بر روي داده هاي موجود در جدول انجام دهيم .
اين عمليات عبارتند از :
1 . Refresh record : به روز رساني رکورد.
2 .Cancel record : ناديده گرفتن تغييرات .
3 .Post record : ذخيره رکورد.
4 .Edit record :ويرايش رکورد.
5 . Delete record : پاك كردن رکورد.
6 .Insert record : درج رکورد.
7 .Last record : آخرين رکورد.
8 .Next record : رکورد بعد .
9 . Previos record : رکورد قبل .
10. First record : اولين رکورد.
3 . DBText و DBMemo وDBImage
اين اشيا همانند همتاهای خود در صفحه Standard هستند . ، با اين تفاوت که با تنظيماتي که اشاره شد ، مي توان مستقيما به Field های جدول دسترسي داشت . به اين ترتيب که مي توان مقدار فيلدها را در آنها Load نمود و يا مقداری را به جدول منتقل نمود .
دسترسی به مقدار فيلدها توسط FieldByName
مي توان مقدار يک فيلد را با استفاده از اين متود بدست آورد . اين متود هنگامي مفيد است که نام فيلد مورد دستيابی را بدانيم ، اما در زمان طراحي به جدول دسترسي نداشته باشيم . برای استفاده ، بايد DataSource و نام فيلد مورد دستيابی را بداننيد و نام فيلد را به عنوان آرگومان به اين متود بفرستيد . برای دستيابي يا تغيير مقدار فيلد ، نتيجه را با استفاده از توابع تبديل نوع ، به نوع داده مورد نياز تبديل نماييد .
Tabel1 . FieldByNAme('StdId').AsString:=edit1.text ;
نحوه جستجو براي يك يك ركورد در جدول
ما مي توانيم بر اساس يك يا چند فيلد , عمل جستجو را در ركوردهاي يك جدول انجام دهيم . براي اين منظور مي توانيم از دستور Locate با شكل كلي زير استفاده كنيم .
Adotablename.locate('field name ',field value ,[option])
مفهوم Field value
بيانگر مقدار فيلدي است كه جستجو بر اساس فيلد مورد نظر , بر اساس آن مقدار انجام مي شود .
پارامتر Option
بيانگر نوع جستجو بر روي فيلد مورد نظر است كه داراي دو حالت زير مي باشد :
Option Locase Insensitive
Lopartial Key
Lopartial key بيانگر نام فيلدي است كه مي خواهيم جستجو در مبناي آن انجام شود .
Locase Insensitive زماني استفاده مي شود كه بخواهيم تمامي مقدار را براي فيلد مورد نظر وارد كنيم . براي مثال براي فيلد Stdname نامي مانند Ali مي بايست كامل وارد شود .
از عبارت Alopasia Key زماني استفاده مي كنيم كه بخواهيم با وارد نمودن يك قسمت از مقدار مورد نظر نيز اين عمل انجام شود .
مثال ) با استفاده از يك Button بعنوان Search و يك Edit box به نام E1 , ركوردي از جدول Student را نشان دهد كه شماره دانشجويي مربوط به دانشجو برابر با مقداري باشد كه در E1 وجود دارد .
ADOTable1.locate ('stdid ', E1.text ,[locaseinsensitive] )
خروجي اين دستور در صورت پيدا نمودن عنصر مقدار True و در غير اين صورت False مي باشد . ما مي توانيم طبق اين روال , در صورت پيدا نشدن ركورد مورد نظر , پيغام مناسبي را به كاربر بدهيم .
توسط دستور زير مي توانيم به مقدار يك فيلد اطلاعاتي از ركورد هاي جاري , از جدول مشخص دسترسي داشته باشيم .
ADOTable.fieldbyname( ‘ fieldname ' ).as string
as floatas integer
دستورات جستجوي گفته شده در بالا كارا نيست . بهترين روش براي جستجو و يا هر گونه عمليات پايگاه داده اي , استفاده از دستورات SQL است .براي استفاده از اين دستورات مي بايست به جاي ADO Table از شي ADO Query استفاده كنيم .
در خواست هاي پويا :
تا بحال در خواستهاي استفاده شده در دلفي از نوع درخواستهاي ايستا بوده است.ما مي توانيم در خواستها را در دلفي به گونه اي پياده سازي كنيم كه حالت پويا را بخود بگيرند.
مثال)برنامه اي بنويسيد كه در جدول طراحي بتوانيم به دنبال به دنبال ركوردهايي بگرديم كه سن آنها برابر با مقداري باشد كه در Edit1 كاربر وارد مي كند .
بر روي Search , click كرده و كد زير را تايپ مي كنيم :
ADOQuery1.active := false;
ADOQuery1.SQL.clear;
ADOQuery1.SQL.add( ' select * from student where age = '''+ Edit1.text + ''' ' )ADOQuery1.active := true ;
نحوه ارتباط 1 به n در دلفي
براي اين منظور مي بايست نخست ارتباط بين دو پايگاه داده و دو جدول را با استفاده از ابزار زير پياده سازي كنيم :
يك عدد ADO Connection ، دو عدد ADO Table ، دو عدد Data Source .
مراحل ايجاد رابطه
مشخصه Master Source جدولي را كه به عنوان جدول Detail شناخته مي شود (Lesson ) برابر با Data Source مربوط به جدول Master (Student ) قرار دهيم .
توسط مشخصه Master field ( مربوط به جدول Detail ) مي توانيم فيلد كليد خارجي را از جدول انتخاب و سپس كليد Add را فشار مي دهيم و در نهايت كليد Ok را مي زنيم .
با اين عمليات ارتباط 1 به n در دلفي پياده سازي مي شود .
در خواست هاي اتصالي (Join Query )
همانطور كه مي دانيد , مي توانيم بجاي خواستن يك درخواست از يك جدول , اطلاعات را از چند جدول در خواست كنيم . در اين حالت از مفهوم Join استفاده مي شود .
مثال ) مشخصات دانشجويان و دروس مربوط به آنها را نشان دهيد كه شماره دانشجويي آنها برابر با مقداري باشد كه در E1 وارد شده است .
If E1.text <> ' ' then
Begin
Q1.active := false ;
Q1.SQL.clear;
Q1.SQL.add ('select student.stdid , student.stdname ,
student.stdfamily , lesson.lessonid ,
Lesson.score from student , lesson where
student.stdid = lesson.stdid and
Student.stdid = ‘’’ + E1.text + ‘’’’ ) ; End
مثال) مي خواهيم به منظور تست يك سري در خواست ها و رفع اشكال آنها , بياييم بصورتيكه Query به زبان SQL را در يك Memo به نام M1 وارد نموده و سپس با زدن كليك Run Query , Query مورد نظر اجرا شده و خروجي آن مشاهده شود .
Q1.active : = false ;
Q1.SQL.clear ;
Q1.SQL.add ( M1.lines.text ) ;
Q1.active := true ;
مثال) ركوردهايي از جدول Student را كه سن آنها بين دو مقداري كه در E1 و E2 به سيستم داده مي شود .
Q1.active := false;
Q1.SQL.clear ;
Q1.SQL.add ( ' select * from student where age between ''' + E1.text + ''' and ''' + E2.text + '''' ) ;
Q1.active := true ;
روند كلي براي استفاده از اشيا Data Base در دلفي
ما مي توانيم در هر فرم به ازاي جداول و در خواست هاي مورد نياز در همان فرم اشيا را قرار دهيم . اما عيب اساسي در اين روش افزونگي بار جداول در خواستي است و نيز غير متمركز بودن داده ها بين جداول است .
بهترين روش براي نوشتن يك پروژه برنامه نويسي در دلفي برنامه مربوط به پايگاه داده استفاده از يك فرم ثابت به نام Data Module براي تمامي اشيا مربوط به پايگاه داده هاست يعني شي ADO Connection و ADO Table و ADO Query و Data Source .
پس از ساخت اين فرم , تمامي ارتباطات جداول در فرم هاي مختلف مي بايست به اشيا موجود در اين فرم ارجاع داده شود .براي مثال : در صورتيكه بخواهيم به يك شي اي به نام Table 1 در اين فرم مشترك ( Main Data ) دسترسي داشته باشيم از دستور MainData.Table1 استفاده مي كنيم .
نكته : براي ارتباط بين فرم ها در دلفي مي بايست نام Unit فرم مورد نظر در فرم جاري Uses شود . براي مثال : اگر نام Unit مربوطه به فرم MainData , MainDataU باشد , مي بايست اين نام را در فرمي كه مي خواهيم توسط آن به فرم MainData دسترسي داشته باشيم Uses كنيم .
مراحل ساخت و استفاده فرم مشترك Data Module
الف . منوي File - گزينه New .
ب . انتخاب Data Module .
در اين مرحله فرم Data Module با نام پيش فرض خود دلفي نشان داده مي شود .ما مي توانيم نام فرم نشان داده شده را براي فهم بهتر به نام MainData تبديل كنيم و نيز در هنگام ذخيره سازي آن , آنرا با نام MainDataU ذخيره كنيم .
بعد از مراحل فوق و ساخت فرم مورد نظر , مي توانيم اشيا مورد نياز براي پايگاه را در اين شي قرار دهيم .
انتقال محتويات يك جدول به يك جدول ديگر
فرض كنيد دو جدول به نام هاي T1 و T2 با فيلد هاي يكسان موجود است . به فرض فيلد هاي جدول Student كه عبارتند از Stdfamily , Stdname , Stdid مي خواهيم اطلاعات موجود در T1 را به T2 منتقل كنيم . برنامه زير را براي اين منظور مي توانيم استفاده كنيم :
Q1.Active := false ;
Q1.SQL.Cleae;
Q1.SQL.add (delete from T2);Q1.active := true ;
( Q1.execsql : = true ; )
Q1.first;
While not T1.eof do
Begin
T2.insert ;
T2.fieldbyname ( ' Stdid ' ).asstring : = T1.fieldbyname ( ' Stdid ' ).asstring ;
T2.fieldbyname ( ' Stdname ' ).asstring := T1.fieldbyname ( ' Stdname' ).asstring ;
T2.fieldbyname ( ' Stdfamily ' ).asstring := T1.fieldbyname ( ' Stdfamily ' ).asstring ;
T2.post ;
T1.next ;
End ;
نكته : براي فعال كردن SQL در Update و Insert و Delete به جاي Active := True از Execsql استفاده مي شود .
نكته : هر گاه كه اطلاعات يك جدول عوض شود براي آن كه اطلاعات واقعي آن را مشاهده كنيم مي بايست جدول را يك بار از حالت فعال خارج , سپس آن را مجددا فعال كنيم :
T2.active := false ;
T2.active := true ;
انتقال محتويات يك جدول به يك فايل دلخواه
مي خواهيم اطلاعات جدول Student را به فايل Student.txt به درايو C منتقل كنيم .براي اين منظور به صورت زير عمل مي كنيم :
Var f : textfile ;
Begin
Assignfile ( f , 'c :\ Student.txt ' )Rewrite (f);While not T1.eof doBegin
Writeln ( f , T1. filedbyname('Stdid').asstring +
+‘‘+T1.filedbyname ( 'Stdname ' ).
Asstring +t1.fieldbyname('stdfamily')
.asstring '');
t1.next;
end;
closefile (f);
انتقال محتويات يك فايل به يك جدول دلخواه
مي خواهيم اطلاعات يك فايل را كه با يك Format مشخص مي باشد وارد يك جدول نمونه نماييم . تكه برنامه زير براي اين عمل مناسب است :
Var f : textfile ;
s:string ;
Begin
Assignfile ( f , 'c : Student.txt ' ) ;
Rewrite (f);
While not eof (f ) do
Begin
Readme ( f , s ) ;
T1.insert ;
T1.filebyname ( ' Stdid ' ).asstring := copy ( s , 1,6) ;
T1.filebyname ( ' Stdname ' ).asstring := copy ( s , 1,20) ;
T1.filebyname ( ' Stdfamily ' ).asstring := copy ( s , 1,25) ;
T1.post ;
End;
Closefile ( f ) ;
End ;
برخي دستورات مقدماتي SQL
1 . Create Table : ايجاد جدول .
Create Table " Employee.db"
{
lst_name CHAR( 20 );
first _ name CHAR ( 15 ) ;
PRIMARY KEY (lst_name , first _ name )
}
2 . Drop Table : حذف جدول .
Drop Table " Employee.db "
3 . Select : بازيابي داده ها از جدول .
Select lst _ name from employeeTable
4 . Delete : حذف يک يا چند رديف از جدول .
5 . Insert : اضافه نمودن يک يا چند رديف به جدول .
6 . Order by : مرتب نمودن رديفهای بازيابی شده .
7 . Group By : ترکيب رديفها يا مقادير مشابه ستونها در يک رديف .
8 . Lower : تبديل تمامي کاراکترها در يک ستون جدول به حروف کوچک .
9 . Upper : تبديل تمامي کاراکترها در يک ستون جدول به حروف بزرگ .
10. AVG : محاسبه مقدار متوسط يک ستون .
11. MAX : محاسبه برگترين مقدار يک ستون عددی .
12.Min : محاسبه کوچکترين مقدار يک ستون عددی .
13. Sum : محسابه مجموع مقادير يک ستون عددی .
14. Count : شمارش تعداد رديفهای بازيابی شده .
15.Cast : تبديل مقدار يک ستون به نوع داده معين .