DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / WLangage / Gestion des bases de données / HFSQL / Fonctions HFSQL
  • Texte de la requête SQL
  • Exécuter une requête SQL paramétrée
  • Injection SQL : Comment s'en prémunir ?
  • Jointures
  • Pourquoi utiliser la constante hRequêteSansCorrection ?
  • Condition sur une clé composée dans une requête SQL
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac CatalystUniversal Windows 10 App
Autres
Procédures stockées
HExécuteRequêteSQLAsynchrone (Fonction)
En anglais : HExecuteSQLQueryAsynchronous
Exécute une requête SQL de manière asynchrone. Cette requête SQL peut correspondre :
  • au code SQL saisi directement dans la fonction HExécuteRequêteSQLAsynchrone.
  • à une variable de type Requête SQL.
Conditions d'utilisation :
  • Ce mode est prévu pour des requêtes ayant un temps d'exécution de plusieurs secondes. Pour une requête immédiate ou quasi immédiate, ce mécanisme ralentit "trop" la requête.
  • La requête doit être de type "SELECT" : elle doit renvoyer des enregistrements.
  • L'exécution d'une requête en mode asynchrone peut être effectuée uniquement à partir du contexte principal. Dans les autres cas, il est nécessaire d'utiliser des threads.
  • Cette fonction ne permet pas de passer les paramètres à une requête paramétrée. Les paramètres doivent être passés avant l'exécution de la requête.
AndroidWidget Android Il n'est pas possible d'exécuter des requêtes dont le code SQL contient des fonctions WLangage.
Exemple
REQ_WDRSQL est une Source de Données
HExécuteRequêteSQLAsynchrone(REQ_WDRSQL, MaConnexionCS2, hRequêteDéfaut, "SELECT * FROM CLIENT"
MaProcedurePourChaqueEnregistrement, MaProcedureFinale)
 
 
PROCÉDURE INTERNE MaProcedurePourChaqueEnregistrement(enreg est un Enregistrement)
Trace("Procédure de traitement de chaque Enregistrement" + enreg.NomRubrique)
FIN
 
PROCÉDURE INTERNE MaProcedureFinale(MonRes est un entier)
Trace("Procédure de traitement du résultat final")
SELON MonRes
CAS heraOK :
Trace("La requête et le traitement des enregistrements se sont bien exécutés.")
CAS heraAnnulée :
Trace("Un traitement a renvoyé Faux. La requête et les procédures ont été annulées.")
AUTRE CAS :
Trace("Une procédure ou l'exécution de la requête a rencontré une erreur.")
FIN
FIN
Syntaxe

Exécuter une requête SQL (sans connexion) Masquer les détails

<Résultat> = HExécuteRequêteSQLAsynchrone(<Requête> [, <Mode>] , <Texte de la requête en SQL> , <Procédure WLangage pour chaque enregistrement> [, <Procédure WLangage de fin>])
<Résultat> : booléen
  • Vrai si l'initialisation de la requête a été effectuée,
  • Faux dans le cas contraire. La fonction HErreur permet d'obtenir plus d'informations sur le problème rencontré.
<Requête> : Chaîne de caractères ou Source de données
  • Nom de la requête qui va être exécutée. Ce nom permet de manipuler par programmation le résultat de <Texte de la requête en SQL>. Si une requête de même nom est déjà déclarée, elle est remplacée par la nouvelle requête.
  • Nom de la variable de type Requête SQL contenant le code SQL de la requête. Dans ce cas, le paramètre <Texte de la requête en SQL> ne doit pas être précisé.
<Mode> : Constante optionnelle de type Entier
Option pour l'initialisation de la requête :
hRequêteDéfaut
(valeur par défaut)
Initialisation de la requête.
hRequêteSansCorrection
Connecteurs Natifs (Accès Natifs) Le moteur HFSQL n'effectue aucune vérification de la requête. Cette option doit être utilisée si la requête comporte des ordres spécifiques à un type de connexion (Oracle, SQL Server, ...).
Attention : si cette constante est utilisée :
  • il est nécessaire de préciser le nom de la connexion (paramètre <Connexion>).
  • la fonction suivante ne peut pas être utilisée sur la requête manipulée : HFiltre.
  • il n'est pas possible d'annuler une condition en l'affectant à NULL.
  • il est conseillé de ne pas spécifier de rubrique de parcours dans les fonctions suivantes : HDernier, HLitDernier, HLitPremier, HPremier, HRechercheDernier, HRecherchePremier.
