Зертханалық жұмыс

Зертханалық жұмыс №13-14

Тақырыбы: SQL сұраныстар тілі

Мақсаты: Delphi-дің ішіне кіріктірілген SQL тілін қарастыру. Delphi ортасында мәліметтер қорында ADOQuery компоненті арқылы SQL сұраныс жасау

 

Теориялық түсініктеме

SQL сұраныстары үлкен көлемді мәліметтермен жылдам жұмыс істеуге мүмкіндік береді. SQL тілі – бұл мәліметтер қорына сұраныстар тілі. SQL-дің аудармасы Құрылымданған Сұраныстар Тілі. SQL-сұраныстардың көмегімен реляциялық мәліметтер қорын құруға және олармен жұмыс істеуге болады. Бұл тіл стандарт ретінде қабылданған, сондықтан, егер сіз мәліметтер қорымен жұмыс істегіңіз келсе, осы тілді жақсы білуіңіз керек.

SQL Америкалық ұлттық стандарттар институтымен және стандарттау бойынша халықаралық ұйыммен (ISO) анықталған.

Реляциялық мәліметтер қорының (РМҚ) не екенін еске түсірейік. РМҚ дегеніміз – бағандар ретінде мәліметтер өрістері алынған, ал әрбір жолы мәліметтер сақтайтын кесте. Әрбір кестеде жолды бірмәнді индентификациялайтын бір бірегей өріс болуы керек. Бұл кілттік өріс деп аталады. Бұл өрістер көбінесе кестелерді байланыстару үшін және әрбір жазбаның бірегейлігін қамтамасыз ету үшін қолданылады. Егер кесте байланыспаған болса да, кілттік өріс міндетті түрде болуы керек.

SQL екі типті бола алады: интерактивті және кіріктірілген (вложенные). Біріншісі – бұл жеке тіл, ол сұраныстарды өзі орындайды және бірден жұмыс нәтижесін көрсетеді. Екіншісі – бұл SQL-тіл басқа, мысалы, C++ немесе Delphi-дің ішіне кіріктірілген жағдай.

Интерактивті SQL стандарттыға анағұрлым жақын, ал кіріктірілген тілде ауытқулар мен қосымшалар көптеп кездеседі. Мысалы, стандартты SQL-де мәліметтердің екі типі ғана айрықшаланады: жолдар және сандар, бірақ кейбір өндірушілер өздерінің типтерін қосады (Data, Time, Binary және т.б.). SQL-де сандар екі типке бөлінеді: бүтін – integer (int) және бөлшек – decimal (dec). Жолдар 254 символ өлшеммен шектелген.

 

Жұмысты орындауға нұсқау

Енді мәліметтер қорына қарапайым SQL сұранысты қалай бағыттауға болатынын қарастырайық. Мысал ретінде, алдыңғы зертханалық жұмыста дайынған Телефон анықтамасынан телефон номері бойынша жазбаларды іздеу мүмкіндігін жүзеге асырайық. Мәліметтер қорына сұранысты жіберу үшін компоненттер палитрасының ADO қалташасынан ADOQuery компонентін қолданамыз. Бұл компоненттің жұмысы ADOTable кестесіне ұқсас және олардың ұқсас қасиеттері көп. ADOQuery-де де сіз тура солай қосылу жолын (ConnectionString қасиеті) таңдауыңыз немесе ADOConnection компонентімен Connection қасиеті арқылы байланыстыруыңыз керек. Сұраныстарда сүзгіні орнату мүмкіндігі (Filtered және Filter қасиеттері) де бар.

Барлық мәліметтер қорына қатынас жасау компоненттері орналасқан DataModuleUnit модулін ашыңыз. Мұнда ADOQuery компонентін қосыңыз, оның атын FindQuery деп өзгертіңіз және DataSource компонентін қосып, оның атын FindSource деп өзгертіңіз. Енді бұл компоненттерді байланыстыру керек. Ол үшін  FindSource компонентінің DataSet қасиетінде FindQuery компонентін көрсету керек.

