De TADOQuery-component biedt Delphi ontwikkelaars de mogelijkheid om gegevens op te halen uit een of meerdere tabellen van een ADO-database met behulp van SQL.
Deze SQL-instructies kunnen DDL-instructies (Data Definition Language) zijn, zoals CREATE TABLE, ALTER INDEX, enzovoort, of het kunnen DML (Data Manipulation Language) -instructies zijn, zoals SELECT, UPDATE en VERWIJDEREN. De meest voorkomende instructie is echter de SELECT-instructie, die een weergave oplevert die vergelijkbaar is met die welke beschikbaar is met behulp van een tabelonderdeel.
Opmerking: hoewel het uitvoeren van opdrachten met de ADOQuery-component 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 (ook al zou u deTADOStoredProc voor dergelijke taken) die geen resultaatset retourneert.
De SQL die in een ADOQuery-component wordt gebruikt, moet acceptabel zijn voor het ADO-stuurprogramma dat wordt gebruikt. 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 ADOTable-component, worden de gegevens in een database benaderd via een gegevensopslagverbinding die tot stand is gebracht door de ADOQuery-component met behulp van deVerbindingsdraad eigenschap of via een afzonderlijke ADOConnection-component die is gespecificeerd in de Verbindingeigendom.
Om een Delphi-formulier in staat te stellen de gegevens uit een Access-database op te halen met de ADOQuery-component, laat u alles gewoon vallen de gerelateerde data-toegang en data-bewuste componenten erop en maak een link zoals beschreven in de voorgaande hoofdstukken hiervan Cursus. De componenten voor gegevenstoegang: DataSource, ADOConnection samen met ADOQuery (in plaats van de ADOTable) en één gegevensbewust onderdeel zoals DBGrid is alles wat we nodig hebben.
Zoals al is uitgelegd, stelt u met behulp van de Object Inspector de link 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 TADOQuery-component heeft geen Tafel naameigendom 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 ontwerpen of via code tijdens runtime.
Roep tijdens het ontwerpen de eigenschappeneditor voor de SQL-eigenschap aan door op de knop met het puntje in de Objectcontrole te klikken. Typ de volgende SQL-instructie: "SELECT * FROM Authors".
De SQL-instructie kan op twee manieren worden uitgevoerd, afhankelijk van het type instructie. De Data Definition Language-instructies worden over het algemeen 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. Actief eigendom aan Klopt of door de te bellenOpen methode (in wezen hetzelfde). Deze aanpak is vergelijkbaar met het ophalen van tabelgegevens met de TADOTable-component.
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 runtime de dataset, leegt de SQL-string in de SQL-eigenschap, wijst een nieuwe SQL-opdracht toe en activeert de dataset door de Open-methode aan te roepen.
Merk op dat het natuurlijk niet logisch is om een persistente lijst met veldobjecten te maken voor een ADOQuery-component. De volgende keer dat u de Open-methode 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 uit slechts één tabel op te halen 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. Met de eigenschap Params zijn vervangbare parameters in de vooraf gedefinieerde SQL-instructie toegestaan. Een parameter is een tijdelijke aanduiding voor een waarde in de WHERE-component, gedefinieerd net voordat de query wordt geopend. Gebruik een dubbele punt (:) voor een parameternaam om een parameter in een query op te geven.
Gebruik tijdens het ontwerpen de Objectcontrole om de SQL-eigenschap als volgt in te stellen:
ADOQuery1.SQL: = 'SELECT * FROM Applications WHERE type =: apptype'
Wanneer u het venster van de SQL-editor sluit, opent u het venster Parameters door op de knop met het puntje in de Objectcontrole te klikken.
De parameter in de voorgaande SQL-instructie wordt genoemdapptype. 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 op te geven van parameters die in een query worden gebruikt.
Tijdens runtime kunnen de parameters worden gewijzigd en de query opnieuw worden uitgevoerd om de gegevens te vernieuwen. Om een geparametriseerde query uit te voeren, is het nodig om voor elke parameter een waarde op te geven 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, zouden we tijdens runtime de volgende code kunnen gebruiken:
met ADOQuery1 beginnen
Dichtbij;
SQL.Clear;
SQL.Add ('SELECT * FROM Applications WHERE type =: apptype');
ParamByName ('apptype'). Waarde: = 'multimedia';
Open;
einde;
Net als bij het werken met de ADOTable-component retourneert de ADOQuery een set of records uit een tabel (of twee of meer). Navigeren door een dataset gebeurt met dezelfde set methoden als beschreven in het hoofdstuk "Achter data in datasets".
Navigeren en de query bewerken
Over het algemeen mag de ADOQuery-component niet worden gebruikt wanneer er wordt bewerkt. De op SQL gebaseerde zoekopdrachten worden meestal gebruikt voor rapportagedoeleinden. Als uw query een resultatenset retourneert, is het soms mogelijk om de geretourneerde dataset te bewerken. De resultaatset moet records uit een enkele tabel bevatten en mag geen SQL-aggregatiefuncties gebruiken. Het bewerken van een door de ADOQuery geretourneerde dataset is hetzelfde als het bewerken van de ADOTAble-dataset.
Voorbeeld
Om wat ADOQuery-actie te zien, coderen we een klein voorbeeld. Laten we een query maken die kan worden gebruikt om de rijen uit verschillende tabellen in een database op te halen. Om de lijst met alle tabellen in een database weer te geven, kunnen we de gebruiken 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 deze opnieuw te creëren om de records uit een gepickte 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 dan 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.