hRequêteSansCorrectionHF
HFSQL Classic Le moteur HFSQL n'effectue aucune vérification du format de fichier de données (complété par des espaces ou non). A utiliser si la requête manipule à la fois des fichiers de données HFSQL au format complété par des espaces et des fichiers de données HFSQL au format non complété par des espaces.
hSansBind
Connecteurs Natifs (Accès Natifs) SQL Server, Oracle, Sybase : Permet d'exécuter une requête sans que le bind soit activé.

AndroidWidget Android Ce paramètre peut prendre uniquement la valeur hRequêteDéfaut. Si une autre constante est utilisée, une erreur est générée.
<Texte de la requête en SQL> : Chaîne de caractères
Texte de la requête SQL à exécuter. Ce texte peut correspondre à une chaîne de caractères au format ANSI ou au format Unicode.
AndroidWidget Android Il n'est pas possible d'exécuter des requêtes dont le code SQL contient des fonctions WLangage.
Ce paramètre n'est pas disponible si <Nom de la requête> correspond à une variable de type Requête SQL.
<Procédure WLangage pour chaque enregistrement> : Nom de procédure
Procédure WLangage (également nommée "callback") exécutée pour chaque enregistrement correspondant à la requête trouvée. Cette procédure est de la forme :
PROCEDURE <Nom de la procédure>(UnEnreg est un Enregistrement)
où <UnEnreg> est une variable de type Enregistrement correspondant à l'enregistrement en cours (pour la requête exécutée).
Par défaut, le procédure renvoie Vrai et passe à l'enregistrement suivant.
Si cette procédure renvoie Faux, la requête est annulée et la procédure <Procédure WLangage de fin> est exécutée.
<Procédure WLangage de fin> : Nom de procédure optionnel
Procédure WLangage (également nommée "callback") exécutée à la fin de l'exécution de la requête. Cette procédure est de la forme :
PROCEDURE <Nom de la procédure>(nRésultat est un entier)
où <nRésultat> est une constante de type Entier qui peut correspondre aux valeurs suivantes :
heraAnnuléeLa procédure exécutée pour chaque enregistrement a renvoyé Faux. La requête et les différentes procédures ont été annulées.
heraErreurLa requête et/ou la procédure appelée pour chaque enregistrement ont rencontré une erreur. Il est possible de connaître l'erreur avec la fonction HErreurInfo.
heraOKLa requête et la procédure exécutée pour chaque enregistrement se sont correctement déroulées.

Exécuter une requête SQL via une connexion Masquer les détails

<Résultat> = HExécuteRequêteSQLAsynchrone(<Requête> [, <Connexion> [, <Mode>]] , <Texte de la requête en SQL> , <Procédure WLangage pour chaque enregistrement> [, <Procédure WLangage de fin>])
<Résultat> : Booléen
  • Vrai si l'initialisation de la requête a été effectuée,
  • Faux dans le cas contraire. La fonction HErreur permet d'obtenir plus d'informations sur le problème rencontré.
<Requête> : Chaîne de caractères ou source de données
  • Nom de la requête qui va être exécutée. Ce nom permet de manipuler par programmation le résultat de <Texte de la requête en SQL>. Si une requête de même nom est déjà déclarée, elle est remplacée par la nouvelle requête.
  • Nom de la variable de type Requête SQL contenant le code SQL de la requête. Dans ce cas, le paramètre <Texte de la requête en SQL> ne doit pas être précisé.
<Connexion> : Chaîne de caractères optionnelle ou variable de type Connexion
Connexion utilisée pour exécuter la requête. Cette connexion correspond : Si ce paramètre ne correspond pas à une connexion existante, <Résultat> est à Faux.
<Mode> : Constante optionnelle de type Entier
Option pour l'initialisation de la requête :
hRequêteDéfaut
(valeur par défaut)
Initialisation de la requête.
hRequêteSansCorrection
Connecteurs Natifs (Accès Natifs) Le moteur HFSQL n'effectue aucune vérification de la requête. Cette option doit être utilisée si la requête comporte des ordres spécifiques à un type de connexion (Oracle, SQL Server, ...).
Attention : si cette constante est utilisée :
  • il est nécessaire de préciser le nom de la connexion (paramètre <Connexion>).
  • la fonction suivante ne peut pas être utilisée sur la requête manipulée : HFiltre.
  • il n'est pas possible d'annuler une condition en l'affectant à NULL.
  • il est conseillé de ne pas spécifier de rubrique de parcours dans les fonctions suivantes : HDernier, HLitDernier, HLitPremier, HPremier, HRechercheDernier, HRecherchePremier.
