Sql-cereri în delphi, delphi-sql, articole, programare - programare c, delphi, c #

1. Introducere

Componentele Delphi pentru lucrul cu bazele de date au fost create pentru a lucra cu SQL și arhitectura client / server. Când lucrați cu ele, puteți profita de caracteristicile suportului extins pentru serverele la distanță. Delphi oferă acest sprijin în două moduri. În primul rând, comenzile directe de la Delphi permit dezvoltatorului să gestioneze tabele, să stabilească limite, să șterge, să introducă și să editeze înregistrările existente. Cea de-a doua modalitate este de a folosi interogări în limba SQL unde șirul de interogare este transmis la server pentru a analiza, optimiza, executa și retransmite rezultatele.







2. Componenta TQuery

Dacă în aplicațiile dvs. veți folosi SQL, atunci cu siguranță va trebui să vă familiarizați cu componenta TQuery. Componentele TQuery și TTable sunt moștenite de la TDataset. TDataset oferă funcționalitatea necesară pentru accesarea bazelor de date. Ca atare, componentele TQuery și TTable au multe caracteristici comune. Pentru a pregăti datele pentru afișarea în componentele vizuale, se folosește același TDatasource. De asemenea, pentru a determina ce server și baza de date să accesați, trebuie să specificați numele aliasului. Acest lucru ar trebui făcut prin setarea proprietății aliasName a obiectului TQuery.

Cu toate acestea, TQuery are unele funcționalități unice. De exemplu, TQuery are o proprietate numită SQL. Proprietatea SQL este utilizată pentru a stoca interogarea SQL. Următoarele sunt etapele de bază pentru redactarea unei cereri, în care toți angajații au un salariu mai mare de 50.000 de dolari.

Creați un obiect TQuery

Setați aliasul la DatabaseName. (Acest exemplu folosește aliasul IBLOCAL asociat cu baza de date demonstrativă employee.gdb).

Tip: Selectați * din EMPLOYEE unde salariul> 50000. Faceți clic pe OK.

Selectați proprietatea Activă din inspectorul de obiecte și setați-l la TRUE.

Plasați obiectul TDatasource pe formular.

Setați proprietatea Dataset din TDatasource la Query1.

Plasați-o pe formularul TDBGrid.

