DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / WLangage / Gestion des bases de données / HFSQL / Fonctions HFSQL
  • Lecture des données lors de l'initialisation
  • Texte de la requête SQL
  • Exécuter une requête SQL paramétrée
  • Injection SQL : Comment s'en prémunir ?
  • Insertion de données binaires
  • Jointures
  • Pourquoi utiliser la constante hRequêteSansCorrection ?
  • Condition sur une clé composée dans une requête SQL
  • Requêtes sur des fichiers de données HFSQL
  • Optimisation pour exécuter plusieurs fois une même requête (Accès natifs Oracle et SQL Server uniquement)
  • Spécifier et récupérer des valeurs lors de l'exécution d'une requête (cas des procédures stockées)
  • Requêtes SQL (fonction HExécuteRequêteSQL ou exécution de requêtes SQL créées par l'éditeur de requêtes)
  • Parcours des requêtes (fonction HLitPremier)
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
Initialise une requête écrite en langage SQL et déclare cette requête au moteur HFSQL. Cette requête peut correspondre :
  • au code SQL saisi directement dans la fonction HExécuteRequêteSQL.
  • à une variable de type Requête SQL.
Le résultat de la requête pourra ensuite être parcouru. Si une requête de même nom existe déjà, cette requête est remplacée. Le résultat est re-calculé.
Fonctionnalité spécifique à HFSQL : Les requêtes SQL exécutées sur des bases de données HFSQL Classic, Mobile ou Client/Serveur peuvent contenir des fonctions WLangage. Pour plus de détails, consultez Utiliser une fonction WLangage dans une requête SQL.
Attention : Pour se positionner sur le premier enregistrement du résultat de la requête, utilisez par exemple la fonction HLitPremier.
Pour libérer les ressources d'une requête saisie dans la fonction HExécuteRequêteSQL, utilisez :
Remarque : une requête ne pourra pas être initialisée si :
  • le nom de la requête est déjà utilisée dans l'analyse en cours (nom de fichier de données ou nom défini par une des fonctions suivantes : HDéclare, HDéclareExterne, HDécritFichier).
  • une erreur de syntaxe est trouvée dans la requête.
Java Il n'est pas possible d'exécuter des requêtes dont le code SQL contient des fonctions WLangage.
ReqClient est une Source de Données
// Initialisation de la requête "Client"
HExécuteRequêteSQL(ReqClient, "SELECT NOM FROM CLIENT")
ReqTache est une Source de Données
// Initialisation de la requête "ReqTache"
// Cette requête utilise une fonction WLangage
// Cette requête sélectionne les tâches de plus de 5 jours
HExécuteRequêteSQL(ReqTache, ...
	"SELECT Tâche.Libellé FROM Tâche " +...
	"WHERE WL.DateDifférence(Tâche.DateDébut, Tâche.DateFin) > 5")
// Modification dynamique de la condition LIMIT d'une requête SQL

REQ est une Source de Données

sMaReq est une chaîne = [
SELECT * FROM
CODEPOSTAUX
%1
]

sMaReq = ChaîneConstruit(sMaReq, "LIMIT 1, 10")
SI PAS HExécuteRequêteSQL(REQ, hRequêteDéfaut, sMaReq) ALORS
	Erreur(HErreurInfo())
SINON
	Info("La requête contient " + HNbEnr(REQ) + " enregistrements.")
FIN
Syntaxe

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

<Résultat> = HExécuteRequêteSQL(<Requête> [, <Mode>] , <Texte de la requête en SQL>)
<Résultat> : Booléen
  • Vrai si l'initialisation de la requête SQL a été effectuée,
  • Faux dans le cas contraire. La fonction HErreurInfo 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 :
hAvecFiltre
(constante combinable avec les autres constantes)
Si ce paramètre est spécifié :
  • le résultat de la requête correspond à une sélection d'enregistrements de type filtre si le moteur HFSQL le permet. Sinon, le résultat de la requête est une vue HFSQL.
  • les opérations suivantes ne sont pas possibles : recherche sur le résultat de la requête, requête sur requête, vue sur requête, requête sur vue.
  • les rubriques de parcours spécifiées lors du parcours du résultat ne sont pas prises en compte.
  • la loupe n'est pas disponible sur les tables liées à une requête.
  • la fonction hNbEnr ne peut pas être utilisée sur les requêtes.
    Attention : si cette option est précisée, l'utilisation de la constante hModifieFichier est automatique.
Si ce paramètre n'est pas spécifié (par défaut) :
  • le résultat de la requête correspond à une vue HFSQL.
  • il est possible de réaliser les opérations suivantes sur les requêtes : recherche sur le résultat de la requête, requête sur requête, vue sur requête, requête sur vue.
  • les rubriques de parcours spécifiées lors du parcours du résultat sont prises en compte.
  • la loupe est disponible sur les tables liées à une requête.
  • la fonction hNbEnr peut être utilisée sur les requêtes.
Java Accès par JDBC : Cette constante n'est pas disponible.
hAvecTransactionSeules les requêtes d'écriture (INSERT, UPDATE et DELETE) sont exécutées dans une transaction.
Une transaction est démarrée, les enregistrements sont bloqués en écriture pendant l'exécution de la requête et débloqués à la fin de son exécution, que la requête échoue ou non. La transaction est donc toujours terminée à la fin de l'exécution de la fonction HExécuteRequêteSQL. Pour les requêtes d'écriture, il n'y a pas de source de données : l'appel de la fonction HLibèreRequete est inutile.
Si la requête ne peut pas se terminer normalement (blocage d'enregistrements, coupure de courant, ...), la transaction est annulée et les fichiers de données sont remis dans l'état avant l'exécution de la requête.
Remarque : l'exécution de la requête pourra être fortement ralentie.
Java Cette constante n'est pas disponible.
hModifieFichier
(constante combinable avec les autres constantes)
  • Sur des fichiers de données HFSQL : Lors de la modification du résultat de la requête (fonctions HAjoute, HEcrit, HModifie, HRaye, HSupprime), ces modifications seront reportées dans les fichiers de données intervenant dans la requête.
    Si cette option n'est pas précisée, seul le résultat de la requête est modifié.
    Pour plus de détails sur la modification du résultat d'une requête, consultez Modifier le contenu d'une requête.
  • Sur des fichiers de données non HFSQL, la constante hModifieFichier est inutile : les fichiers de données intervenant dans la requête sont automatiquement modifiés lors de la modification du résultat de la requête.
Java Accès par JDBC : Cette constante n'est pas disponible.
hRequêteDéfaut
(valeur par défaut)
Initialisation de la requête sans interruption.
hRequêteInterruptibleL'initialisation de la requête peut être interrompue avec la touche ECHAP.
Universal Windows 10 App Cette constante n'est pas disponible.
Procédures stockées Cette constante est ignorée.
Java Accès par JDBC : Cette constante n'est pas disponible.
HFSQL Client/Serveur La touche Echap doit être utilisée sur le poste client.
hRequêteSansCorrection
OLE DBConnecteurs 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.
Universal Windows 10 App Cette constante n'est pas disponible.
hSansBind
Connecteurs Natifs (Accès Natifs) SQL Server, Oracle, Sybase : Permet d'exécuter une requête sans que le bind soit activé.
hSansSablierLors de la lecture du résultat de la requête, cette lecture peut être bloquée et un sablier apparaît par défaut. Cette constante permet de ne pas afficher de sablier dans ce cas.
hSQLUnicodePermet de spécifier que le texte de la requête doit être envoyé sous forme Unicode au serveur.
hTemporisePour les requêtes UPDATE et DELETE s'appliquant sur beaucoup d'enregistrements et étant relativement longues, cette constante permet de laisser la main aux autres applications utilisant les fichiers de données.
Dans ce cas :
  • la requête s'exécute un peu plus lentement,
  • le serveur de fichiers n'est pas saturé,
  • les autres utilisateurs des fichiers de données peuvent continuer à y accéder sans rencontrer de blocage.
HFSQL Client/ServeurOLE DBConnecteurs Natifs (Accès Natifs) Cette constante est ignorée.


Java Accès par JDBC : Cette constante n'est pas disponible.
hVérifieDoublonActive la gestion des doublons pendant l'exécution de la requête. Si une erreur de doublons est détectée, la requête n'est pas exécutée.
Cette constante force la constante hAvecTransaction. Une transaction est démarrée, les enregistrements sont bloqués en écriture pendant l'exécution de la requête et débloqués à la fin de son exécution, que la requête échoue ou non. Si l'application est arrêtée pendant l'exécution de la requête (coupure de courant par exemple), la transaction sera annulée à la prochaine utilisation des fichiers de données de la requête.
Remarque : l'exécution de la requête pourra être fortement ralentie.
HFSQL Client/Serveur Si la constante hVérifieDoublon n'est pas spécifiée, la gestion des doublons est débranchée. Or, si l'utilisateur n'a pas les droits pour débrancher la gestion des doublons (fonction HModifieDroitBaseDeDonnées) et si une gestion des doublons doit être réalisée, une erreur de droit est affichée.
Java Accès par JDBC : Cette constante n'est pas disponible.
hVérifieIntégritéActive la gestion de l'intégrité pendant l'exécution de la requête. Si une erreur d'intégrité est détectée, la requête n'est pas exécutée.
Cette constante force la constante hAvecTransaction. Une transaction est démarrée, les enregistrements sont bloqués en écriture pendant l'exécution de la requête et débloqués à la fin de son exécution, que la requête échoue ou non. Si l'application est arrêtée pendant l'exécution de la requête (coupure de courant par exemple), la transaction sera annulée à la prochaine utilisation des fichiers de données de la requête.
Remarque : l'exécution de la requête pourra être fortement ralentie.
HFSQL Client/Serveur Si la constante hVérifieIntégrité n'est pas spécifiée, la gestion de l'intégrité est débranchée. Or si l'utilisateur n'a pas les droits pour débrancher la gestion de l'intégrité (fonction HModifieDroitBaseDeDonnées) et si une gestion de l'intégrité doit être réalisée, une erreur de droit est affichée.
Java Accès par JDBC : Cette constante n'est pas disponible.
Java Accès par JDBC : 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.
Java 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.

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

<Résultat> = HExécuteRequêteSQL(<Requête> [, <Connexion> [, <Mode>]] , <Texte de la requête en SQL>)
<Résultat> : Booléen
  • Vrai si l'initialisation de la requête SQL a été effectuée,
  • Faux dans le cas contraire. La fonction HErreurInfo 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 :
hAvecFiltre
(constante combinable avec les autres constantes)
Si ce paramètre est spécifié :
  • le résultat de la requête correspond à une sélection d'enregistrements de type filtre si le moteur HFSQL le permet. Sinon, le résultat de la requête est une vue HFSQL.
  • les opérations suivantes ne sont pas possibles : recherche sur le résultat de la requête, requête sur requête, vue sur requête, requête sur vue.
  • les rubriques de parcours spécifiées lors du parcours du résultat ne sont pas prises en compte.
  • la loupe n'est pas disponible sur les tables liées à une requête.
  • la fonction hNbEnr ne peut pas être utilisée sur les requêtes.
    Attention : si cette option est précisée, l'utilisation de la constante hModifieFichier est automatique.
Si ce paramètre n'est pas spécifié (par défaut) :
  • le résultat de la requête correspond à une vue HFSQL.
  • il est possible de réaliser les opérations suivantes sur les requêtes : recherche sur le résultat de la requête, requête sur requête, vue sur requête, requête sur vue.
  • les rubriques de parcours spécifiées lors du parcours du résultat sont prises en compte.
  • la loupe est disponible sur les tables liées à une requête.
  • la fonction hNbEnr peut être utilisée sur les requêtes.
Java Accès par JDBC : Cette constante n'est pas disponible.
hAvecTransactionSeules les requêtes d'écriture (INSERT, UPDATE et DELETE) sont exécutées dans une transaction.
Une transaction est démarrée, les enregistrements sont bloqués en écriture pendant l'exécution de la requête et débloqués à la fin de son exécution, que la requête échoue ou non. La transaction est donc toujours terminée à la fin de l'exécution de la fonction HExécuteRequêteSQL. Pour les requêtes d'écriture, il n'y a pas de source de données : l'appel de la fonction HLibèreRequete est inutile.
Si la requête ne peut pas se terminer normalement (blocage d'enregistrements, coupure de courant, ...), la transaction est annulée et les fichiers de données sont remis dans l'état avant l'exécution de la requête.
Remarque : l'exécution de la requête pourra être fortement ralentie.
Java Cette constante n'est pas disponible.
hModifieFichier
(constante combinable avec les autres constantes)
  • Sur des fichiers de données HFSQL : Lors de la modification du résultat de la requête (fonctions HAjoute, HEcrit, HModifie, HRaye, HSupprime), ces modifications seront reportées dans les fichiers de données intervenant dans la requête.
    Si cette option n'est pas précisée, seul le résultat de la requête est modifié.
    Pour plus de détails sur la modification du résultat d'une requête, consultez Modifier le contenu d'une requête.
  • Sur des fichiers de données non HFSQL, la constante hModifieFichier est inutile : les fichiers de données intervenant dans la requête sont automatiquement modifiés lors de la modification du résultat de la requête.
Java Accès par JDBC : Cette constante n'est pas disponible.
hRequêteDéfaut
(valeur par défaut)
Initialisation de la requête sans interruption.
hRequêteInterruptibleL'initialisation de la requête peut être interrompue avec la touche ECHAP.
Universal Windows 10 App Cette constante n'est pas disponible.
Procédures stockées Cette constante est ignorée.
Java Accès par JDBC : Cette constante n'est pas disponible.
HFSQL Client/Serveur La touche Echap doit être utilisée sur le poste client.
hRequêteSansCorrection
OLE DBConnecteurs 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.
Universal Windows 10 App Cette constante n'est pas disponible.
hSansBind
Connecteurs Natifs (Accès Natifs) SQL Server, Oracle, Sybase : Permet d'exécuter une requête sans que le bind soit activé.
hSansSablierLors de la lecture du résultat de la requête, cette lecture peut être bloquée et un sablier apparaît par défaut. Cette constante permet de ne pas afficher de sablier dans ce cas.
hSQLUnicodePermet de spécifier que le texte de la requête doit être envoyé sous forme Unicode au serveur.
hTemporisePour les requêtes UPDATE et DELETE s'appliquant sur beaucoup d'enregistrements et étant relativement longues, cette constante permet de laisser la main aux autres applications utilisant les fichiers de données.
Dans ce cas :
  • la requête s'exécute un peu plus lentement,
  • le serveur de fichiers n'est pas saturé,
  • les autres utilisateurs des fichiers de données peuvent continuer à y accéder sans rencontrer de blocage.
HFSQL Client/ServeurOLE DBConnecteurs Natifs (Accès Natifs) Cette constante est ignorée.


Java Accès par JDBC : Cette constante n'est pas disponible.
hVérifieDoublonActive la gestion des doublons pendant l'exécution de la requête. Si une erreur de doublons est détectée, la requête n'est pas exécutée.
Cette constante force la constante hAvecTransaction. Une transaction est démarrée, les enregistrements sont bloqués en écriture pendant l'exécution de la requête et débloqués à la fin de son exécution, que la requête échoue ou non. Si l'application est arrêtée pendant l'exécution de la requête (coupure de courant par exemple), la transaction sera annulée à la prochaine utilisation des fichiers de données de la requête.
Remarque : l'exécution de la requête pourra être fortement ralentie.
HFSQL Client/Serveur Si la constante hVérifieDoublon n'est pas spécifiée, la gestion des doublons est débranchée. Or, si l'utilisateur n'a pas les droits pour débrancher la gestion des doublons (fonction HModifieDroitBaseDeDonnées) et si une gestion des doublons doit être réalisée, une erreur de droit est affichée.
Java Accès par JDBC : Cette constante n'est pas disponible.
hVérifieIntégritéActive la gestion de l'intégrité pendant l'exécution de la requête. Si une erreur d'intégrité est détectée, la requête n'est pas exécutée.
Cette constante force la constante hAvecTransaction. Une transaction est démarrée, les enregistrements sont bloqués en écriture pendant l'exécution de la requête et débloqués à la fin de son exécution, que la requête échoue ou non. Si l'application est arrêtée pendant l'exécution de la requête (coupure de courant par exemple), la transaction sera annulée à la prochaine utilisation des fichiers de données de la requête.
Remarque : l'exécution de la requête pourra être fortement ralentie.
HFSQL Client/Serveur Si la constante hVérifieIntégrité n'est pas spécifiée, la gestion de l'intégrité est débranchée. Or si l'utilisateur n'a pas les droits pour débrancher la gestion de l'intégrité (fonction HModifieDroitBaseDeDonnées) et si une gestion de l'intégrité doit être réalisée, une erreur de droit est affichée.
Java Accès par JDBC : Cette constante n'est pas disponible.
Java Accès par JDBC : 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.
Java 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.
Remarques

Lecture des données lors de l'initialisation

Selon la requête (tris, groupes, ...), les données peuvent ou non être lues au moment de l'initialisation de la requête.
Remarque : La propriété ExécutionTerminée permet de savoir si le remplissage de la requête est terminé (et donc si les lectures peuvent être effectuées sans blocage).
Pour accéder aux rubriques de la requête, il faut déclarer une variable de type Source de données (voir Exemple). La requête est alors libérée automatiquement lorsque la variable est détruite. Pour forcer la libération des ressources de cette requête, utilisez :

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êteSQL, 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êteSQL.
    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êteSQL. Exemple :
    HExécuteRequêteSQL(MaRequête, "SELECT * FROM client WHERE nom={p_nom}")
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.

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êteSQL, 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.
Exemple :
// Construction de la requête par concaténation
// -> faille de sécurité
sdReq est une Source de Données
HExécuteRequêteSQL(sdReq, "SELECT * FROM client WHERE nom = '" + SAI_Nom + "'")
// Utilisation de paramètres dans la requête
// -> code sûr et sécurisé
sdReq est une Source de Données
sdReq.p_nom = SAI_Nom
HExécuteRequêteSQL(sdReq, "SELECT * FROM client WHERE nom={p_nom}")
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.

Insertion de données binaires

Lors de l'insertion de données par INSERT ou UPDATE, si une rubrique mémo doit être affectée avec des données binaires pouvant contenir le caractère \0 (code ASCII zéro), il faut placer les données dans un buffer hexadécimal.
Exemple :
RequeteSQL est une chaîne
SourceDeDonnees est une Source de Données

b est un Buffer = "Données binaires incluant "+Caract(0)+" (zéro binaire)"
// ou : b est un Buffer = fChargeBuffer("<chemin>\photo.jpg")

Requête SQL = "INSERT INTO Produit (Photo) " + ... 
		"VALUES (UNHEX('" + BufferVersHexa(b, SansRegroupement, SansLigne)+"'))" 
HExécuteRequêteSQL(source de données, hRequêteDéfaut, 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.
WINDEVCode Utilisateur (MCU)OLE DBConnecteurs 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êteSQL.
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"
WINDEVUniversal Windows 10 AppCode Utilisateur (MCU)Langage ExterneHFSQL ClassicHFSQL Client/ServeurHyper File 5.5

Requêtes sur des fichiers de données HFSQL

  • Pour optimiser le temps d'exécution de la requête, utilisez la fonction HOptimise sur les différents fichiers de données intervenant dans la requête ou la fonction HOptimiseRequête.
  • Pour optimiser le temps de traitement des requêtes, utilisez la fonction HStatCalcule ou la fonction HRéindexe sur tous les fichiers de données intervenant dans la requête.
  • Lors de l'exécution d'une requête de type INSERT sur des fichiers de données HFSQL, il est possible de connaître l'identifiant automatique attribué au nouvel enregistrement grâce à la syntaxe <Nom Fichier>.<Nom Rubrique Identifiant automatique>.
  • Si les fichiers de données manipulés par la requête ne sont pas présents dans l'analyse, il est nécessaire de déclarer ces fichiers dynamiquement au préalable avec la fonction HDéclareExterne. Dans le cas contraire, une erreur du type Initialisation de la requête impossible. Fichier NOMFICHIER inconnu apparaîtra.
    Exemple :
    // Paramètres de la connexion
    cnxBase est une Connexion
    cnxBase.Provider = hAccèsHFClientServeur
    cnxBase.Serveur = "SERVEURHYPERFILESQL:4900"
    cnxBase.BaseDeDonnées = "Base"
    cnxBase.Utilisateur = "admin"
    cnxBase.MotDePasse = ""
    
    // Connexion à la base de données
    SI HOuvreConnexion(cnxBase) = Faux ALORS
    	Erreur(HErreurInfo())
    	RETOUR
    FIN
    
    // Déclaration dynamique du (ou des) fichier(s) utilisé(s) dans la requête
    SI HDéclareExterne("CLIENT.FIC", "CLIENT", cnxBase) = Faux ALORS
    	Erreur(HErreurInfo())
    	RETOUR
    FIN
    
    // Exécution de la requête
    sdRequeSQL est une Source de Données
    SI PAS HExécuteRequêteSQL(sdRequeSQL, cnxBase, hRequêteDéfaut,[
    SELECT * 
    FROM CLIENT
    ]) ALORS 
    	Erreur("Problème d'exécution")
    SINON
    	Info("ok")
    FIN
    
    // Annule la déclaration dynamique du fichier
    HAnnuleDéclaration("CLIENT")
    
    // Ferme la connexion à la base de données
    HFermeConnexion(cnxBase)
  • Lors de l'exécution d'une requête de type INSERT/UPDATE/DELETE sur des fichiers de données HFSQL, il est possible de connaître le nombre d'enregistrements ayant été ajoutés, modifiés ou supprimés grâce à la variable H.NbEnregRequêteModification.
WINDEVCode Utilisateur (MCU)Connecteurs Natifs (Accès Natifs)

Optimisation pour exécuter plusieurs fois une même requête (Accès natifs Oracle et SQL Server uniquement)

Pour optimiser l'exécution d'une requête plusieurs fois, vous pouvez :
  1. Déclarer une source de données. Cette source de données contiendra le résultat de la requête SQL.
  2. Déclarer les différents paramètres ou variables de la requête.
    Par défaut, les paramètres sont de type chaîne. Il est possible de préciser leur type en utilisant la propriété Type.
    Attention : Pour préciser le type d'une variable de la requête, il est également possible d'affecter cette variable avec une variable existante du type voulu.
  3. Préparer la requête avec la fonction HPrépareRequêteSQL.
  4. Indiquez la valeur du ou des différents paramètres à prendre en compte et exécuter la requête à l'aide de la fonction HExécuteRequêteSQL. Seul le nom de la source de données correspondant à la requête doit être spécifié.
Cette dernière étape doit être répétée autant de fois que nécessaire.
Exemple :
// Exécution d'une même requête sous Oracle
// Déclaration d'une source de données
// Cette source de données correspond à la requête. 
Insert1 est une Source de Données
// Déclaration d'un des paramètres de la requête
// Le type de ce paramètre est un entier
Insert1.Age = 0
i est un entier
// Préparation de la requête pour de multiples exécutions
HPrépareRequêteSQL(Insert1, MaConnexion, ...
	hRequêteSansCorrection, ...
	"INSERT INTO PERSONE VALUES (:nom, :prenom, :age )")
// Boucle d'exécution de la requête
// Seuls quelques paramètres sont modifiés
POUR i = 1 Ã€ 10
	Insert1.nom = "Nom" + i
	Insert1.prenom = "Prenom" + i
	Insert1.Age = i
	HExécuteRequêteSQL(Insert1)
FIN
WINDEVCode Utilisateur (MCU)Connecteurs Natifs (Accès Natifs)

Spécifier et récupérer des valeurs lors de l'exécution d'une requête (cas des procédures stockées)

Remarque : Cette note ne s'applique qu'aux Connecteurs Natifs Oracle et SQL Server.
Pour spécifier et récupérer des valeurs lors de l'exécution d'une requête, il faut :
  1. Déclarer une source de données. Cette source de données contiendra le résultat de la requête SQL.
  2. Déclarer les différentes variables de la requête (variables d'entrées et variables de sorties).
    Par défaut, les variables sont de type chaîne. Il est possible de préciser leur type en utilisant la propriété Type.
    Attention : Pour préciser le type d'une variable de la requête, il est également possible d'affecter cette variable avec une variable existante du type voulu.
  3. Exécuter la requête à l'aide de la fonction HExécuteRequêteSQL.
// Exemple pour Oracle
// Déclaration de la source de données associée à la requête
MaProc est une Source de Données
// Déclaration des variables
MaProc.n = 3
MaProc.str = "Exemple"
// Exécution de la requête avec récupération du résultat
HExécuteRequêteSQL(MaProc, MaConnexion, hRequêteSansCorrection, ...
	"begin :Res :=sp_cut(:n,:str);end;")
// Affichage du résultat 
Info(MaProc.Res)
Remarques
  • La fonction HExécuteRequêteSQL doit être utilisée avec :
    • le nom de la connexion,
    • la constante hRequêteSansCorrection.
  • Les variables déclarées dans la requête doivent être identiques à celles utilisées dans le code de la procédure stockée. Dans le cas contraire, une erreur WLangage est affichée.
  • Dans l'appel à la procédure stockée, il est nécessaire d'utiliser la syntaxe spécifique à la base de données utilisée, y compris pour les paramètres.
    Ainsi, pour Oracle, les paramètres sont spécifiés avec la syntaxe :NomParam. Attention : Le caractère ":" doit être suivi d'au moins une lettre (la syntaxe :1 est interdite).
    Pour SQL Server, les paramètres sont spécifiés avec la notation @NomParam.
    Il est possible d'utiliser plusieurs fois le même paramètre. Dans ce cas, la variable correspondante sera ré-utilisée.
  • Pour exécuter une requête sans que le bind ne soit activé, utilisez la constante hNoBind dans la fonction HExécuteRequêteSQL.
WINDEVUniversal Windows 10 AppCode Utilisateur (MCU)HFSQL ClassicHFSQL Client/ServeurHyper File 5.5OLE DBConnecteurs Natifs (Accès Natifs)

Requêtes SQL (fonction HExécuteRequêteSQL ou exécution de requêtes SQL créées par l'éditeur de requêtes)

Lors de l'utilisation des instructions SQL DELETE, INSERT ou UPDATE dans des requêtes SQL, par défaut, aucun contrôle d'intégrité et aucun contrôle de doublons ne sont réalisés sur une base de données HFSQL.
Pour effectuer un contrôle automatique de l'intégrité, il suffit de préciser la constante hVérifieIntégrité. Cette constante permet d'activer la gestion de l'intégrité pendant l'exécution de la requête. Si une erreur d'intégrité est détectée, la requête n'est pas exécutée. En effet, une transaction est démarrée, les enregistrements sont bloqués en écriture pendant l'exécution de la requête et débloqués à la fin de son exécution, que la requête échoue ou non. Si l'application est arrêtée pendant l'exécution de la requête (coupure de courant par exemple), la transaction sera annulée à la prochaine utilisation des fichiers de données de la requête.
HFSQL Client/Serveur Si la constante hVérifieIntégrité n'est pas spécifiée, la gestion de l'intégrité est débranchée. Or si l'utilisateur n'a pas les droits pour débrancher la gestion de l'intégrité (fonction HModifieDroitBaseDeDonnées) et si une gestion de l'intégrité doit être réalisée, une erreur de droit est affichée.
Pour effectuer un contrôle automatique des doublons, il suffit de préciser la constante hVérifieDoublons. Cette constante permet d'activer la gestion des doublons pendant l'exécution de la requête. Si une erreur de doublons est détectée, la requête n'est pas exécutée. En effet, une transaction est démarrée, les enregistrements sont bloqués en écriture pendant l'exécution de la requête et débloqués à la fin de son exécution, que la requête échoue ou non. Si l'application est arrêtée pendant l'exécution de la requête (coupure de courant par exemple), la transaction sera annulée à la prochaine utilisation des fichiers de données de la requête.
Note : Si une erreur de doublons est détectée lors de l'exécution d'une requête de type UPDATE, la fonction HExécuteRequête renvoie Faux et le traitement continue. L'erreur correspondante peut être connue grâce à la fonction HErreurInfo.
Remarque : L'assistance automatique par défaut n'est pas appelée pour les erreurs de doublons. Une simple erreur de doublons est générée. Si une assistance a été redéfinie à l'aide de la fonction HSurErreur, alors cette assistance personnalisée est appelée.
HFSQL Client/Serveur Si la constante hVérifieDoublon n'est pas spécifiée, la gestion des doublons est débranchée. Or si l'utilisateur n'a pas les droits pour débrancher la gestion des doublons (fonction HModifieDroitBaseDeDonnées) et si une gestion de doublons doit être réalisée, une erreur de droit est affichée.
Les requêtes de type UPDATE, DELETE ou INSERT n'existent que pendant leur exécution. Il n'est pas possible d'utiliser une fonction WLangage sur ce type de requête après son exécution.
WINDEVUniversal Windows 10 AppCode Utilisateur (MCU)Langage ExterneHFSQL ClassicOLE DBConnecteurs Natifs (Accès Natifs)

Parcours des requêtes (fonction HLitPremier)

  • Par défaut, la fonction HLitPremier ré-exécute la requête pour rafraîchir le résultat de la requête. Il est conseillé d'utiliser la constante hSansRafraichir pour éviter la ré-exécution de la requête.
  • Parcours d'une requête exécutée avec l'option hRequêteSansCorrection :
    Pour parcourir les enregistrements dans l'ordre renvoyé par la base de données, il n'est pas nécessaire de préciser de rubrique de parcours. Exemple :
    HLitPremier(MaRequête, hSansRafraîchir)

    Si une rubrique de parcours est spécifiée, le résultat de la requête est intégralement récupéré et indexé. Le parcours est alors réalisé sur la rubrique spécifiée. Le tri initial de la requête (spécifié par ORDER BY) est ignoré. L'index créé (au format HFSQL) est sensible à la casse, sensible à la ponctuation, sensible aux accents et ascendant.
    Exemple :
    HLitPremier("MaRequête", "MaRubrique", hSansRafraîchir)

    Les recherches utilisent l'index créé sur le résultat de la requête.
Classification Métier / UI : Code métier
Composante : wd300hf.dll
Version minimum requise
  • Version 9
Documentation également disponible pour…
Commentaires
Format des dates pour MySql
Conditions sur les dates type timestamp dans les requetes MySql : AAAAMMJJHHMNSS entre guillemets simples.
Ne pas utiliser le format AAAA-MM-JJ HH:MN:SS qui ne fonctionne pas.
roland
26 juin 2010

Dernière modification : 03/06/2024

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