Använda Delphi-frågor med ADO

TADOQuery-komponenten ger Delphi-utvecklare möjlighet att hämta data från en eller flera tabeller från en ADO-databas med SQL.

Dessa SQL-satser kan antingen vara DDL-uttalanden (Data Definition Language) som CREATE TABLE, ALTER INDEX och så vidare, eller de kan vara DML-uttalanden (Data Manipulation Language), som SELECT, UPDATE och DELETE. Det vanligaste uttalet är emellertid SELECT-uttalandet, som ger en vy liknande den som finns med en tabellkomponent.

Obs! Trots att exekvera kommandon med ADOQuery-komponenten är det möjligt ADOCommandkomponent är mer lämplig för detta ändamål. Det används oftast för att köra DDL-kommandon eller för att utföra en lagrad procedur (även om du borde användaTADOStoredProc för sådana uppgifter) som inte returnerar en resultatset.

SQL som används i en ADOQuery-komponent måste vara acceptabel för den ADO-drivrutin som används. Med andra ord bör du känna till SQL-skrivskillnaderna mellan till exempel MS Access och MS SQL.

Liksom när du arbetar med den ADOTable-komponenten, åtkomst till data i en databas med hjälp av en datalagringsanslutning upprättad av ADOQuery-komponenten med hjälp av dessConnection egendom eller genom en separat ADOC-anslutningskomponent som anges i Förbindelsefast egendom.

För att göra en Delphi-form som kan hämta data från en Access-databas med ADOQuery-komponenten, släpper du bara alla relaterade datatillgängliga och datakännande komponenter på den och gör en länk som beskrivs i de tidigare kapitlen i denna kurs. Datatillgängningskomponenterna: DataSource, ADOC-anslutning tillsammans med ADOQuery (istället för ADOTable) och en datamedveten komponent som DBGrid är allt vi behöver.
Som redan förklarats ställer du in länken mellan dessa komponenter genom att använda Objektinspektören enligt följande:

DBGrid1.DataSource = DataSource1
DataSource1.DataSet = ADOQuery1
ADOQuery1.Connection = ADOConnection1
// bygg ConnectionString
ADOConnection1.ConnectionString = ...
ADOConnection1.LoginPrompt = Falskt

Gör en SQL-fråga

TADOQuery-komponenten har inte en Tablenameegendom som TADOTable gör. TADOQuery har en egenskap (TStrings) som heter SQL som används för att lagra SQL-uttalandet. Du kan ställa in SQL-egenskapens värde med objektinspektören vid designtid eller genom kod under körning.

På designtidspunkten påkallar du egenskapens redigerare för SQL-egenskapen genom att klicka på ellipsknappen i objektinspektören. Skriv in följande SQL-sats: "VÄLJ * FRÅN Författare".

SQL-satset kan köras på ett av två sätt, beroende på typ av uttalande. Datainformationens språkuppgifter körs vanligtvis med ExecSQL metod. Till exempel för att radera en specifik post från en specifik tabell kan du skriva en DELETE DDL-sats och köra frågan med metoden ExecSQL.
De (vanliga) SQL-satserna körs genom att ställa in TADOQuery.Active egendom till Sann eller genom att ringaÖppen metod (väsentligen densamma). Detta tillvägagångssätt liknar hämtning av en tabelldata med TADOTable-komponenten.

Vid körning kan SQL-uttalandet i SQL-egenskapen användas som alla StringList-objekt:

med ADOQuery1 börjar stäng;
SQL.Clear;
SQL.Add: = 'SELECT * FRA Authors' SQL.Add: = 'BESTÄLL AV Autorname DESC' Öppna; 
slutet;

Ovanstående kod stänger vid körtid datasatsen, tömmer SQL-strängen i SQL-egenskapen, tilldelar ett nytt SQL-kommando och aktiverar datasättet genom att kalla Open-metoden.

