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

WinDev Discussion :

Accès natif mysql , erreur à la récupération du résultat d'une requête [WD20E]


Sujet :

WinDev

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 49
    Points : 42
    Points
    42
    Par défaut Accès natif mysql , erreur à la récupération du résultat d'une requête
    Bonjour ,
    Je fais quelques essais de windev et j'utilise windev express 20 récemment téléchargé .
    je tente de me connecter à une base mysql server 5.0 64 bits
    Après moult tâtonnements et recherches sur ce forum et ailleurs sur internet j'ai pu activer l'accès natif en plaçant en C:\WinDev 20 Express\Programmes\Framework\Win32x86 une librairie libmySQL.dll 32 bits téléchargée pour l'occasion. Il s'agit de la version 5.5.9.0 qui fait 3.80 Mo.
    Je peux me connecter à ma base mysql que Windev peut analyser en affublant le nom des tables du préfixe EXPRESS et en nombre limité ( limitation de la version Express ).
    Je peux lire dans la base en utilisant cette procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sSQL est une chaîne ANSI
    hresult est un booléen
    res est un booléen
     
    sSQL = "SELECT Nom_Analyse FROM EXPRESS_biol_analyse WHERE Code_analyse = 6;"
    hresult = HOuvreConnexion(MaConnexion1)    //MaConnexion1 a été paramétrée dans windev à la création du projet
    res = HExécuteRequêteSQL("ReqTest",sSQL)
     
    Info("La requête contient " + HNbEnr("ReqTest") + " enregistrements.")
    Cela fonctionne , j'ai bien la boite info me signalant qu'un enregistrement a été trouvé, mais comment le lire ? je ne trouve pas la syntaxe correcte de HLitPremier
    J'ai également voulu tenter la connexion par SQLConnecte , afin d'apprécier les différences entre ces deux modes , d'ailleurs lequel vous semble préférable ?.
    J'ai donc écrit la procédure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    NumConnexion est un entier
    NumConnexion = SQLConnecte("localhost", "login", "mdp", "mabase", "MySQL")   //dans la vraie procédure j'ai mis les paramètres corrects 
    SI NumConnexion > 0 ALORS
    	 Info("connexion_acces_natif réussie")   
    	SINON
    	 Info("connexion_acces_natif échouée")
    FIN
     
    sSQL est une chaîne ANSI
    res est un booléen
     
    sSQL = "SELECT Nom_Analyse FROM biol_analyse WHERE Code_analyse = 6;"
    res = SQLExec(sSQL, "REQ1")
    SI res = Vrai  ALORS
    	 Info (" l'exécution de la requête semble avoir réussi ")
    	SINON
    	 Info ( "la requête a renvoyé une erreur ")
    FIN
    Info("La requête contient " + SQL.NbLig + " enregistrements.")
    Info (SQLPremier("REQ1"))
    SQLFerme("REQ1")
    A l'exécution j'obtiens bien l'info que l'accès natif a réussi , que l'exécution de la requête a réussi , mais ensuite j'ai l'info que la requête contient 0 enregistrements et l'instruction " Info (SQLPremier("REQ1")) " provoque l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Erreur à la ligne 35 du traitement Procédure globale SQL_direct_natif.
    La fonction 'SQLPremier' aurait dû renvoyer une valeur.
     
    ----- Informations techniques -----
     
    Projet : EXPRESS_on essaye_Windev
    Appel WL :
    Traitement de 'Procédure globale SQL_direct_natif' (COL_ProcéduresGlobales.SQL_direct_natif), ligne 35, thread 0
     
    Que s'est-il passé ?
    La fonction 'SQLPremier' aurait dû renvoyer une valeur.
     
    Code erreur : 1005
    Niveau : erreur fatale (EL_FATAL)
     
    Dump de l'erreur du module 'wd200vm.dll' (20.0.301.2 EXPRESS).
    Identifiant des informations détaillées (.err) : 1005
    Informations de débogage :
    Fonction (7,183)
    Informations supplémentaires :
    EIT_PILEWL :
    Procédure globale SQL_direct_natif (COL_ProcéduresGlobales.SQL_direct_natif), ligne 35
    EIT_DATEHEURE : 03/05/2016 19:38:57
    Merci aux contributeurs qui pourront m'éclairer. Je m'intéresse à Windev dans le but de développer une application interfacée avec cette base, y accéder est donc fondamental pour moi
    T.Chatenet

  2. #2
    Expert confirmé
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 378
    Points : 4 494
    Points
    4 494
    Par défaut
    Bonjour

    SQLPremier ne renvoie rien, c'est pour ça que tu as une erreur

    Il faut juste faire le SQLPremier et ensuite récupérer la valeur des colonnes avec SQLCol

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Info (SQLPremier("REQ1"))   // on ne peut faire un Info puisque SQLPremier ne renvoie rien

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 49
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par hpascal Voir le message
    Bonjour

    SQLPremier ne renvoie rien, c'est pour ça que tu as une erreur

    Il faut juste faire le SQLPremier et ensuite récupérer la valeur des colonnes avec SQLCol

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Info (SQLPremier("REQ1"))   // on ne peut faire un Info puisque SQLPremier ne renvoie rien
    Merci, cela fait déjà une erreur en moins ( ouf )
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Info(SQLCol("REQ1", 1))
    j'obtiens bien l'affichage de l'enregistrement recherché , mais pourquoi la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Info("La requête contient " + SQL.NbLig + " enregistrements.")
    me renvoie 0 enregistrement ?

  4. #4
    Expert confirmé
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 378
    Points : 4 494
    Points
    4 494
    Par défaut
    Essaye de faire un SQLInfoGene("REQ1") avant

    Logiquement ce n'est pas nécessaire si tu as fait le SQLPremier

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 49
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par hpascal Voir le message
    Essaye de faire un SQLInfoGene("REQ1") avant

    Logiquement ce n'est pas nécessaire si tu as fait le SQLPremier
    Super merci !
    en fait j'avais placé l'instruction SQLPremier après l'instruction SQL.NbLig
    Maintenant ça marche et j'appréhende mieux le fonctionnement , je vais pouvoir poursuivre mon exploration .
    Une dernière petite question :
    Quelle est exactement la différence entre les deux procédures essayées, l'une est elle préférable à l'autre ?
    Merci encore une fois de ton aide

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Si tu utilises l'accès natif, je trouve que cette syntaxe est plus 'sympathique' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    sd1 est une source de données
    cnx est une connexion
    cnx..utilisateur = ...   et etc pour les autres membres de la structure 'connexion'
    si houvre(cnx) = faux alors 
      // Gestion des erreurs
    fin
     
    marequete est une chaine 
    marequete = " ...... la requete  " 
     
    i = HExécuteRequêteSQL( sd1  , cnx, hRequêteSansCorrection, marequete)
    si i = faux alors 
      // Gestion des erreurs 
    fin
     
    nlignes = hnbenr( sd1)  // nombre de lignes
    // et toutesles fonctions h...() sont disponibles, comme à partir d'un fichier.   Par exemple construittablefichier () ou :
     
    Pour tout sd1
       // traitement de chaque enregistrement renvoyé par la requete.
       sch = hrecupereEnregistrement( sd1 )
    fin
     
    hAnnuledeclaration(sd1)
    Et bien sûr, tu peux encapsuler cela dans une fonction ou une classe, pour ne pas avoir à recoder ces 8 ou 10 lignes à chaque fois.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  7. #7
    Expert confirmé
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 378
    Points : 4 494
    Points
    4 494
    Par défaut
    Citation Envoyé par TChatenet Voir le message
    Quelle est exactement la différence entre les deux procédures essayées, l'une est elle préférable à l'autre ?
    Les fonctions SQL sont en principe destinées aux accès ODBC qui ne fonctionnent pas les ordres H

    Aucun intérêt si tu utilises un accès natif. Il y a aura moins de souplesse au niveau du code
    Par exemple, tu ne pourras pas directement accéder à une colonne par son nom mais uniquement par son numéro (pour le faire il faut se faire sa propre fonction, c'est qu'il y a une fonction qui retourne le nom des colonnes retournée). Pas de POUR TOUT non plus avec les fonctions SQL.

    Mais bon ... pourquoi s'embêter, HExécuteRequêteSQL fonctionne très bien
    Il faut surtout l'utiliser avec la constante hRequêteSansCorrection sinon Windev tente de vérifier la syntaxe de la requête. Et si tu utilises une syntaxe propre à MySql et non supportée par HF, tu auras une erreur.

    Donc comme indiqué par tbc92 : HExécuteRequêteSQL avec hRequêteSansCorrection c'est très bien

    Pendant longtemps j'ai utilisé uniquement les fonctions SQL en pensant que c'était mieux (plus direct) mais ce n'est pas le cas (si hRequêteSansCorrection est utilisé)

    Quant aux performances, j’avais fait beaucoup de benchs à l'époque. Sur certaines bases c'était plus rapide avec SQLExec et pour d'autres c'était avec HExécuteRequêteSQL
    Ceci dit, il n'y avait pas de gros écarts

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 49
    Points : 42
    Points
    42
    Par défaut
    Bonjour ,
    Merci pour ta suggestion mais je ne parviens pas à la mettre en œuvre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    sd1 est une Source de Données
    cnx est une Connexion
     
    cnx..Utilisateur = "login"                                      // j'ai bien sûr mis les bons identifiant, mot de passe et nom de la base de donnée
    cnx..MotDePasse = "mdp"
    cnx..BaseDeDonnées = "mabase"
    cnx..Serveur = "localhost"                                  // j'ai aussi essayé le nom de mon ordi ( il abrite le serveur )
    cnx..Provider = hAccèsHFClientServeur
    cnx..Accès = hOLectureEcriture
    cnx..OptionsCurseur = hCurseurClient
    cnx..Libellé = "nouvelleconnexion"
     
     
    SI HOuvreConnexion(cnx) = Faux ALORS
    //si houvre(cnx) = faux alors 
    	// Gestion des erreurs
    	Info ("echec de la connexion")
     
    FIN
    etc............
    je ne parviens pas à établir de connexion :-/ : échec de la connexion et bien sûr des lignes suivantes

    [EDIT] 22:24
    OK trouvé !
    je n'avais pas mis le bon paramètre pour le provider ( bêtement copié sur les exemples de l'aide en ligne ) il fallait mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    cnx..Utilisateur = "login"
    cnx..MotDePasse = "mdp"
    cnx..BaseDeDonnées = "maBase"
    cnx..Serveur = "localhost"
     
    cnx..Provider = hAccèsNatifMySQL                      //et non hAccèsHFClientServeur
     
    cnx..Accès = hOLectureEcriture
    Merci encore !

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 49
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par hpascal Voir le message
    Les fonctions SQL sont en principe destinées aux accès ODBC qui ne fonctionnent pas les ordres H

    Aucun intérêt si tu utilises un accès natif. Il y a aura moins de souplesse au niveau du code..

    ..Quant aux performances, j’avais fait beaucoup de benchs à l'époque. Sur certaines bases c'était plus rapide avec SQLExec et pour d'autres c'était avec HExécuteRequêteSQL
    Ceci dit, il n'y avait pas de gros écarts
    Merci beaucoup pour ces explications . J'avais ( mal ) pensé que les instructions SQL utilisaient l'accès natif à l'inverse des ordres H.
    Ceci dit dans le cas présent elles présentent l'avantage de ( j'espère ? ) contourner la limitation de la version express (elle analyse 15 tables alors que la base à laquelle je souhaite accéder en possède une bonne centaine et je suppose que les ordres H ne permettent d'accéder qu'aux tables analysées ?).
    Je vais poursuivre ma découverte :-)

    [EDIT]
    En fait l'accès natif permet d'exécuter des requêtes sur toutes les tables, même celles qui ne sont pas intégrées dans l'analyse . Du coup je ne comprends pas bien l'utilité de cette analyse pourtant présentée comme une étape incontournable par le logiciel ?

  10. #10
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Le fait d'avoir les Tables SQL dans l'analyse peut aider.

    Par exemple, pour les fonctions EcranVersFichier() ou FichierVersEcran(). Ca aide aussi, puisque les structures de ces tables deviennent connues par l'EDI, et donc on a des trucs comme la complétion automatique.

    Mais on peut parfaitement utiliser des tas de bases SQL avec Windev sans jamais utiliser l'analyse.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 49
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Le fait d'avoir les Tables SQL dans l'analyse peut aider.

    Par exemple, pour les fonctions EcranVersFichier() ou FichierVersEcran(). Ca aide aussi, puisque les structures de ces tables deviennent connues par l'EDI, et donc on a des trucs comme la complétion automatique.

    Mais on peut parfaitement utiliser des tas de bases SQL avec Windev sans jamais utiliser l'analyse.
    Merci pour ces précisions

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/10/2009, 20h20
  2. [PDO] Récupération des résultats d'une requête
    Par nikco dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 09/06/2009, 01h26
  3. Récupération du résultat d'une requête sur une table liée
    Par champijulie dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 05/06/2007, 12h26
  4. Réponses: 2
    Dernier message: 02/12/2005, 21h21
  5. Réponses: 1
    Dernier message: 02/12/2005, 20h18

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