Brug af Delphi-forespørgsler med ADO

TADOQuery-komponenten leverer Delphi udviklere muligheden for at hente data fra en eller flere tabeller fra en ADO-database ved hjælp af SQL.

Disse SQL-sætninger kan enten være DDL (Data Definition Language) udsagn såsom CREATE TABLE, ALTER INDEX osv., Eller de kan være DML (Data Manipulation Language) udsagn, såsom SELECT, UPDATE og SLET. Den mest almindelige erklæring er imidlertid SELECT-sætningen, der producerer en visning, der ligner den, der er tilgængelig ved hjælp af en tabelkomponent.

Bemærk: Selvom eksekvering af kommandoer ved hjælp af ADOQuery-komponenten er mulig, er ADOCommandkomponent er mere passende til dette formål. Det bruges oftest til at udføre DDL-kommandoer eller til at udføre en gemt procedure (selvom du skulle brugeTADOStoredProc for sådanne opgaver) der ikke returnerer et resultatsæt.

Den SQL, der bruges i en ADOQuery-komponent, skal være acceptabel for den ADO-driver, der er i brug. Med andre ord skal du være bekendt med SQL-skriveforskelle mellem for eksempel MS Access og MS SQL.

instagram viewer

Som når man arbejder med den ADOTable-komponent, får man adgang til dataene i en database ved hjælp af en datalagerforbindelse oprettet af ADOQuery-komponenten ved hjælp af densConnectionString ejendom eller gennem en separat ADOC-forbindelseskomponent, der er specificeret i Forbindelseejendom.

For at gøre en Delphi-form, der er i stand til at hente dataene fra en Access-database med ADOQuery-komponenten, skal du bare slippe alle de tilhørende datatilgang og datavidstænkte komponenter på det og oprette et link som beskrevet i de foregående kapitler om dette Rute. Datatilgangskomponenterne: DataSource, ADOC-forbindelse sammen med ADOQuery (i stedet for den ADOTable) og en datavisst komponent som DBGrid er alt hvad vi har brug for.
Som allerede forklaret, ved hjælp af Object Inspector skal du indstille linket mellem disse komponenter som følger:

DBGrid1.DataSource = DataSource1
DataSource1.DataSet = ADOQuery1
ADOQuery1.Connection = ADOConnection1
// opbyg ConnectionString
ADOConnection1.ConnectionString = ...
ADOConnection1.LoginPrompt = Falsk

Gør en SQL-forespørgsel

TADOQuery-komponenten har ikke et TableNameejendom, som TADOTable gør. TADOQuery har en ejendom (TStrings) kaldet SQL som bruges til at gemme SQL-sætningen. Du kan indstille SQL-egenskabens værdi med Objektinspektøren på designtidspunktet eller gennem kode under kørslen.

På designtidspunktet skal du påkalde egenskabseditoren for SQL-egenskaben ved at klikke på ellipseknappen i objektinspektøren. Skriv følgende SQL-sætning: "VÆLG * FRA forfattere".

SQL-sætningen kan udføres på en af ​​to måder, afhængigt af udsagnets type. Data Definition Language-udsagnene udføres generelt med ExecSQL metode. For eksempel at slette en bestemt post fra en bestemt tabel kan du skrive en DELETE DDL-sætning og køre forespørgslen med ExecSQL-metoden.
De (almindelige) SQL-sætninger udføres ved at indstille TADOQuery. Aktiv ejendom til Rigtigt eller ved at ringe tilÅben metode (i det væsentlige den samme). Denne tilgang svarer til at hente tabeldata med TADOTable-komponenten.

Ved kørsel kan SQL-sætningen i SQL-egenskaben bruges som ethvert StringList-objekt:

med ADOQuery1 begynder Luk; 
SQL.Clear;
SQL.Tilføj: = 'VÆLG * FRA forfattere' SQL.Tilføj: = 'BESTILLING AF autororname DESC' Åben;
ende;

Ovenstående kode lukker datasættet ved kørsel, tømmer SQL-strengen i SQL-egenskaben, tildeler en ny SQL-kommando og aktiverer datasættet ved at kalde Open-metoden.

