Delphi-zoekopdrachten gebruiken met ADO

De component TADOQuery biedt Delphi-ontwikkelaars de mogelijkheid om gegevens uit een of meerdere tabellen uit een ADO-database te halen met behulp van SQL.

Deze SQL-instructies kunnen DDL-instructies (Data Definition Language) zijn, zoals CREATE TABLE, ALTER INDEX, enzovoort, of ze kunnen DML-instructies (Data Manipulation Language) zijn, zoals SELECT, UPDATE en DELETE. De meest gebruikelijke instructie is echter de SELECT-instructie, die een weergave produceert die vergelijkbaar is met de weergave die beschikbaar is met een component Table.

Opmerking: hoewel het uitvoeren van opdrachten met behulp van de component ADOQuery mogelijk is, is de ADOCommandcomponent is meer geschikt voor dit doel. Het wordt meestal gebruikt om DDL-opdrachten uit te voeren of om een ​​opgeslagen procedure uit te voeren (hoewel u deTADOStoredProc voor dergelijke taken) die geen resultaatset retourneert.

De SQL die in een ADOQuery-component wordt gebruikt, moet acceptabel zijn voor het gebruikte ADO-stuurprogramma. Met andere woorden: u moet bekend zijn met de SQL-schrijfverschillen tussen bijvoorbeeld MS Access en MS SQL.

Net als bij het werken met de component ADOTable, worden de gegevens in een database benaderd via een gegevensopslagverbinding die door de component ADOQuery tot stand is gebrachtVerbindingsdraad eigendom of via een afzonderlijke ADOConnection-component gespecificeerd in de Verbindingeigendom.

Om een ​​Delphi-formulier in staat te stellen om de gegevens uit een Access-database op te halen met de ADOQuery-component, zet u gewoon alle gerelateerde data-access- en data-bewuste componenten erop neer en maakt u een link zoals beschreven in de vorige hoofdstukken van deze cursus. De componenten voor gegevenstoegang: DataSource, ADOConnection samen met ADOQuery (in plaats van de ADOTable) en één gegevensbewuste component zoals DBGrid is alles wat we nodig hebben.
Zoals eerder uitgelegd, stelt u met behulp van Object Inspector de koppeling tussen die componenten als volgt in:

DBGrid1.DataSource = DataSource1
DataSource1.DataSet = ADOQuery1
ADOQuery1.Connection = ADOConnection1
// bouw de ConnectionString
ADOConnection1.ConnectionString =…
ADOConnection1.LoginPrompt = False

Een SQL-query uitvoeren

De component TADOQuery heeft geen Tafel naameigenschap zoals de TADOTable doet. TADOQuery heeft een eigenschap (TStrings) genaamd SQL die wordt gebruikt om de SQL-instructie op te slaan. U kunt de waarde van de SQL-eigenschap instellen met Object Inspector tijdens het ontwerp of via code tijdens runtime.

Roep tijdens het ontwerpen de eigenschappeneditor voor de SQL-eigenschap op door op de ellipsknop in Object Inspector te klikken. Typ de volgende SQL-instructie: "SELECT * FROM Auteurs".

De SQL-instructie kan op twee manieren worden uitgevoerd, afhankelijk van het type instructie. De Data Definition Language-instructies worden meestal uitgevoerd met de ExecSQL methode. Als u bijvoorbeeld een specifiek record uit een specifieke tabel wilt verwijderen, kunt u een DELETE DDL-instructie schrijven en de query uitvoeren met de ExecSQL-methode.
De (gewone) SQL-instructies worden uitgevoerd door de TADOQuery.Active eigendom aan waar of door de te bellenOpen methode (in wezen hetzelfde). Deze benadering is vergelijkbaar met het ophalen van tabelgegevens met de component TADOTable.

Tijdens runtime kan de SQL-instructie in de SQL-eigenschap worden gebruikt als elk StringList-object:

met ADOQuery1 beginnen Sluiten;
SQL.Clear;
SQL.Add: = 'SELECT * FROM Auteurs' SQL.Add: = 'ORDER BY authorname DESC' Openen; 
einde;

De bovenstaande code sluit tijdens de uitvoering de gegevensset, maakt de SQL-string in de eigenschap SQL leeg, wijst een nieuwe SQL-opdracht toe en activeert de gegevensset door de methode Open aan te roepen.