hRequêteSansCorrectionHF
HFSQL Classic Le moteur HFSQL n'effectue aucune vérification du format de fichier de données (complété par des espaces ou non). A utiliser si la requête manipule à la fois des fichiers de données HFSQL au format complété par des espaces et des fichiers de données HFSQL au format non complété par des espaces.
hSansBind
Connecteurs Natifs (Accès Natifs) SQL Server, Oracle, Sybase : Permet d'exécuter une requête sans que le bind soit activé.

AndroidWidget Android Ce paramètre peut prendre uniquement la valeur hRequêteDéfaut. Si une autre constante est utilisée, une erreur est générée.
<Texte de la requête en SQL> : Chaîne de caractères
Texte de la requête SQL à exécuter. Ce texte peut correspondre à une chaîne de caractères au format ANSI ou au format Unicode.
AndroidWidget Android Il n'est pas possible d'exécuter des requêtes dont le code SQL contient des fonctions WLangage.
Ce paramètre n'est pas disponible si <Nom de la requête> correspond à une variable de type Requête SQL.
<Procédure WLangage pour chaque enregistrement> : Nom de procédure
Procédure WLangage (également nommée "callback") exécutée pour chaque enregistrement correspondant à la requête trouvée. Cette procédure est de la forme :
PROCEDURE <Nom de la procédure>(UnEnreg est un Enregistrement)
où <UnEnreg> est une variable de type Enregistrement correspondant à l'enregistrement en cours (pour la requête exécutée).
Par défaut, le procédure renvoie Vrai et passe à l'enregistrement suivant.
Si cette procédure renvoie Faux, la requête est annulée et la procédure <Procédure WLangage de fin> est exécutée.
<Procédure WLangage de fin> : Nom de procédure optionnel
Procédure WLangage (également nommée "callback") exécutée à la fin de l'exécution de la requête. Cette procédure est de la forme :
PROCEDURE <Nom de la procédure>(nRésultat est un entier)
où <nRésultat> est une constante de type Entier qui peut correspondre aux valeurs suivantes :
heraAnnuléeLa procédure exécutée pour chaque enregistrement a renvoyé Faux. La requête et les différentes procédures ont été annulées.
heraErreurLa requête et/ou la procédure appelée pour chaque enregistrement ont rencontré une erreur. Il est possible de connaître l'erreur avec la fonction HErreurInfo.
heraOKLa requête et la procédure exécutée pour chaque enregistrement se sont correctement déroulées.
Remarques

Texte de la requête SQL

Si un nom de fichier de données ou un nom de rubrique contient des espaces, il est nécessaire d'entourer ces noms par des crochets dans le texte de la requête. Par exemple :
SELECT [Mon Fichier1].MaRubrique, [Mon Fichier1].[Ma rubrique1], MonFichier2.[Ma clé1]
FROM [Mon Fichier1], MonFichier2
WHERE [Mon Fichier1].[Ma clé1] = MonFichier2.[Ma clé1]

Exécuter une requête SQL paramétrée

Une requête SQL peut contenir des paramètres. Pour exécuter ce type de requête SQL avec la fonction HExécuteRequêteSQLAsynchrone, il faut :
  1. Dans le texte de la requête SQL, définir les différents paramètres en utilisant la notation {Nom du paramètre}. Par exemple :
    "SELECT * FROM client WHERE nom={p_nom}"
  2. Définir une variable de type Source de données. Le nom de cette variable doit correspondre au paramètre <Nom de la requête> de la fonction HExécuteRequêteSQLAsynchrone.
    Exemple :
    MaRequête est une Source de Données
  3. Spécifier la valeur des paramètres, via la syntaxe suivante :
    <Variable Source de données>.<Nom Paramètre1> = xxx
    <Variable Source de données>.<Nom Paramètre2> = xxx
    <Variable Source de données>.<Nom Paramètre3> = xxx

    Exemple :
    MaRequête.p_nom = "Dupont"
  4. Exécuter la requête SQL avec la fonction HExécuteRequêteSQLAsynchrone. Exemple :
    HExécuteRequêteSQLAsynchrone(MaRequête,
    "SELECT * FROM client WHERE nom={p_nom}",
    hRequêteDéfaut, maProcEnreg)
Remarque : A chaque exécution de la requête paramétrée, la structure des paramètres de la requête est ré-initialisée.
AndroidWidget Android Les requêtes paramétrées ne sont pas disponibles. Néanmoins, les variables de type 'Requête SQL' sont disponibles. Ce type de variable peut correspondre à une requête paramétrée. Pour plus de détails, consultez Variable de type Requête SQL.

Injection SQL : Comment s'en prémunir ?

L'injection SQL est une technique de piratage consistant à injecter du code SQL dans les paramètres des requêtes, forçant ainsi l'exécution de code SQL non désiré.
Pour éviter l'injection SQL lors de l'exécution de requêtes via la fonction HExécuteRequêteSQLAsynchrone, il est nécessaire d'utiliser des requêtes paramétrées et de ne pas concaténer des chaînes pour construire la requête.
L'utilisation de paramètres permet de ne pas interpréter le contenu comme étant du code SQL. Cette technique rend donc impossible l'injection de code SQL et élimine de nombreux risques de piratage.
AndroidWidget Android Les requêtes paramétrées ne sont pas disponibles. Néanmoins, les variables de type 'Requête SQL' sont disponibles. Ce type de variable peut correspondre à une requête paramétrée. Pour plus de détails, consultez Variable de type Requête SQL.
Connecteurs Natifs (Accès Natifs)

Jointures

Les jointures du type (A join B on x=y) join C on y=z ... ne sont pas gérées automatiquement par les Accès Natifs : il faut utiliser dans ce cas la constante hRequêteSansCorrection pour gérer ce type de jointure.
Remarque : Ces jointures sont gérées par le moteur HFSQL.
Connecteurs Natifs (Accès Natifs)

Pourquoi utiliser la constante hRequêteSansCorrection ?

Par défaut, WINDEV et WEBDEV interprètent les requêtes SQL :
  • réalisées via un Accès Natif,
  • réalisées sur OLEDB et sur ODBC via le provider OLE DB.
Pour que la requête ne soit pas interprétée, utilisez la constante hRequêteSansCorrection.
HRequêteSansCorrection n'est pas spécifiéHRequêteSansCorrection est spécifié
Détermination automatique de la connexion associée aux fichiers de données présents dans la requête.La connexion à utiliser doit être précisée dans la fonction HExécuteRequêteSQLAsynchrone.
Remplacement de tous les signes propriétaires PC SOFT (exemple : ']=' commence par) par leur équivalent en SQL standard.Aucun remplacement n'est effectué. Il est nécessaire d'utiliser les signes SQL standard.
Formatage des dates et des heures selon le format utilisée par la base de données utilisée.
Par exemple, les dates sont au format 'AAAAMMJJ' sous WINDEV et WEBDEV alors que sous Access, les dates sont au format #AAAAJJMM# ou #AAAAMMJJ# selon la langue du système.
Aucun formatage n'est effectué. Il est nécessaire d'utiliser le format reconnu par la base de données.
Formatage des flottants (le séparateur de décimal peut être '.' ou ',')Aucun formatage des flottants n'est réalisé.
Selon la base de données utilisée, remplacement des noms d'alias par les noms complets des rubriques dans les clauses Where, Order by et Group by
Par exemple, le moteur JET (Access, DBase, ...) n'accepte pas de noms d'alias dans la clause Where d'une requête
Aucun remplacement n'est effectué. Il est nécessaire d'utiliser directement dans le code de la requête les noms complets des rubriques dans les clauses Where, Order by et Group by.

Connecteurs Natifs (Accès Natifs) Cas particulier : Oracle et SQL Server : Si la requête à exécuter contient un script avec ":param" (Oracle) ou "@param" (SQL Server), il faut utiliser la combinaison de constantes hRequêteSansCorrection + hSansBind pour que la requête ne soit pas interprétée.

Condition sur une clé composée dans une requête SQL

Pour définir une condition sur une clé composée dans une requête SQL, il faut préciser les conditions de chacune des composantes de la clé.
Il ne faut pas tenter d'affecter directement la clé composée avec une valeur (en effet, les clés composées sont enregistrées sous forme de valeur binaire).
Exemple : La clé composée des rubriques NOM et PRENOM (rubrique NOMPRENOM) :
SELECT MonFichier.MaRubrique, MonFichier.MaRubrique1
FROM MonFichier
WHERE NomFichier.Nom = "Dupont" AND NomFichier.Prénom = "Florence"
Classification Métier / UI : Code métier
Composante : wd300hf.dll
Version minimum requise
  • Version 26
Documentation également disponible pour…
Commentaires
Cliquez sur [Ajouter] pour publier un commentaire

Dernière modification : 05/10/2022

Signaler une erreur ou faire une suggestion | Aide en ligne locale