Bemærk, at det naturligvis ikke giver mening at oprette en vedvarende liste over feltobjekter til en ADOQuery-komponent. Næste gang du kalder Open-metoden, kan SQL være så forskellig, at hele sættet af arkiverede navne (og typer) kan ændre sig. Dette er naturligvis ikke tilfældet, hvis vi bruger ADOQuery til at hente rækkerne fra kun en tabel med det konstante sæt felter - og det resulterende sæt afhænger af HVOR del af SQL-sætningen.

Dynamiske forespørgsler

En af de store egenskaber ved TADOQuery-komponenterne er Parametre ejendom. En parameteriseret forespørgsel er en, der tillader fleksibelt valg af række / kolonne ved hjælp af en parameter i WHERE-leddet i en SQL-sætning. Egenskaben Params tillader udskiftelige parametre i den foruddefinerede SQL-sætning. En parameter er en pladsholder for en værdi i WHERE-klausulen, der er defineret lige inden forespørgslen åbnes. For at specificere en parameter i en forespørgsel skal du bruge et kolon (:) forud for et parameternavn.
Brug designinspektøren til at indstille SQL-egenskaben på følgende tidspunkt:

ADOQuery1.SQL: = 'VÆLG * FRA applikationer HVOR type =: apptype'

Når du lukker vinduet SQL-editor, skal du åbne vinduet Parametre ved at klikke på ellipseknappen i objektinspektøren.

Parameteren i den foregående SQL-sætning kaldesapptype. Vi kan indstille værdierne for parametrene i Params-samlingen på designtidspunktet via dialogboksen Parametre, men for det meste ændrer vi parametrene under kørsel. Dialogboksen Parametre kan bruges til at specificere datatyper og standardværdier for parametre, der bruges i en forespørgsel.

Ved kørsel kan parametrene ændres, og forespørgslen genudføres for at opdatere dataene. For at udføre en parameteriseret forespørgsel er det nødvendigt at angive en værdi for hver parameter forud for udførelsen af ​​forespørgslen. For at ændre parameterværdien bruger vi enten Params egenskaben eller ParamByName metoden. For eksempel, givet SQL-sætningen som ovenfor, kunne vi ved kørsel bruge følgende kode:

med ADOQuery1 begynder
Tæt;
SQL.Clear;
SQL.Tilføj ('VÆLG * FRA applikationer, HVOR type =: apptype');
. ParamByName ( 'apptype') Værdi: = 'multimedie';
Åben;
ende;

Ligesom når man arbejder med den ADOTable-komponent returnerer ADOQuery et sæt eller poster fra en tabel (eller to eller flere). Navigering gennem et datasæt udføres med det samme sæt metoder som beskrevet i kapitlet "Bagdata i datasæt".

Navigering og redigering af forespørgslen

Generelt bør ADOQuery-komponent ikke bruges, når redigering finder sted. De SQL-baserede forespørgsler bruges for det meste til rapporteringsformål. Hvis din forespørgsel returnerer et resultatsæt, er det undertiden muligt at redigere det returnerede datasæt. Resultatsættet skal indeholde poster fra en enkelt tabel, og det må ikke bruge nogen SQL-samlede funktioner. Redigering af et datasæt, der returneres af ADOQuery, er det samme som at redigere ADOTAble's datasæt.

Eksempel

For at se nogle ADOQuery-handlinger koder vi et lille eksempel. Lad os lave en forespørgsel, der kan bruges til at hente rækkerne fra forskellige tabeller i en database. For at vise listen over alle tabeller i en database kan vi bruge GetTableNamesmetode til ADOConnection komponent. GetTableNames i OnCreate-begivenheden af ​​formularen udfylder ComboBox med tabellenavne, og knappen bruges til at lukke forespørgslen og til at genskabe den for at hente posterne fra en plukket tabel. () Eventhandlere skal se ud:

procedure TForm1.FormCreate (Afsender: TObject);
begynde
ADOConnection1.GetTableNames (ComboBox1.Items);
ende;
procedure TForm1.Button1Click (Afsender: TObject);
var tblname: streng;
begynde
hvis ComboBox1.ItemIndex, skal du afslutte;
tblname: = ComboBox1.Items [ComboBox1.ItemIndex];
med ADOQuery1 begynder
Tæt;
SQL.Text: = 'VÆLG * FRA' + tblnavn;
Åben;
ende;
ende;

Bemærk, at alt dette kan gøres ved at bruge ADOTable og dens egenskab TableName.

instagram story viewer