IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

Comment vérifier la syntaxe SQL d'une requête ?


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Points : 38
    Points
    38
    Par défaut Comment vérifier la syntaxe SQL d'une requête ?
    Bonjour,
    j'aimerais savoir si l'on pouvait tester une syntaxe SQL avec Delphi.
    Vous me direz que je pourrais mettre ma requête dans un TQuery, et tenter un open dans un try/except (et donc si dans l'except, syntaxe incorrecte, sous condition que le TQuery a toutes ses propriétés en bonnes et dues formes mais ça c'est bon)...

    Seulement, ma requête est vraiment, vraiment super grosse, et elle prend entre 10 et 15 minutes à s'exécuter (quand la syntaxe passe). Donc si dans la boucle try/except on fait cet "open"... l'utilisateur a autre chose à faire qu'attendre son booléen qui passera à true.

    C'est certainement un truc super classique, mais j'ai pas trouvé grand chose sur google pour faire ce genre de choses depuis delphi.

    Je lance donc un appel à vos avis éclairés, si l'on pouvait comme pour le "ExecSQL" ou "Open", avoir un truc du genre "[CheckSyntax]", ou un moyen de le feinter.

    J'ai essayé de faire l'open dans un thread, mais vu que la requête tient sur une 50aine de lignes, quand l'open marche (et donc syntaxe ok), c'est pas bloquant, mais mon appli est super lente voire freezée...

    Merci pour vos suggestions

  2. #2
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Je vois plusieurs façon de te répondre, bien que la question me semble floue (type de base utilisée, utilisation de procedure par la BDD, requête multiple avec sous-requête, ...) :

    1. puisque ta requête semble créée à la conception, on peut supposer qu'une fois testée (les 15 premières minutes !), elle est définitivement valide;

    2. la validité de la syntaxe SQL ne présume pas que la requête retourne un (ou plusieurs) enregistrement(s);
    Toutefois, si ta requête répond en 15 min, je suppose que le nombre d'enregistrements retournés est important. Tu peux peut-être utiliser une requête "test" ne retournant qu'un seul enregistrement avant l'emploi de la requête souhaitée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TOP 1 MonChamp1 FROM MaTable WHERE MonChamp2 = :PMonChamp2 ....
    De cette façon, ta requête ne sera ni bloquante (si sa syntaxe est correcte) ni lente (1 seul enregistrement retourné).

    3. les différents paramètres de la requêtes sont peut-être définis par des variables modifiées par l'utilisateur. Tester la syntaxe de la requête ne sert à rien puisq'elle est valablement construite à la conception. Par contre tu peux tester que chaque variable est valide avant de l'injecter dans les parametres de la requête. Par exemple : que le PrixUnitaire est un currency compris entre ValeurMin et ValeurMax, ...

    Cela répond-il à ta question ?
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Points : 38
    Points
    38
    Par défaut
    Salut archonte et merci pour ta réponse,

    désolé de répondre si tard
    Mouais ça répond à peu près.

    Au final j'étais parti sur un thread dans lequel je faisais mon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try
    FMessage := '';
    FQuery.Open;
    Except on e:exception do
    FMessage := E.Message;
    Si (FMessage <> '') lors de l'événement Terminate du thread, y a eu un problème de syntaxe, sinon dans tous les cas juste avant de créer le thread, je lance un timer dans l'Application.
    Si plus de 20 secondes avant le OnTerminate du thread, ce timer tue le thread.

    C'est un peu porc mais j'avais rien d'autre sous la main.

    Surtout que je me suis aperçu que le mec qui a monté la BD SqlServer avait mis un timeout maximum pour l'exécution d'une requête... donc j'avais un 2e soucis.

    Bref, maintenant les deux sont "réglés"

  4. #4
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Surtout que je me suis aperçu que le mec qui a monté la BD SqlServer avait mis un timeout maximum pour l'exécution d'une requête... donc j'avais un 2e soucis.
    Si c'est du SQL Server, tu peux exécuter la commande :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET FMTONLY ON
    Avant ta requête, puis la désactiver après avec
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET FMTONLY OFF

    Ca a pour effet de dire à SQL Server que tu ne veux pas qu'il calcule réellement la requête, mais que tu veux juste qu'il te renvoit la structure vide du résultat.
    Ca l'oblige malgré tout à la compiler, donc à vérifier la syntaxe. Par contre, comme il n'a vraiment besoin de l'exécuter, c'est quasi instantané. Pas besoin de thread...

    Le lien sur la doc msdn:
    http://msdn.microsoft.com/fr-fr/library/ms173839.aspx

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Points : 38
    Points
    38
    Par défaut
    Merci beaucoup Franck SORIANO, c'est génial !

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 107
    Points : 63
    Points
    63
    Par défaut
    Wééééééééé

    Je viens de tomber sur ce post et je remercie aussi Franck Soriano : cette petite commande m'a bien aidée pour mon développement.

    Merci les gens efficaces

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/02/2013, 00h15
  2. Réponses: 3
    Dernier message: 11/12/2008, 14h37
  3. Réponses: 0
    Dernier message: 06/08/2008, 11h44
  4. Comment insérer la date actuelle dans une requête SQL ?
    Par AMINE07 dans le forum Bases de données
    Réponses: 7
    Dernier message: 15/11/2007, 16h47
  5. problème de syntaxe delphi pour une requête sql
    Par socooooool dans le forum Bases de données
    Réponses: 12
    Dernier message: 07/07/2006, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo