Utilisation de requêtes Delphi avec ADO

Le composant TADOQuery offre aux développeurs Delphi la possibilité de récupérer des données d'une ou plusieurs tables d'une base de données ADO à l'aide de SQL.

Ces instructions SQL peuvent être des instructions DDL (Data Definition Language) telles que CREATE TABLE, ALTER INDEX, etc., ou elles peuvent être des instructions DML (Data Manipulation Language), telles que SELECT, UPDATE et DELETE. L'instruction la plus courante, cependant, est l'instruction SELECT, qui produit une vue similaire à celle disponible à l'aide d'un composant Table.

Remarque: même si l'exécution de commandes à l'aide du composant ADOQuery est possible, le ADOCommandest plus approprié à cet effet. Il est le plus souvent utilisé pour exécuter des commandes DDL ou pour exécuter une procédure stockée (même si vous devez utiliser le paramètreTADOStoredProc pour de telles tâches) qui ne renvoie pas un jeu de résultats.

Le SQL utilisé dans un composant ADOQuery doit être acceptable pour le pilote ADO utilisé. En d'autres termes, vous devez être familier avec les différences d'écriture SQL entre, par exemple, MS Access et MS SQL.

Comme lorsque vous travaillez avec le composant ADOTable, les données d'une base de données sont accessibles à l'aide d'une connexion au magasin de données établie par le composant ADOQuery à l'aide de sonChaîne de connexion ou via un composant ADOConnection distinct spécifié dans la propriété Lienpropriété.

Pour créer un formulaire Delphi capable de récupérer les données d'une base de données Access avec le composant ADOQuery, déposez simplement tous les composants d'accès aux données et sensibles aux données et créez un lien comme décrit dans les chapitres précédents de ce cours. Les composants d'accès aux données: DataSource, ADOConnection avec ADOQuery (au lieu d'ADOTable) et un composant orienté données comme DBGrid est tout ce dont nous avons besoin.
Comme déjà expliqué, en utilisant l'inspecteur d'objets, définissez le lien entre ces composants comme suit:

DBGrid1.DataSource = DataSource1
DataSource1.DataSet = ADOQuery1
ADOQuery1.Connection = ADOConnection1
// construire la ConnectionString
ADOConnection1.ConnectionString =…
ADOConnection1.LoginPrompt = False

Faire une requête SQL

Le composant TADOQuery n'a pas de Nom de la tablecomme le fait le TADOTable. TADOQuery a une propriété (TStrings) appelée SQL qui est utilisé pour stocker l'instruction SQL. Vous pouvez définir la valeur de la propriété SQL avec l'inspecteur d'objets au moment de la conception ou via le code lors de l'exécution.

Au moment du design, appelez l'éditeur de propriétés pour la propriété SQL en cliquant sur le bouton points de suspension dans l'inspecteur d'objets. Tapez l'instruction SQL suivante: "SELECT * FROM Authors".

L'instruction SQL peut être exécutée de deux manières, selon le type de l'instruction. Les instructions du langage de définition de données sont généralement exécutées avec le ExecSQL méthode. Par exemple, pour supprimer un enregistrement spécifique d'une table spécifique, vous pouvez écrire une instruction DELETE DDL et exécuter la requête avec la méthode ExecSQL.
Les instructions SQL (ordinaires) sont exécutées en définissant TADOQuery.Active propriété à Vrai ou en appelant leOuvert méthode (essentiellement la même). Cette approche est similaire à la récupération des données d'une table avec le composant TADOTable.

Au moment de l'exécution, l'instruction SQL dans la propriété SQL peut être utilisée comme n'importe quel objet StringList:

avec ADOQuery1 commencez Fermer;
SQL.Clear;
SQL.Add: = 'SELECT * FROM Authors' SQL.Add: = 'ORDER BY authorname DESC' Open; 
fin;

Le code ci-dessus, au moment de l'exécution, ferme l'ensemble de données, vide la chaîne SQL dans la propriété SQL, attribue une nouvelle commande SQL et active l'ensemble de données en appelant la méthode Open.

Notez que la création d'une liste persistante d'objets de champ pour un composant ADOQuery n'a évidemment aucun sens. La prochaine fois que vous appelez la méthode Open, le SQL peut être si différent que l'ensemble des noms (et types) déposés peut changer. Bien sûr, ce n'est pas le cas si nous utilisons ADOQuery pour extraire les lignes d'une seule table avec l'ensemble constant de champs - et l'ensemble résultant dépend de la partie WHERE de l'instruction SQL.

Requêtes dynamiques

L'une des grandes propriétés des composants TADOQuery est la Params propriété. Une requête paramétrée est une requête qui permet une sélection flexible de lignes / colonnes à l'aide d'un paramètre dans la clause WHERE d'une instruction SQL. La propriété Params autorise les paramètres remplaçables dans l'instruction SQL prédéfinie. Un paramètre est un espace réservé pour une valeur de la clause WHERE, définie juste avant l'ouverture de la requête. Pour spécifier un paramètre dans une requête, utilisez deux points (:) précédant un nom de paramètre.
Au moment du design, utilisez l'inspecteur d'objets pour définir la propriété SQL comme suit:

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

Lorsque vous fermez la fenêtre de l'éditeur SQL, ouvrez la fenêtre Paramètres en cliquant sur le bouton points de suspension dans l'inspecteur d'objets.

Le paramètre de l'instruction SQL précédente est nommétype d'application. Nous pouvons définir les valeurs des paramètres dans la collection Params au moment de la conception via la boîte de dialogue Paramètres, mais la plupart du temps, nous modifierons les paramètres au moment de l'exécution. La boîte de dialogue Paramètres peut être utilisée pour spécifier les types de données et les valeurs par défaut des paramètres utilisés dans une requête.

Au moment de l'exécution, les paramètres peuvent être modifiés et la requête réexécutée pour actualiser les données. Afin d'exécuter une requête paramétrée, il est nécessaire de fournir une valeur pour chaque paramètre avant l'exécution de la requête. Pour modifier la valeur du paramètre, nous utilisons la propriété Params ou la méthode ParamByName. Par exemple, étant donné l'instruction SQL comme ci-dessus, au moment de l'exécution, nous pourrions utiliser le code suivant:

avec ADOQuery1 commencez
Fermer;
SQL.Clear;
SQL.Add ('SELECT * FROM Applications WHERE type =: apptype');
ParamByName ('apptype'). Value: = 'multimedia';
Ouvert;
fin;

Comme lorsque vous travaillez avec le composant ADOTable, ADOQuery renvoie un ensemble ou des enregistrements d'une table (ou deux ou plus). La navigation dans un ensemble de données se fait avec le même ensemble de méthodes que celui décrit dans le chapitre "Derrière les données dans les ensembles de données".

Navigation et modification de la requête

En général, le composant ADOQuery ne doit pas être utilisé lors de la modification. Les requêtes basées sur SQL sont principalement utilisées à des fins de génération de rapports. Si votre requête renvoie un ensemble de résultats, il est parfois possible de modifier l'ensemble de données renvoyé. Le jeu de résultats doit contenir des enregistrements d'une seule table et il ne doit utiliser aucune fonction d'agrégation SQL. L'édition d'un ensemble de données retourné par l'ADOQuery revient à éditer l'ensemble de données de l'ADOTAble.

Exemple

Pour voir une action ADOQuery, nous allons coder un petit exemple. Faisons une requête qui peut être utilisée pour récupérer les lignes de différentes tables dans une base de données. Pour afficher la liste de toutes les tables d'une base de données, nous pouvons utiliser le GetTableNamesméthode du ADOConnection composant. Le GetTableNames dans l'événement OnCreate du formulaire remplit le ComboBox avec les noms de table et le Button est utilisé pour fermer la requête et le recréer pour récupérer les enregistrements d'une table sélectionnée. Les gestionnaires d'événements () doivent ressembler à:

procédure TForm1.FormCreate (Sender: TObject);
commencer
ADOConnection1.GetTableNames (ComboBox1.Items);
fin;
procédure TForm1.Button1Click (Sender: TObject);
var tblname: string;
commencer
si ComboBox1.ItemIndex alors Quittez;
tblname: = ComboBox1.Items [ComboBox1.ItemIndex];
avec ADOQuery1 commencez
Fermer;
SQL.Text: = 'SELECT * FROM' + tblname;
Ouvert;
fin;
fin;

Notez que tout cela peut être fait en utilisant ADOTable et sa propriété TableName.