Observera att det inte är meningsfullt att skapa en ihållande lista över fältobjekt för en ADOQuery-komponent. Nästa gång du kallar Open-metoden kan SQL vara så olika att hela uppsättningen av arkiverade namn (och typer) kan förändras. Naturligtvis är detta inte fallet om vi använder ADOQuery för att hämta raderna från bara en tabell med konstant uppsättning fält - och den resulterande uppsättningen beror på VAR-delen av SQL-uttalandet.

Dynamiska frågor

En av de stora egenskaperna hos TADOQuery-komponenterna är params fast egendom. En parametrerad fråga är en som tillåter flexibel rad / kolumnval med en parameter i WHERE-avsnittet i ett SQL-uttalande. Egenskapen Params tillåter utbytbara parametrar i det fördefinierade SQL-uttalandet. En parameter är en platshållare för ett värde i WHERE-klausulen, definierad precis innan frågan öppnas. För att ange en parameter i en fråga, använd en kolon (:) före ett parameternamn.
Vid designtid använder du objektinspektören för att ställa in SQL-egenskapen enligt följande:

ADOQuery1.SQL: = 'VÄLJ * FRÅN applikationer VAR typ =: apptype'

När du stänger SQL-redigeringsfönstret öppnar du fönstret Parametrar genom att klicka på ellipsknappen i objektinspektören.

Parametern i föregående SQL-sats sägsapptype. Vi kan ställa in värdena på parametrarna i Params-samlingen vid designtid via dialogrutan Parametrar, men för det mesta kommer vi att ändra parametrarna vid körning. Dialogrutan Parametrar kan användas för att ange datatyper och standardvärden för parametrar som används i en fråga.

Vid körning kan parametrarna ändras och frågan återutföras för att uppdatera data. För att kunna utföra en parametrerad fråga är det nödvändigt att tillhandahålla ett värde för varje parameter innan exekveringen av frågan. För att ändra parametervärdet använder vi antingen Params -egenskapen eller ParamByName-metoden. Till exempel, med tanke på SQL-uttalandet som ovan, vid körning kan vi använda följande kod:

med ADOQuery1 börjar
Stänga;
SQL.Clear;
SQL.Add ('VÄLJ * FRÅN applikationer VAR typ =: apptype');
. ParamByName (apptype) Värde: = 'multimedia',
Öppen;
slutet;

Liksom när du arbetar med den ADOTable-komponenten returnerar ADOQuery en uppsättning eller poster från en tabell (eller två eller fler). Navigering genom ett dataset görs med samma uppsättning metoder som beskrivs i kapitlet "Bakom data i datasätt".

Navigera och redigera frågan

Generellt sett bör ADOQuery-komponenten inte användas när redigering sker. De SQL-baserade frågorna används oftast för rapporteringsändamål. Om din fråga returnerar en resultatuppsättning är det ibland möjligt att redigera det returnerade datasättet. Resultatuppsättningen måste innehålla poster från en enda tabell och den får inte använda några SQL-aggregerade funktioner. Redigering av ett datasæt som returneras av ADOQuery är detsamma som att redigera ADOTAble's dataset.

Exempel

För att se några ADOQuery-åtgärder kodar vi ett litet exempel. Låt oss göra en fråga som kan användas för att hämta raderna från olika tabeller i en databas. För att visa listan över alla tabeller i en databas kan vi använda GetTableNamesmetod för ADOConnection komponent. GetTableNames i OnCreate-händelsen i formuläret fyller ComboBox med tabellnamnen och knappen används för att stänga frågan och återskapa den för att hämta posten från ett valt bord. () Eventhanterare ska se ut som:

procedur TForm1.FormCreate (avsändare: TObject);
Börja
ADOConnection1.GetTableNames (ComboBox1.Items);
slutet;
procedur TForm1.Button1Click (avsändare: TObject);
var tblname: string;
Börja
om ComboBox1.ItemIndex sedan Avsluta;
tblname: = ComboBox1.Items [ComboBox1.ItemIndex];
med ADOQuery1 börjar
Stänga;
SQL.Text: = 'VÄLJ * FRA' + tblnamn;
Öppen;
slutet;
slutet;

Observera att allt detta kan göras med hjälp av ADOTable och dess egendom TableName.