Utilizarea întrebărilor Delphi cu ADO

Componenta TADOQuery oferă dezvoltatorilor Delphi posibilitatea de a prelua date dintr-una sau mai multe tabele dintr-o bază de date ADO folosind SQL.

Aceste instrucțiuni SQL pot fi fie instrucțiuni DDL (Data Definition Language), cum ar fi CREATE TABLE, ALTER INDEX și altele, sau pot fi instrucțiuni DML (Data Manipulation Language), cum ar fi SELECT, UPDATE și DELETE. Cea mai comună afirmație este însă instrucțiunea SELECT, care produce o vedere similară cu cea disponibilă folosind o componentă din tabel.

Notă: chiar dacă executarea comenzilor folosind componenta ADOQuery este posibilă, ADOCommandcomponenta este mai potrivită în acest scop. Cel mai adesea este utilizat pentru a executa comenzi DDL sau pentru a executa o procedură stocată (chiar dacă ar trebui să utilizațiTADOStoredProc pentru astfel de sarcini) care nu returnează un set de rezultate.

SQL utilizat într-o componentă ADOQuery trebuie să fie acceptabil pentru driverul ADO utilizat. Cu alte cuvinte, ar trebui să cunoști diferențele de scriere SQL dintre, de exemplu, MS Access și MS SQL.

Ca și atunci când lucrați cu componenta ADOTabilă, datele dintr-o bază de date sunt accesate folosind o conexiune de stocare de date stabilită de componenta ADOQuery folosindconnectionString proprietate sau printr-o componentă ADOConnection separată specificată în Conexiuneproprietate.

Pentru a crea un formular Delphi capabil să preia datele dintr-o bază de date Access cu componenta ADOQuery, trebuie doar să renunțați la toate componentele aferente de acces la date și conștiente de date și să creați o legătură așa cum este descris în capitolele anterioare ale acestui curs. Componente de acces la date: DataSource, ADOConnection împreună cu ADOQuery (în loc de ADOTable) și o componentă conștientă de date precum DBGrid este tot ce avem nevoie.
După cum am explicat deja, folosind inspectorul de obiecte setați legătura dintre aceste componente după cum urmează:

DBGrid1.DataSource = DataSource1
DataSource1.DataSet = ADOQuery1
ADOQuery1.Connection = ADOConnection1
// construiți ConnectionString
ADOConnection1.ConnectionString = ...
ADOConnection1.LoginPrompt = False

Efectuarea unei interogări SQL

Componenta TADOQuery nu are un Nume_tabelăproprietate așa cum face TADOTable. TADOQuery are o proprietate (TStrings) numită SQL care este utilizat pentru a stoca instrucțiunea SQL. Puteți seta valoarea proprietății SQL cu Inspectorul de obiect la momentul proiectării sau prin cod la runtime.

La momentul proiectării, invocați editorul de proprietăți pentru proprietatea SQL făcând clic pe butonul elipsă din Inspectorul obiectelor. Introduceți următoarea instrucțiune SQL: „SELECT * FROM Authors”.

Instrucțiunea SQL poate fi executată într-unul din două moduri, în funcție de tipul instrucțiunii. Instrucțiunile limbajului de definire a datelor sunt în general executate cu ExecSQL metodă. De exemplu, pentru a șterge o înregistrare specifică dintr-un tabel specific, puteți scrie o instrucțiune DELETE DDL și rula interogarea cu metoda ExecSQL.
Instrucțiunile (obișnuite) SQL sunt executate prin setarea TADOQuery.Active proprietatea la Adevărat sau apelând laDeschis metoda (esențial la fel). Această abordare este similară cu preluarea datelor unui tabel cu componenta TADOTable.

În timpul rulării, instrucțiunea SQL din proprietatea SQL poate fi folosită ca orice obiect StringList:

cu ADOQuery1 încep Închidere;
SQL.Clear;
SQL.Add: = 'SELECTA * DIN AUTORI' SQL.Add: = 'COMANDĂ DE DESCRIERE cu nume autor DESC' Deschis; 
Sfârșit;

Codul de mai sus, la timpul de execuție, închide setul de date, goli șirul SQL din proprietatea SQL, atribuie o nouă comandă SQL și activează setul de date apelând la metoda Open.