Енді FindQuery компонентін ерекшелеңіз, оның Connection қасиетінде біздің мәліметтер қорына қосылу компонентіміз ADOConnection1-ді көрсету керек. Мұнымен компонентке сұраныстар қай қорға жіберілетінін көрсетеміз.

Енді сұраныстың өзін жазайық. Ол үшін тышқанмен екі рет SQL қасиетіне шертсеңіз, алдыңызда сұраныстар редакторы терезесі ашылады (21-сурет) .

Бұл редакторда өте қарапайым сұраныс жазылған: біз байланыс орнатқан мәліметтер қорының Анықтама кестесінің барлық жолдары мен барлық бағандарын таңдау.

SELECT *

FROM Анықтама

Әзірге біз тек сұраныс жаздық, бірақ оны әлі орындаған жоқпыз. Оны орындау үшін Active қасиетіне True мәнін орнатыңыз.

 

image

Енді негізге терезе сақталынған басты модульге өтейік. BookTable кестесінің мәліметтерін бейнелейтін DBGrid1 торын ерекшелеңіз. Сұраныс нәтижесінің кестесін көру үшін нысан инспекторына өтіп, DataSource қасиетінің мәнін DataModule1.FindSource деп өзгертіңіз.

Нәтижесіндегі алынған кестеге қараңыз. Ол TADOTable компонентімен жұмыс істеген кездегіге ұқсайды, тек әзірге сіз барлық өрістерді көріп тұрсыз (сонымен қатар BookTable компонентінде жасырған өрістерді де) және өрістерді бейнелеу бапталмаған. Түзету үшін FindQuery компонентін екі рет шертіп. Пайда болған терезеде тышқанның оң батырмасын шертіп, мәзірдің Add all fields пуктін таңдаңыз. Редактрде біздің кестенің барлық өрістері бейнелену керек. Енді BookTable компонентінің де өріс редакторын ашып, осындағы өрістердің қасиеттеріне қарап FindQuery компонентінің өріс редакторындағы өрістердің қасиеттерін өзгерт.

Барлық қасиеттерді көшіріп орнатқаннан кейін, басты терезенің торын пайдаланып нәтижені қайта көруге болады. Енді нәтиженің айырмашылығы болмау керек.

Енді тікелей SQL-сұраныс көмегімен іздеуді жүзеге асырайық. Ол үшін нәтиже бейнеленетін жаңа форма құрайық. Оны FindResultForm деп атайық. Оның келесі қасиеттерін өзгертіңіз:

§  Caption – Іздеу нәтижесі;

§  Position – poMainFormCenter (терезе басты терезенің ортасында бейнеленуі үшін);

Терезе кестені көру үшін оған мәліметтер модулін – DataModuleUnit қосу керек (File|Use Unit). Формаға DBGrid торын орналастырып Align қасиетіне alClient мәнін орнатыңыз. Торда сұраныс нәтижесін көру үшін DataSource қасиетіне DataModule1.FindSource көрсетіңіз. Енді форманы FindResultUnit атауымен сақтаңыз.

Енді негізгі формаға өтіп, Телефон арқылы іздеу үшін іздеу панеліне 22-суретте көрсетілгендей Label және Edit компоненттерін орналастыр. Енді басқан кезде іздеуге орындалатын батырма – Button қосу керек.

Осы орналастырылған компоненттердің қасиеттеріне 7 кестеде көрсетілген сәйкес мәндерді енгіз.

7 кесте

Компонент атауы

Қасиеті

Мәні

Label2

Caption

Телефон

Edit2

Name

FindTelephoneEdit

Button

Name

FindButton

Button

Caption

Іздеу

 

Іздеу батырмасының OnClіck оқиғасы үшін келесі кодты жазыңыз:

procedure TForm1.FindButtonClick(Sender: TObject);

begin

DataModule2.FindQuery.Active:=false;

DataModule2.FindQuery.SQL.Clear;

DataModule2.FindQuery.SQL.Add('SELECT *');

DataModule2.FindQuery.SQL.Add('FROM Анықтама');

