Verwenden von Delphi-Abfragen mit ADO

Die TADOQuery-Komponente bietet Delphi-Entwicklern die Möglichkeit, mithilfe von SQL Daten aus einer oder mehreren Tabellen aus einer ADO-Datenbank abzurufen.

Diese SQL-Anweisungen können entweder DDL-Anweisungen (Data Definition Language) wie CREATE TABLE, ALTER INDEX usw. oder DML-Anweisungen (Data Manipulation Language) wie SELECT, UPDATE und DELETE sein. Die gebräuchlichste Anweisung ist jedoch die SELECT-Anweisung, mit der eine Ansicht erstellt wird, die der Ansicht ähnelt, die mit einer Table-Komponente verfügbar ist.

Hinweis: Auch wenn die Ausführung von Befehlen mit der ADOQuery-Komponente möglich ist, kann die ADOCommandKomponente ist für diesen Zweck besser geeignet. Es wird am häufigsten zum Ausführen von DDL - Befehlen oder zum Ausführen einer gespeicherten Prozedur verwendet (auch wenn Sie das verwenden solltenTADOStoredProc für solche Aufgaben), die keine Ergebnismenge zurückgibt.

Die in einer ADOQuery-Komponente verwendete SQL muss für den verwendeten ADO-Treiber akzeptabel sein. Mit anderen Worten, Sie sollten mit den SQL-Schreibunterschieden zwischen z. B. MS Access und MS SQL vertraut sein.

Wie bei der Arbeit mit der ADOTable-Komponente wird auf die Daten in einer Datenbank über eine Datenspeicherverbindung zugegriffen, die von der ADOQuery-Komponente mit deren Hilfe hergestellt wurdeConnectionString Eigenschaft oder über eine separate ADOConnection-Komponente, die in der VerbindungEigentum.

Um ein Delphi-Formular zum Abrufen der Daten aus einer Access-Datenbank mit der ADOQuery-Komponente zu erstellen, legen Sie einfach alle zugehörigen datenzugriffs- und datensensitiven Komponenten darauf ab und stellen Sie eine Verknüpfung her, wie in den vorherigen Kapiteln dieses Kurses beschrieben. Die Datenzugriffskomponenten: DataSource, ADOConnection sowie ADOQuery (anstelle von ADOTable) und eine datensensitive Komponente wie DBGrid sind alles, was wir benötigen.
Wie bereits erläutert, stellen Sie mithilfe des Objektinspektors die Verknüpfung zwischen diesen Komponenten wie folgt ein:

DBGrid1.DataSource = DataSource1
DataSource1.DataSet = ADOQuery1
ADOQuery1.Connection = ADOConnection1
// Erstelle den ConnectionString
ADOConnection1.ConnectionString =…
ADOConnection1.LoginPrompt = False

Ausführen einer SQL-Abfrage

Die TADOQuery-Komponente hat kein TabellennameEigenschaft wie die TADOTable. TADOQuery hat eine Eigenschaft (TStrings) namens SQL Hier wird die SQL-Anweisung gespeichert. Sie können den Wert der SQL-Eigenschaft zur Entwurfszeit im Objektinspektor oder zur Laufzeit über Code festlegen.

Rufen Sie zur Entwurfszeit den Eigenschafteneditor für die SQL-Eigenschaft auf, indem Sie im Objektinspektor auf die Schaltfläche mit den Auslassungspunkten klicken. Geben Sie die folgende SQL-Anweisung ein: "SELECT * FROM Authors".

Die SQL-Anweisung kann je nach Art der Anweisung auf zwei Arten ausgeführt werden. Die Data Definition Language-Anweisungen werden in der Regel mit der ausgeführt ExecSQL Methode. Um beispielsweise einen bestimmten Datensatz aus einer bestimmten Tabelle zu löschen, können Sie eine DELETE-DDL-Anweisung schreiben und die Abfrage mit der ExecSQL-Methode ausführen.
Die (gewöhnlichen) SQL-Anweisungen werden ausgeführt, indem das gesetzt wird TADOQuery.Active Eigentum an Wahr oder telefonisch bei derÖffnen Methode (im Wesentlichen das gleiche). Dieser Ansatz ähnelt dem Abrufen von Tabellendaten mit der TADOTable-Komponente.

Zur Laufzeit kann die SQL-Anweisung in der SQL-Eigenschaft als beliebiges StringList-Objekt verwendet werden:

mit ADOQuery1 beginne Close;
SQL.Clear;
SQL.Add: = 'SELECT * FROM Authors' SQL.Add: = 'ORDER BY authorname DESC' Open; 
Ende;

Der obige Code schließt zur Laufzeit die Datenmenge, leert die SQL-Zeichenfolge in der SQL-Eigenschaft, weist einen neuen SQL-Befehl zu und aktiviert die Datenmenge durch Aufrufen der Open-Methode.