Rețineți că, evident, crearea unei liste persistente de obiecte de câmp pentru o componentă ADOQuery nu are sens. Data viitoare când apelați la metoda Open, SQL poate fi atât de diferit încât întregul set de nume (și tipuri) depuse se pot schimba. Desigur, nu este cazul dacă folosim ADOQuery pentru a obține rândurile dintr-o singură tabelă cu setul constant de câmpuri, iar setul rezultat depinde de partea UNDE din instrucțiunea SQL.

Interogări dinamice

Una dintre marile proprietăți ale componentelor TADOQuery este params proprietate. O interogare parametrizată este una care permite selectarea de rând / coloană flexibilă folosind un parametru în clauza WHERE a unei instrucțiuni SQL. Proprietatea Params permite parametrii înlocuitori în instrucțiunea SQL predefinită. Un parametru este un marcator de loc pentru o valoare din clauza WHERE, definită chiar înainte de deschiderea interogării. Pentru a specifica un parametru într-o interogare, utilizați un punct (:) precedând un nume de parametru.
La momentul proiectării, folosiți Inspectorul de obiecte pentru a seta proprietatea SQL după cum urmează:

ADOQuery1.SQL: = 'SELECTĂ * DIN aplicații WHERE tip =: apptype'

Când închideți fereastra editorului SQL, deschideți fereastra Parametri făcând clic pe butonul elipsă din Inspectorul obiectelor.

Parametrul din instrucțiunea SQL precedentă este denumitapptype. Putem seta valorile parametrilor din colecția Params la momentul proiectării prin intermediul casetei de dialog Parametri, dar de cele mai multe ori vom schimba parametrii la runtime. Dialogul Parametri poate fi utilizat pentru a specifica tipurile de date și valorile implicite ale parametrilor utilizați într-o interogare.

În timpul rulării, parametrii pot fi schimbați și interogarea reexecutată pentru a reîmprospăta datele. Pentru a executa o interogare parametrizată, este necesar să furnizați o valoare pentru fiecare parametru înainte de executarea interogării. Pentru a modifica valoarea parametrului, folosim proprietatea Params sau metoda ParamByName. De exemplu, având în vedere instrucțiunea SQL de mai sus, la timpul de rulare am putea utiliza următorul cod:

cu ADOQuery1 încep
Închide;
SQL.Clear;
SQL.Add ('SELECT * DIN Aplicații WHERE tip =: apptype');
. ParamByName ( 'apptype') Valoare: = '' multimedia;
Deschis;
Sfârșit;

La fel ca atunci când lucrați cu componenta ADOTabilă, ADOQuery returnează un set sau înregistrări dintr-un tabel (sau două sau mai multe). Navigarea printr-un set de date se face cu același set de metode descrise în capitolul „În spatele datelor din seturi de date”.

Navigarea și editarea interogării

În general, componenta ADOQuery nu trebuie utilizată atunci când are loc editarea. Interogările bazate pe SQL sunt utilizate mai ales în scopuri de raportare. Dacă interogarea dvs. returnează un set de rezultate, uneori este posibil să editați setul de date returnat. Setul de rezultate trebuie să conțină înregistrări dintr-un singur tabel și nu trebuie să utilizeze funcții de agregare SQL. Editarea unui set de date returnat de ADOQuery este aceeași cu editarea setului de date ADOTAble.

Exemplu

Pentru a vedea unele acțiuni ADOQuery, vom coda un mic exemplu. Haideți să facem o interogare care poate fi utilizată pentru a obține rândurile din diverse tabele dintr-o bază de date. Pentru a afișa lista tuturor tabelelor dintr-o bază de date, putem folosi GetTableNamesmetoda ADOConnection componentă. Numele GetTableNames din evenimentul OnCreate al formularului completează ComboBox cu numele tabelelor, iar butonul este folosit pentru a închide interogarea și pentru a-l recrea pentru a prelua înregistrările dintr-un tabel ales. () Gestionatorii de evenimente ar trebui să arate astfel:

procedura TForm1.FormCreate (Expeditor: TObject);
începe
ADOConnection1.GetTableNames (ComboBox1.Items);
Sfârșit;
procedura TForm1.Button1Click (Expeditor: TObject);
var tblname: string;
începe
dacă ComboBox1.ItemIndex, atunci Exit;
tblname: = ComboBox1.Items [ComboBox1.ItemIndex];
cu ADOQuery1 încep
Închide;
SQL.Text: = 'SELECT * FROM' + nume tbl;
Deschis;
Sfârșit;
Sfârșit;

Rețineți că toate acestea pot fi realizate folosind proprietatea ADOTable și proprietatea TableName.