Houd er rekening mee dat het logisch is om geen blijvende lijst met veldobjecten te maken voor een ADOQuery-component. De volgende keer dat u de methode Open aanroept, kan de SQL zo verschillend zijn dat de hele reeks opgeslagen namen (en typen) kan veranderen. Dit is natuurlijk niet het geval als we ADOQuery gebruiken om de rijen op te halen uit slechts één tabel met de constante set velden - en de resulterende set hangt af van het WHERE-gedeelte van de SQL-instructie.

Dynamische zoekopdrachten

Een van de geweldige eigenschappen van de TADOQuery-componenten is de params eigendom. Een geparametriseerde query is een query die flexibele rij- / kolomselectie mogelijk maakt met behulp van een parameter in de WHERE-component van een SQL-instructie. De eigenschap Params staat vervangbare parameters toe in de vooraf gedefinieerde SQL-instructie. Een parameter is een tijdelijke aanduiding voor een waarde in de WHERE-component, gedefinieerd net voordat de query wordt geopend. Als u een parameter in een query wilt opgeven, gebruikt u een dubbele punt (:) vóór een parameternaam.
Gebruik tijdens het ontwerpen de Object Inspector om de SQL-eigenschap als volgt in te stellen:

ADOQuery1.SQL: = 'SELECT * UIT Toepassingen WAAR type =: apptype'

Wanneer u het SQL-editorvenster sluit, opent u het venster Parameters door te klikken op de ellipsknop in Object Inspector.

De parameter in de voorgaande SQL-instructie heeft een naamapptype. We kunnen de waarden van de parameters in de Params-collectie tijdens het ontwerpen instellen via het dialoogvenster Parameters, maar meestal zullen we de parameters tijdens runtime wijzigen. Het dialoogvenster Parameters kan worden gebruikt om de gegevenstypen en standaardwaarden van parameters in een query op te geven.

Tijdens de uitvoering kunnen de parameters worden gewijzigd en de query opnieuw worden uitgevoerd om de gegevens te vernieuwen. Om een ​​geparametriseerde query uit te voeren, moet voor elke parameter een waarde worden opgegeven voordat de query wordt uitgevoerd. Om de parameterwaarde te wijzigen, gebruiken we de eigenschap Params of de methode ParamByName. Gezien de SQL-instructie zoals hierboven, kunnen we tijdens runtime bijvoorbeeld de volgende code gebruiken:

met ADOQuery1 beginnen
Dichtbij;
SQL.Clear;
SQL.Add ('SELECT * FROM Toepassingen WAAR type =: apptype');
. ParamByName ( 'apptype') Waarde: = 'multimedia';
Open;
einde;

Net als bij het werken met de component ADOTable, retourneert ADOQuery een set of records uit een tabel (of twee of meer). Navigeren door een gegevensset gebeurt met dezelfde set methoden als beschreven in het hoofdstuk "Achter gegevens in gegevenssets".

Door de query navigeren en deze bewerken

Over het algemeen mag de component ADOQuery niet worden gebruikt wanneer bewerkingen plaatsvinden. De op SQL gebaseerde zoekopdrachten worden meestal gebruikt voor rapportagedoeleinden. Als uw zoekopdracht een resultatenset retourneert, is het soms mogelijk om de geretourneerde gegevensset te bewerken. De resultatenset moet records uit een enkele tabel bevatten en mag geen SQL-aggregatiefuncties gebruiken. Het bewerken van een door de ADOQuery geretourneerde gegevensset is hetzelfde als het bewerken van de gegevensset van ADOTAble.

Voorbeeld

Om een ​​aantal ADOQuery-actie te zien, coderen we een klein voorbeeld. Laten we een query maken die kan worden gebruikt om de rijen op te halen uit verschillende tabellen in een database. Om de lijst met alle tabellen in een database te tonen, kunnen we de GetTableNamesmethode van de ADOConnection component. De GetTableNames in de OnCreate-gebeurtenis van het formulier vult de ComboBox met de tabelnamen en de knop wordt gebruikt om de query te sluiten en opnieuw te maken om de records uit een geplukte tabel op te halen. De () event-handlers moeten er als volgt uitzien:

procedure TForm1.FormCreate (afzender: TObject);
beginnen
ADOConnection1.GetTableNames (ComboBox1.Items);
einde;
procedure TForm1.Button1Click (afzender: TObject);
var tblname: string;
beginnen
als ComboBox1.ItemIndex vervolgens Exit;
tblname: = ComboBox1.Items [ComboBox1.ItemIndex];
met ADOQuery1 beginnen
Dichtbij;
SQL.Text: = 'SELECT * FROM' + tblname;
Open;
einde;
einde;

Merk op dat dit allemaal kan worden gedaan met behulp van de ADOTable en de eigenschap TableName.