Beachten Sie, dass es offensichtlich keinen Sinn macht, eine persistente Liste von Feldobjekten für eine ADOQuery-Komponente zu erstellen. Wenn Sie das nächste Mal die Open-Methode aufrufen, kann die SQL so unterschiedlich sein, dass sich der gesamte Satz der Dateinamen (und -typen) möglicherweise ändert. Dies ist natürlich nicht der Fall, wenn wir ADOQuery zum Abrufen der Zeilen aus nur einer Tabelle mit der konstanten Menge von Feldern verwenden - und die resultierende Menge hängt vom WHERE-Teil der SQL-Anweisung ab.

Dynamische Abfragen

Eine der großartigen Eigenschaften der TADOQuery-Komponenten ist die Params Eigentum. Eine parametrisierte Abfrage ermöglicht eine flexible Zeilen- / Spaltenauswahl mithilfe eines Parameters in der WHERE-Klausel einer SQL-Anweisung. Die Eigenschaft Params ermöglicht ersetzbare Parameter in der vordefinierten SQL-Anweisung. Ein Parameter ist ein Platzhalter für einen Wert in der WHERE-Klausel, der unmittelbar vor dem Öffnen der Abfrage definiert wird. Verwenden Sie einen Doppelpunkt (:) vor einem Parameternamen, um einen Parameter in einer Abfrage anzugeben.
Verwenden Sie zur Entwurfszeit den Objektinspektor, um die SQL-Eigenschaft wie folgt festzulegen:

ADOQuery1.SQL: = 'SELECT * FROM Applications WHERE type =: apptype'

Wenn Sie das SQL-Editorfenster schließen, öffnen Sie das Parameterfenster, indem Sie im Objektinspektor auf die Schaltfläche mit den Auslassungspunkten klicken.

Der Parameter in der vorhergehenden SQL-Anweisung heißtapptype. Die Werte der Parameter in der Params-Auflistung können zur Entwurfszeit über das Dialogfeld Parameter festgelegt werden. In den meisten Fällen werden die Parameter jedoch zur Laufzeit geändert. Im Dialogfeld "Parameter" können die Datentypen und Standardwerte der in einer Abfrage verwendeten Parameter angegeben werden.

Zur Laufzeit können die Parameter geändert und die Abfrage erneut ausgeführt werden, um die Daten zu aktualisieren. Um eine parametrisierte Abfrage auszuführen, muss vor der Ausführung der Abfrage für jeden Parameter ein Wert angegeben werden. Um den Parameterwert zu ändern, verwenden wir entweder die Params-Eigenschaft oder die ParamByName-Methode. Wenn wir zum Beispiel die SQL-Anweisung wie oben angegeben haben, könnten wir zur Laufzeit den folgenden Code verwenden:

mit ADOQuery1 beginnen
Schließen;
SQL.Clear;
SQL.Add ('SELECT * FROM Applications WHERE type =: apptype');
ParamByName ('apptype'). Wert: = 'multimedia';
Öffnen;
Ende;

Wie bei der Arbeit mit der ADOTable-Komponente gibt ADOQuery eine Menge oder Datensätze aus einer Tabelle (oder zwei oder mehr) zurück. Das Navigieren durch einen Datensatz erfolgt mit denselben Methoden wie im Kapitel "Hinter Daten in Datensätzen" beschrieben.

Navigieren und Bearbeiten der Abfrage

Im Allgemeinen sollte die ADOQuery-Komponente beim Bearbeiten nicht verwendet werden. Die SQL-basierten Abfragen werden hauptsächlich zu Berichtszwecken verwendet. Wenn Ihre Abfrage eine Ergebnismenge zurückgibt, ist es manchmal möglich, die zurückgegebene Datenmenge zu bearbeiten. Die Ergebnismenge muss Datensätze aus einer einzelnen Tabelle enthalten und darf keine SQL-Aggregatfunktionen verwenden. Die Bearbeitung eines von ADOQuery zurückgegebenen Datensatzes entspricht der Bearbeitung des ADOTAble-Datensatzes.

Beispiel

Um eine ADOQuery-Aktion zu sehen, werden wir ein kleines Beispiel codieren. Nehmen wir eine Abfrage vor, mit der die Zeilen aus verschiedenen Tabellen in einer Datenbank abgerufen werden können. Um die Liste aller Tabellen in einer Datenbank anzuzeigen, können wir die verwenden GetTableNamesMethode der ADOConnection Komponente. Das GetTableNames in dem OnCreate-Ereignis des Formulars füllt das Kombinationsfeld mit den Tabellennamen und das Button wird verwandt, um die Abfrage zu schließen und es neu zu erstellen, um die Datensätze aus einer ausgewählten Tabelle abzurufen. Die () Ereignishandler sollten wie folgt aussehen:

procedure TForm1.FormCreate (Sender: TObject);
Start
ADOConnection1.GetTableNames (ComboBox1.Items);
Ende;
procedure TForm1.Button1Click (Sender: TObject);
var tblname: string;
Start
if ComboBox1.ItemIndex then Exit;
tblname: = ComboBox1.Items [ComboBox1.ItemIndex];
mit ADOQuery1 beginnen
Schließen;
SQL.Text: = 'SELECT * FROM' + tblname;
Öffnen;
Ende;
Ende;

Beachten Sie, dass dies alles mithilfe von ADOTable und seiner TableName-Eigenschaft erfolgen kann.