DataModule2.FindQuery.SQL.Add('WHERE Телефон LIKE '''+FindTelephoneEdit.Text+'''');

DataModule2.FindQuery.Active:=true;

FindResultForm.ShowModal;

end;

 

image

Кодтың бірінші жолында сұраныс белсенді емес етеміз. Осыдан кейін SQL қасиетін мәліметтерді іздеу сұранысына толтыру керек. Бұл қасиет бізге таныс TStrings қасиетіне ие (оны TListBox, TComboBox тізімдерінің элементтерімен жұмыс істеген кезде қолданған болатынбыз).

Бірақ бұл қасиетті жаңа мәндермен толықтырмас бұрын, оны шақырудан қалған ескі сұраныстардан тазарту керек (егер пайдаланушы іздеу батырмасын басқан болса, онда ескі сұраныс болады). Тазарту үшін Clear әдісін шақырамыз. Ары қарай SQL қасиетін сұраныс мәтінімен толтырамыз. Бізге келесі сұранысты енгізу керек.

SELECT *

FROM Анықтама

WHERE Телефон LIKE '''+FindTelephoneEdit.Text+''''

Бұл жолдардың мағынасы мынадай: Телефон өрісінің мәні FindTelephoneEdit  компонентінде көрсетілген мәтінге тең Анықтама кестесінің барлық өрістерін таңдау керек.

Сұраныс мәтіні SQL қасиетіне енгізілгеннен кейін, оны орындауға болады. Ол үшін компонентті белсенді етеміз. Және де нәтижені бейнелеу үшін FindResueltForm терезесі шақырылады. Сұранысты орындау үшін көбінесе ADOQuery компонентін белсенді ету жеткілікті.

Осымен мысал дайын деп есептеуге болады. Дегенмен динамикалық сұраныстарды пайдаланудың тағы бір нұсқасын қарастырайық.

Егер ADOQuery компонентінің SQL қасиетіне сұранысты жазып, оны программа барысында өзгертпесек, мұны статикалық сұраныс деп атаймыз. Егер программа жұмысы барысында сұраныс мәтінін өзгерту керек болса, оны динамикалық сұраныс деп атаймыз.

Жазбаларды іздеу кезінде бізге сұраныстарды өзгертуге тура келеді, себебі әрбір рет әртүрлі мәндер ізделінеді. Бірақ тұтас сұраныс мәтінін өзгертудің қажеті жоқ. Сұранысқа айнымалы енгізіп, осы айнымалыны ғана өзгертіп отыру жеңіл болады. Сондықтан жобаға жоғарыда айтылғандарға сәйкес өзгерістер енгізіейік.

FindQuery компонентін ерекшелеп, SQL қасиетіне екі рет шертіңіз. Сұраныс редакторында келесі мәтінді енгізіңіз:

SELECT *

FROM Анықтама

WHERE  Телефон LIKE :Telephone

Бұл жерде де осыған дейін қолданылған сұраныс коды жазылған, тек қана FindTelephoneEdit.Text параметрінің орнына :Telephone параметрі тұр. Мұның айнымалы екенін атауының алдында көрсетілген қос нүкте білдіреді. SQL-сұраныста айнымалы төмендегідей безендіріледі:

:АйнымалыАтауы;

Сұраныс редакторының терезесін жабыңыз да, Parameters қасиетіне екі рет шертіңіз. Алдыңызда параметрлер редакторы терезесі ашылады (23-сурет). Сұраныста сипатталған параметр автоматты түрде осында орналасады. Telephone параметрін ерекшелеп, нысан инспекторынан оның қасиеттерін қараңыз.

 

image

DataType қасиетінде айнымалы типін көрсету керек. Біздің жағдайымызда телефон номері бар жол, сондықтан тізімнен ftString типін таңда. Value қасиетінде үнсіз келісім бойынша көрсетілетін мәнді беруімізге болады. Ол жерге біздің қордағы кез-келген телефон номерін көрсетіп,  FindQuery компонентін белсенді етіп көріңіз. Енді іздеу нәтижесі бейнеленуге тиіс терезені ашыңыз да, ендігі іздеу нәтижесі бейнеленіп тұрған торға қараңыз.

Ең соңында Іздеу батырмасының кодын өзгертейік. Онда сұраныс толықтай жазылған, енді тек параметр мәнін өзгерту жеткілікті. Ол үшін ескі кодты өшіріп, келесіні жазыңыз:

DataModule2.FindQuery.Active:=false;

DataModule2.FindQuery.Parameters.ParamByName('Telephone').Value:=FindTelephoneEdit.Text;

DataModule2.FindQuery.Active:=true;

FindResultForm.ShowModal;

Бірінші жолда сұраныс компонентін белсенді емес етеміз. Осыдан кейін параметр мәнін өзгерттік, ол үшін елесі құрылымды пайдаландық:

DataModule2.FindQuery.Parameters.ParamByName('Telephone').Value:=FindTelephoneEdit.Text;

Барлық параметрлер сұраныс компонентінің Parameters қасиетінде сақтаулы. Бұл қасиетте қажетті параметрді табу үшін ParamByName  әдісін қолданамыз. Бұл әдістің жалғыз параметрі ретінде біздің параметрдің атауын көрсету керек. Value қасиетінде табылған параметр үшін мән жазамыз.

Осыдан кейін сұранысты белсенді етуге болады. Мұндай динамикалық сұраныстармен жұмыс әсіресе сұраныстар үлкен болып, тек қандайда бір мәндері ғана өзгерген кезде әлдеқайда жеңіл болады.

Айнымалыны қолданған дұрыс. Бұл программа үшін де, мәліметтер қоры үшін де қолайлы. Себебі, мәліметтер қорларының серверлері жаңа сұранысты орындау алдында оны компиляциялайды, ол уақытты алады. Егер сұраныста бір сан өзгерсе де, компиляция орындалады. Ал айнымалыларды қолдану кезінде сұраныс өзгермейді, себебі, тек айнымалының мәні ғана өзгерді, сондықтан артық компиляция орындалмайды.

Осымен айнымалы арқылы сұраныс жасауды аяқтадық.

 

Тапсырма:

1.    Алдыңғы зертханалық жұмыста дайындалған Student кестесіндегі құрылымға сәйкес мәліметтер қорымен  жұмысты жоғарыдағы нұсқауға қарап жалғастыр:

ADOQuery және DataSource компоненттерін қос және тиісті қасиеттерін орнат;

§ SQL сұраныс дайында;

§ SQL сұранысы көмегімен іздеуді орналастыр;

§ SQL сұраныстарында динамикалық айнымалыны қолдануды көрсет;

§ Осы формалардың барлығын тиісті батырмалармен безендір;

§ Олардың арасындағы байланыстар нұсқаулықта көрсетілгендей орындалсын.

2.    Өз бетіңмен дайындаған Кітапханадағы кітап қоры туралы мәліметтер қорын да жоғарыдағы нұсқауды пайдаланып жетілдір және түсіндіріп бер.

 

Бақылау сұрақтары:

1.    Зертханалық жұмыста ADOQuery компоненті не үшін қолданылды?

2.    SQL тілінің типтерін ата?

3.    SQL тілінің маңызы қандай?

4.    РМҚ дегеніміз не?

5.    Динамикалық айнымалы дегеніміз не және оны қандай мақсатпен қолдандық?

 

 


Ұқсас жұмыстар

Зертханалық жұмыстарды ұйымдастыру
Физикалық зертханалық жұмыстардың міндеттері
Биологиядан зертханалық жұмыстар
Биология пәнінен зертханалық және практикалық жұмыстардың айырмашылығы
Биология сабақтарындағы оқыту технологиясы
Оқушылардың өзіндік жұмыс істеу дағдыларын қалыптастырудың педагогикалық негіздері
Биологиядан зертханалық жұмыстарды өткізу әдістемесі
Химияны оқытуда зертханалық жұмыстарды жүргізу әдістемесі
Виртуалды зертханалық жұмыстар
Зертханалық жануарларды күтіп - бағу, өсіру, көбейту