Verwenden von Delphi-Abfragen mit ADO

click fraud protection

Die TADOQuery-Komponente bietet Delphi Entwickler die Möglichkeit, Daten aus einer oder mehreren Tabellen aus einem abzurufen ADO-Datenbank mit SQL.

Diese SQL-Anweisungen können entweder DDL-Anweisungen (Data Definition Language) wie CREATE TABLE, ALTER sein INDEX usw. oder DML-Anweisungen (Data Manipulation Language) wie SELECT, UPDATE und LÖSCHEN. Die häufigste Anweisung ist jedoch die SELECT-Anweisung, die eine ähnliche Ansicht erzeugt wie die, die mit einer Tabellenkomponente verfügbar ist.

Hinweis: Obwohl das Ausführen 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 (obwohl Sie die verwenden solltenTADOStoredProc für solche Aufgaben), die keine Ergebnismenge zurückgibt.

Das 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 beispielsweise MS Access und MS SQL vertraut sein.

instagram viewer

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

Damit ein Delphi-Formular die Daten aus einer Access-Datenbank mit der ADOQuery-Komponente abrufen kann, löschen Sie einfach alle die zugehörigen Datenzugriffs- und datensensitiven Komponenten darauf und stellen Sie eine Verknüpfung her, wie in den vorherigen Kapiteln beschrieben Kurs. Die Datenzugriffskomponenten: DataSource, ADOConnection zusammen mit ADOQuery (anstelle von ADOTable) und eine datensensitive Komponente wie DBGrid sind alles, was wir brauchen.
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
// Baue den ConnectionString
ADOConnection1.ConnectionString = ...
ADOConnection1.LoginPrompt = False

SQL-Abfrage durchführen

Die TADOQuery-Komponente hat keine TabellennameEigenschaft wie die TADOTable. TADOQuery hat eine Eigenschaft (TStrings) namens SQL Hiermit wird die SQL-Anweisung gespeichert. Sie können den Wert der SQL-Eigenschaft zur Entwurfszeit mit dem 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 Anweisungstyp auf zwei Arten ausgeführt werden. Die Data Definition Language-Anweisungen werden im Allgemeinen mit dem 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 (normalen) SQL-Anweisungen werden durch Setzen von TADOQuery. Aktiv Eigentum an Wahr oder indem Sie die anrufenÖ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 beginnen Schließen; 
SQL.Clear;
SQL.Add: = 'SELECT * FROM Authors' SQL.Add: = 'ORDER BY authorname DESC' Open;
Ende;

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

Beachten Sie, dass das Erstellen einer dauerhaften Liste von Feldobjekten für eine ADOQuery-Komponente offensichtlich keinen Sinn ergibt. Wenn Sie das nächste Mal die Open-Methode aufrufen, kann die SQL so unterschiedlich sein, dass sich der gesamte Satz von Dateinamen (und -typen) ändern kann. Dies ist natürlich nicht der Fall, wenn wir ADOQuery verwenden, um die Zeilen aus nur einer Tabelle mit der konstanten Menge von Feldern abzurufen - 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 die flexible Auswahl von Zeilen / Spalten mithilfe eines Parameters in der WHERE-Klausel einer SQL-Anweisung. Die Params-Eigenschaft ermöglicht austauschbare 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 zum Angeben eines Parameters in einer Abfrage einen Doppelpunkt (:) vor einem Parameternamen.
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 wird benanntApp-Typ. Wir können die Werte der Parameter in der Params-Auflistung zur Entwurfszeit über das Dialogfeld Parameter festlegen, aber die meiste Zeit werden wir die Parameter zur Laufzeit ändern. 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. In Anbetracht der obigen SQL-Anweisung könnten wir zur Laufzeit beispielsweise 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 einen Satz oder Datensätze aus einer Tabelle (oder zwei oder mehr) zurück. Das Navigieren durch ein Dataset erfolgt mit denselben Methoden wie im Kapitel "Hinter Daten in Datasets" beschrieben.

Navigieren und Bearbeiten der Abfrage

Im Allgemeinen sollte die ADOQuery-Komponente nicht verwendet werden, wenn die Bearbeitung stattfindet. Die SQL-basierten Abfragen werden hauptsächlich für Berichtszwecke verwendet. Wenn Ihre Abfrage eine Ergebnismenge zurückgibt, ist es manchmal möglich, das zurückgegebene Dataset zu bearbeiten. Die Ergebnismenge muss Datensätze aus einer einzelnen Tabelle enthalten und darf keine SQL-Aggregatfunktionen verwenden. Das Bearbeiten eines von ADOQuery zurückgegebenen Datasets entspricht dem Bearbeiten des ADOTAble-Datasets.

Beispiel

Um eine ADOQuery-Aktion zu sehen, codieren wir ein kleines Beispiel. Lassen Sie uns eine Abfrage erstellen, 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. Die GetTableNames im OnCreate-Ereignis des Formulars füllen die ComboBox mit den Tabellennamen, und die Schaltfläche wird verwendet, um die Abfrage zu schließen und neu zu erstellen, um die Datensätze aus einer ausgewählten Tabelle abzurufen. Die () Ereignishandler sollten folgendermaßen aussehen:

procedure TForm1.FormCreate (Sender: TObject);
Start
ADOConnection1.GetTableNames (ComboBox1.Items);
Ende;
Prozedur TForm1.Button1Click (Absender: TObject);
var tblname: string;
Start
wenn ComboBox1.ItemIndex dann 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.

instagram story viewer