Setați proprietatea Datasource la Datasource1.
Proprietatea SQL este de tip TStrings. Obiectul TStrings este o listă de șiruri de caractere și ceva care arată ca o matrice. Tipul de date TStrings are în arsenalul său comenzi pentru a adăuga linii, a le încărca dintr-un fișier text și a schimba datele cu un alt obiect TStrings. O altă componentă care utilizează TStrings este TMemo. ENTRSQL.DPR proiect demonstrativ (în teorie, ar trebui să fie amplasate pe o singură dischetă, dar la „Sfaturi pentru Delphi“ nu este furnizat - VO), utilizatorul trebuie să intre în SQL-interogare și faceți clic pe „Do It“ butonul ( „face acest lucru "). Rezultatele interogării sunt afișate într-o rețea grilă. Lista 1 arată codul butonului "Do It".
Listarea 1

procedura TForm1.BitBtn1Click (expeditor: TObject);
începe

Acest lucru ar trebui să fie suficient pentru un utilizator care cunoaște SQL. Cu toate acestea, majoritatea utilizatorilor nu cunosc această limbă. Deci, munca dvs. ca dezvoltator este de a oferi o interfață și de a crea o interogare SQL. În Delphi, puteți utiliza interogări dinamice pentru a crea o interogare SQL în zbor. Interogările dinamice permit utilizarea parametrilor. Pentru a defini un parametru, interogarea folosește un colon (:), urmat de numele parametrului. Mai jos este un exemplu de interogare SQL utilizând un parametru dinamic:

selectați * de la EMPLOYEE
unde DEPT_NO =: Dept_no

Dacă trebuie să testați sau să setați parametrul la valoarea implicită, selectați proprietatea Params a obiectului Query1. Faceți clic pe butonul ". “. Ar trebui să apară un dialog pentru setarea parametrilor. Selectați opțiunea Dept_no. Apoi, în lista derulantă a tipurilor de date, selectați Integer. Pentru a specifica o valoare implicită, introduceți valoarea dorită în câmpul de editare "Valoare".
Pentru a modifica interogarea SQL la timpul de execuție, parametrii trebuie să fie legați. Parametrii pot fi modificați, cererea poate fi repetată și datele actualizate. Pentru a edita direct valoarea parametrului, utilizați proprietatea Params sau metoda ParamByName. Proprietatea Params este o gamă de TParams. Prin urmare, pentru a obține acces la parametru, trebuie să specificați indexul acestuia. De exemplu,

Query1.params [0] .asInteger: = 900;

Proprietatea asInteger citește datele ca un tip Integer (numele vorbește de la sine). Acest lucru nu trebuie să indice că câmpul este de tip Integer. De exemplu, dacă tipul de câmp este VARCHAR (10), Delphi va converti datele. Deci, exemplul de mai sus poate fi scris astfel:

Query1.params [0] .asString: = '900';

Query1.params [0] .asString: = editare1.text;

Dacă doriți să utilizați numele parametrului în loc de numărul de index, utilizați metoda ParamByName. Această metodă returnează un obiect TParam cu numele specificat. De exemplu:

Interogare1.ParamByName ('DEPT_NO') .asInteger: = 900;


Lista 2 arată codul exemplar complet.

procedura TForm1.BitBtn1Click (expeditor: TObject);
începe


Acordați atenție procedurii care pregătește mai întâi solicitarea. Când sunați la pregătire, Delphi trimite o solicitare SQL către serverul de la distanță. Serverul analizează și optimizează interogarea. Avantajul unei astfel de pregătiri de interogare este analiza preliminară și optimizarea acesteia. O alternativă aici este pregătirea cererii de către server de fiecare dată când este executată. Odată ce cererea este pregătită, parametrii noi necesari sunt înlocuiți și interogarea este executată.

În exemplul precedent, utilizatorul putea să introducă numărul departamentului, iar după terminarea interogării, a fost afișată lista angajaților acestui departament. Și cum să utilizați tabelul DEPARTMENT, care permite utilizatorului să navigheze ușor între utilizatori și departamente?

Notă: Următorul exemplu utilizează un TTable numit Table1. Pentru tabelul1, numele bazei de date IBLOCAL, denumirea tabelului este DEPARTAMENT. TDatasource DataSource2 este asociat cu Table1. Tabelul este de asemenea activ și afișează intrări în TDBGrid.

Modul de conectare a TQuery la TTable este via TDatasource. Există două modalități principale de a face acest lucru. Mai întâi, plasați codul în manipulatorul de evenimente OnDataChange al TDatasource. De exemplu, listarea 3 demonstrează această tehnică.







procedura TForm1.DataSource2DataChange (expeditor: TObject; câmp: TField);
începe

Query1.ParamByName ('Dept_no') .asInteger: = Table1Dept_No.asInteger;

Pe e. EDatabaseError nu

messageDlg (de exemplu mesajul mtError, [mbOK], 0);

Tehnica care utilizează OnDataChange este foarte flexibilă, dar există o modalitate chiar mai ușoară de a conecta interogarea la masă. Componenta TQuery are proprietatea Datasource. Prin definirea TDatasource pentru proprietatea Datasource, obiectul TQuery compară numele parametrilor din interogarea SQL cu numele câmpurilor din TDatasource. În cazul denumirilor comune, acești parametri sunt completați automat. Acest lucru permite dezvoltatorului să evite scrierea codului afișat în Lista 3 (*** de mai sus ***).

De fapt, tehnica de utilizare a Datasource nu necesită codificare suplimentară. Pentru a activa interogarea în tabelul DEPT_NO, urmați pașii din listare 4.

Listarea 4 - Legarea TQuery la TTable prin proprietatea Datasource

Selectați Query1 cu proprietatea SQL și tastați:

selectați * de la EMPLOYEE
unde DEPT_NO =: dept_no

Selectați proprietatea Datasource și atribuiți sursa de date asociată cu Table1 (Datasource2 în exemplul nostru)
Selectați proprietatea Activă și setați-o la Adevărat

Acest lucru este posibil dacă doriți să creați acest tip de relație. Cu toate acestea, există anumite restricții privind interogările parametrizate. Parametrii sunt limitați de valori. De exemplu, nu puteți utiliza un parametru numit Coloană sau Tabel. Pentru a crea o interogare care a schimbat dinamic numele tabelului, ați putea folosi tehnica de concatenare a șirului. O altă tehnică este de a folosi comanda Format.

Comanda Format înlocuiește parametrii de formatare (% s,.,% N, etc.) cu valorile trecute. De exemplu,

Format ("Selectați * din% s". ['EMPLOYEE'])

Rezultatul comenzii de mai sus este 'Select * from EMPLOYEE'. Funcția înlocuiește literalmente parametrii de formatare cu valorile matricei. Când utilizați mai multe opțiuni de formatare, înlocuirea este de la stânga la dreapta. De exemplu,

tblName: = 'EMPLOYEE';
fldName: = 'EMP_ID';
fldValue: = 3;
Format ('Selectați * din% s unde% s =.'. [TblName, fldName, fldValue])


Rezultatul comenzii format este 'Select * from EMPLOYEE unde EMP_ID = 3'. O astfel de funcționalitate oferă o flexibilitate extremă în execuția dinamică a unei interogări. Exemplul de mai jos din listare 5 vă permite să afișați câmpul salariului în rezultate. Pentru câmpul de salarizare, utilizatorul poate specifica criterii.

Lista 5 - Folosind comanda Format pentru a crea o interogare SQL

începe
<Создание каркаса запроса>
sqlString: = 'Selectați EMP_NO% s de la angajat unde SALARY% s';

În acest exemplu, folosim proprietățile Clear și Add SQL. Deoarece cererea „pregătit“ pentru acces la server, și nu există nici o garanție că noua cerere va utiliza aceleași tabele și coloane, Delphi, de fiecare dată când schimbați proprietatea SQL, efectuează o operațiune inversă a „preparat“ (unprepare). Dacă TQuery nu a fost pregătit (adică, proprietatea Prepared este setată la False), Delphi o pregătește automat pentru fiecare execuție. Prin urmare, în cazul nostru, chiar dacă a fost apelată metoda Prepare, aplicația de la aceasta nu va fi deloc utilă.

Deschideți împotriva programului ExecSQL

În exemplele anterioare, TQuerie a efectuat Select-requests. Delphi consideră rezultatele interogării Select ca set de date, cum ar fi un tabel. Aceasta este o singură clasă de interogări SQL valide. De exemplu, comanda Actualizare actualizează conținutul înregistrării, dar nu returnează o înregistrare sau nicio valoare. Dacă doriți să utilizați o interogare care nu returnează un set de date, utilizați ExecSQL în loc de Open. ExecSQL transmite cererea de execuție către server. În general, dacă așteptați să primiți date din interogare, utilizați Open. În caz contrar, puteți utiliza ExecSQL, deși utilizarea lui cu Select nu va fi constructivă. Lista 6 conține codul care explică exemplul.

procedura TForm1.BitBtnClick (expeditor: TObject)
începe
Query1.Close;
Query1.Clear;
Query1.SQL.Add ('Update SALARY from EMPLOYEE' +
"în cazul în care salariul<:salary values (SALARY*(1+:raise)' );
Query1.paramByName ("salariu") .asString: = edit1.text;
Query1.paramByName ('creștere') .asString: = edit2.text;
încerca
Query1.ExecSQL;
cu excepția
pe e: EDatabaseError nu
messageDlg (de exemplu mesajul mtError, [mbOK], 0);
se încheie;
se încheie;

Toate exemplele de mai sus presupun utilizarea interogărilor în aplicațiile dvs. Acestea pot da un motiv solid pentru începerea utilizării în aplicațiile TQuery. Cu toate acestea, nu puteți anticipa sfârșitul utilizării SQL în aplicațiile dvs. Serverele tipice vă pot oferi alte caracteristici, cum ar fi procedurile și tranzacțiile stocate. Următoarele două secțiuni oferă o prezentare generală a acestor instrumente.

3. Componenta TStoredProc

O procedură stocată este o listă de comenzi (SQL sau un anumit server) stocate și executate pe partea serverului. Procedurile stocate nu au diferențe conceptuale cu alte tipuri de proceduri. TStoredProc este moștenit de la TDataset, deci are multe caracteristici comune cu TTable și TQuery. O asemănare remarcabilă cu TQuery. Deoarece procedurile stocate nu necesită valori returnate, aceleași reguli se aplică atât metodelor ExecProc, cât și metodelor Open. Fiecare server implementează operațiile procedurilor stocate cu mici diferențe. De exemplu, dacă utilizați Interbase ca server, procedurile stocate sunt executate ca cereri de selecție. De exemplu, pentru a examina rezultatele unei proceduri stocate, ORG_CHART, în baza de date demonstrativă EMPLOYEE, utilizați următoarea interogare SQL:

Selectați * din ORG_CHART

Când lucrați cu alte servere, de exemplu, Sybase, puteți utiliza componenta TStoredProc. Această componentă are proprietăți pentru nume de baze de date și o procedură stocată. Dacă procedura necesită introducerea anumitor parametri, utilizați proprietatea Params pentru a le introduce.
4.Baza de date TD

Componenta TDatabase oferă funcționalități care lipsesc de la TQuery și TStoredProc. În special, TDatabase vă permite să creați aliasuri BDE locale, deci aplicația nu are nevoie de alias-urile conținute în fișierul de configurare BDE. Acest alias local din aplicație poate beneficia de toate TTable, TQuery și TStoredProc disponibile. TDatabase permite de asemenea dezvoltatorului personalizarea procesului de conectare, suprimarea dialogului de introducere a numelui de utilizator și a parolei sau completarea parametrilor necesari. Și, în cele din urmă, cel mai important, TDatabase poate furniza o singură conexiune de bază de date, rezumând toate operațiile cu baza de date printr-o singură componentă. Acest lucru permite controalelor să funcționeze cu baza de date pentru a putea gestiona tranzacțiile.

Tranzacția poate fi considerată transmiterea unui pachet de informații. Un exemplu clasic al unei tranzacții este transferul de bani într-un cont bancar. Tranzacția ar trebui să cuprindă operațiunea de depunere a sumei într-un cont nou și eliminarea aceleiași sume din contul curent. Dacă unul dintre acești pași nu este executat dintr-un anumit motiv, tranzacția este de asemenea considerată nerealizată. În cazul unei astfel de erori, serverul SQL permite executarea unei comenzi răsturnate, fără a efectua modificări în baza de date. Gestionarea tranzacțiilor depinde de componenta TDatabase. Întrucât tranzacția constă, de obicei, din mai multe cereri, trebuie să marcați începutul tranzacției și sfârșitul acesteia. Pentru a evidenția începutul tranzacției, utilizați TDatabase.BeginTransaction. Imediat ce tranzacția începe să fie executată, toate comenzile executabile înainte de apelul TDatabase.Commit sau TDatabase.Rollback sunt transferate în modul temporar. Când apelați comanda, toate datele modificate sunt trimise la server. Când apelați Revocare, toate modificările devin nevalide. Lista de mai jos 7 arată un exemplu în care se utilizează un tabel numit ACCOUNTS. Procedura afișată încearcă să transfere suma de la un cont la altul.

procedura TForm1.BitBtn1Click (expeditor: TObject);
<ПРИМЕЧАНИЕ: Поле BALANCE у ACCOUNTS имеет триггер, проверяющий
Situația în care suma deductibilă depășește BALANȚA. Dacă da, UPDATE
va fi anulată>
începe
încerca
database1.StartTransaction;
query1.SQL.Clear;
<Вычитаем сумму из выбранного счета>
query1.SQL.Add (Format ('update ACCOUNTS' +
'set BALANCE = BALANCE -% s)' +
'unde ACCT_NUM =% s'.
[Edit1.text,
Table1Acct_Num.asString]));
query1.ExecSQL;
query1.SQL.Clear;
<Добавляем сумму к выбранному счету>
query1.SQL.Add (Format ('update ACCOUNTS' +
'setați BALANCE = BALANCE +% s' +
'unde ACCT_NUM =% s'.
[Edit1.text,
Table2Acct_Num.asString]));
query1.ExecSQL;
database1.Commit;
table1.Refresh;
table2.Refresh;
cu excepția
întoarceți tranzacția înapoi>
Unu: EDatabaseError nu
începe
messageDlg (de exemplu mesajul mtError, [mbOK], 0);
database1.rollback;
ieșire;
se încheie;
Unul: Excepția face
începe







Articole similare

Trimiteți-le prietenilor: