jeudi 28 novembre 2002

Requête paramétrée


REQUÊTE PARAMÉTRÉE

Les requêtes paramétrées servent à effectuer des requêtes SQL dynamiques. Le contenu de la requête peut donc varier. C'est très utile lorsque la requête dépend de la saisie d'un utilisateur venant d'un textbox, maskedit... De plus, ça permet d'économiser de la bande passante ce qui n'est pas le cas avec un dblookupbox.

Dans cet exemple nous avons une table client qui contient les champs: nom, prénom, adresse, téléphone, nopermis. Après avoir tapé un numéro de permis de conduire (nopermis) l'information du client sera affichée dans la propriété SQL d'un SQLquery, ibquery... nous entrons par exemple

select NOM, NOPERMIS, PRENOM from CLIENT where nopermis = :nopermis

Cette requêtant étant dans la propriété SQL du ibquery. Le «:» devant nopermis signifie que c'est un paramètre. Il ne reste plus qu'à mettre la valeur du paramètre comme étant notre textbox, maskedit... J'effectue souvent cette opération soit après avoir cliqué sur un bouton ou après être sortie du composant en question.

procedure TfrmLocation.MaskEditExit(Sender: TObject);
begin
  datamodule.query.Active := False;
  datamodule.query.Params[0].AsString := MaskEdit.Text;
  datamodule.query.Active := True;
end;
 

Il est possible d'utiliser la propriété ParamByName au lieu de Params. Le risque d'erreur est plus grand avec Params
lorsqu'on a quelques paramètres. Il est plus difficile de se rappeler ce qu'est le Params[0], Params[1]... que de faire
référence directement à son nom.
Le code ci-dessous permet de voir comment effectuer la même chose, mais avec un ibSQL.

ibsTmp.Close;
ibsTmp.SQL.Clear;
ibsTmp.SQL.Add('select NOM, NOPERMIS, PRENOM from CLIENT where nopermis = :nopermis');
ibsTmp.ParamByName('nopermis').AsString := MaskEdit.Text;
ibsTmp.ExecQuery;


Si la requête ci-dessus nous retournait une valeur, on pourrait affecter ces valeurs à des tlabel.
 
lblNom.Caption := ibsTmp.FieldByName('nom').AsString;
lblPrenom.Caption := ibsTmp.FieldByName('prenom').AsString;
lblNoPermis.Caption := ibsTmp.FieldByName('nopermis').AsString;