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 Discussion :

Le pilote pour PostgreSQL


Sujet :

Bases de données

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Par défaut Le pilote pour PostgreSQL
    Bonjour,
    J'essaie en vain de connecter un prog QT sous visual c++ à une base de donnée PostgreSQL... et je dois dire que je suis au bord de la crise de nerfs.

    Ma config, c'est QT 4.1.1 qui marche impeccable sous visual c++ et PostgreSQL 8.1 qui marche aussi sans pb.

    Le probleme : le driver QPSQL qui n'est a priori pas installé...

    J'ai tenté la fameuse manip suivante :

    configure -plugin-sql-psql -qt-sql-psql
    -I C:\Progra~1\PostgreSQL\8.1\include
    -L C:\Progra~1\PostgreSQL\8.1\lib
    -L C:\Progra~1\PostgreSQL\8.1\lib\libpq.a

    cd E:\Qt\4.1.0\src\plugins\sqldrivers\psql
    qmake -o Makefile "INCLUDEPATH+=C:\Progra~1\PostgreSQL\8.1\include" "LIBS+=C:\Progra~1\PostgreSQL\8.1\lib C:\Progra~1\PostgreSQL\8.1\lib\ms\libpq.lib" psql.pro
    qmake
    nmake

    rien n'y fait.

    J'ai un petit prog pour voir où j'en suis :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #include <QApplication>
    #include <QPushButton>
    #include <QtSQL>
    #include <QMessageBox>
     
    int main(int argc, char *argv[])
        {
            QApplication app(argc, argv);
     
     
     
               app.addLibraryPath("c:\\Qt\\4.1.1\\plugins\\sqldrivers\\");
    		QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    	      db.setHostName("localhost");
    		db.setUserName("xxxx");
    		db.setPassword("xxxxx");
    		db.setPort(5432);
    		bool ok = db.open();
     
               QString mess, mess2;
     
               if(ok==true)
    		{mess = "ok ";}else
    		{mess = "Unable to Connect " ;	};
     
    		bool avail = db.isDriverAvailable(db.driverName());
    		if(avail==true)
    		{mess += db.driverName() + " is AVAILABLE ";}else
    		{mess += db.driverName() + " NOT available ";};
     
    		QMessageBox::critical(0,"Connection", mess);
    		QString pat; 
               foreach (QString path, app.libraryPaths()) { 
               pat += path + "\n"; } 
               QMessageBox::critical(0, "les paths :", pat); 
     
    		QStringList ql = db.drivers();
     
    		for (int i=1;i<ql.size();i++){
    			mess2 += ql.at(i);}
    		QMessageBox::critical(0,"drivers", mess2);
     
            return app.exec();
        }
    Le programme est correctement compilé et executé .

    Et evidémment, QPSQL n'est pas là et il ne peut pas se connecter...Par contre, j'ai bien QODBC et QODBC3.

    Je suis débutant (et autodidacte) et que j'ai de grosses lacunes au niveau des liens avec les bibliotheques et des options de compilations. Je m'efforce de suivre des tutos ou forums sur le net....J'ai bien linké postgre et Qt dans visual (bin, lib et include). J'ai bien inséré Qt += sql dans mon .pro; par contre, j'ai des erreurs si j'y rajoute LIBS += libpq.lib .

    Enfin, si je rajoute (comme dans la doc Qt)
    #include "c:/Qt/4.1.1/src/sql/drivers/psql/qsql_psql.cpp"
    j'ai des warnings du type 'QPSQLDriver::QPSQLDriver : inconsistent dll linkage' et des erreurs fatales de link....sympa.

    Je suis au stage de la dépression concernant cette histoire... j'aimerais vraiment savoir ce qui cloche...si une bonne âme aurait une idée....je ne pourrais que m'incliner bien bas. Merci d'avance...


  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Apparemment, la bibliothèque n'est pas compilée ou n'est pas trouvée.
    Est-ce que dans le dossier PostReg/8.1, il y a la bibliothèque ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Par défaut
    Merci pour ta réponse !
    bhen...j'ai la bibliotheque libpq.lib dans le dossier 8.1/lib/ms et une dll du meme nom dans 8.1/bin.
    Les dossiers sont bien inscrits dans mes options VC++ Directories.
    Dans les plugins (QtDIR/plugins/sqldrivers), j'ai le qsqlpsql.dll.

    Est-ce qu'il s'agit de la bibliothéque dont tu parles ?

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    oui, normalement, c'est ça, c'est bizarre, je vais réfléchir un peu...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut
    Citation Envoyé par Soundscape
    bhen...j'ai la bibliotheque libpq.lib dans le dossier 8.1/lib/ms et une dll du meme nom dans 8.1/bin.
    La DLL de PostgreSQL qui se trouve dans 8.1/bin est probablement nécessaire au plugin PostgreSQL de Qt ci-dessous. Il faut s'assurer que cette DLL soit disponible lors de l'exécution du programme. Je m'explique ci-dessous.
    Citation Envoyé par Soundscape
    Dans les plugins (QtDIR/plugins/sqldrivers), j'ai le qsqlpsql.dll.
    Ça c'est bon signe, ça veut dire que le plugin a été compilé et se trouve à l'endroit approprié pour être chargé par Qt.

    Par contre, même si Qt trouve le plugin, celui-ci ne peut être chargé. Je soupçonne que c'est parce qu'il n'arrive pas à trouver la DLL de PostgreSQL dont il dépend. En fait les DLL sont cherchées soit dans un dossier système tel que C:\windows, soit dans le répertoire de l'exécutable, mais certainement pas dans 8.1\bin. Il faut donc rendre cette DLL accessible au plugin. De manière générale, il est recommandé de placer les DLLs dont dépend un programme et ses plugins dans le répertoire de l'exécutable pour éviter le DLL hell.

    Pour vérifier les dépendances d'un exécutable ou d'une DLL, utiliser Dependency Walker.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Par défaut
    Merci pour ta réponse Dimitri

    J'ai tenté, rapidement faute de temps, de copier mes dlls dans le dossier de mon executable.... rien n'a changé. (j'ai même été jusqu'à copier intégralement les dossiers en question pour voir ).

    J'ai toujours correctement les drivers ODBC, ODBC3 et SQLLite...et TJS PAS PSQL ....c'est très étrange que ces drivers fonctionnent et pas celui que je veux...
    J'ai lancé Dependencies Walker sur mon exe...aucune dll n'est manquante (peu importe que les dlls soient dans le dossier de mon exe ou pas)... incompréhensible...

    En fait, j'ai trouvé une solutions alternative pour avancer... vu que le plug-ins QODBC est disponible, j'ai installé le driver psqlODBC : http://pgfoundry.org/projects/psqlodbc/
    J'arrive ainsi à me connecter sans pb à ma base postgre (après avoir configuré mon driver via "Data Sources" de "Administrative Tools").

    Cette solution me satisfait pour l'instant... j'aurai pourtant bien aimé résoudre le pb...

    Je regarde plus en détail dès que possible et vous tient au courant...

    Merci bcp

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut
    Citation Envoyé par Soundscape
    J'ai lancé Dependencies Walker sur mon exe...aucune dll n'est manquante (peu importe que les dlls soient dans le dossier de mon exe ou pas)... incompréhensible...
    En fait je pensais plutôt à lancer Dependency Walker sur le plugin PostgreSQL de Qt, pas sur l'exécutable. En effet, il ne manque manifestement pas de dépendance à l'exécutable et à la bibliothèque Qt puisqu'ils tournent sans problème. Par contre, il doit manquer une dépendance au plugin PostgreSQL de Qt, celui qui est dans QTDIR/plugins/sqldrivers.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Par défaut
    Bon... j'ai fait marché Dependency Walker sur qsqlpsql.dll comme prévu... il n'y avait aucun pb...
    J'ai ensuite copié les librairies Qt et Postgre dans le répertoire de mon exe...pareil : aucun pb signalé par Depedency Walker...(enfin pas au début... mais j'ai rajouté les librairies manquantes : libintl-2.dll, comerr32.dll,...)

    Ma petite appli n'arrive toujours pas à se lancer. L'output me renvoie :

    QSqlDatabase: QPSQL driver not loaded
    QSqlDatabase: available drivers: QSQLITE QODBC3 QODBC


    Comme ce pb commence à me rendre marteau, voici une capture de l'application :

    Nom : dependency.jpg
Affichages : 547
Taille : 79,0 Ko

    ...tout est correct, non ?

    En tout cas, merci bcp pour vos réponses... ça fait chaud au coeur de voir qu'on est pas tout seul...


    petit PS à l'administrateur : Désolé pour l'oubli des balises...j'ai pas encore l'habitude...

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut
    Bon, je tiens à prévenir que je connais mal Qt/Win, mais je crois me souvenir que ça peut aider d'effacer du registre la clef suivante :
    HKEY_CURRENT_USER/SOFTWARE/Trolltech/OrganizationDefaults
    Cette clef garderait en mémoire les dysfonctionnements précédemment rencontrés avec un plugin et peut empêcher ce plugin d'être chargé ultérieurement, même si la cause du dysfonctionnement a été éliminée. Mais bon, je n'ai jamais constaté ou testé tout ça par moi-même.

    Si ça ne marche toujours pas, je conseille de mettre libpq.dll à la fois dans QTDIR/plugins/sqldrivers et dans le répertoire de l'application. Normalement le répertoire de l'application devrait suffire, mais je conseille d'essayer les deux.

    Concernant la copie d'écran de Dependency Walker, je dois là aussi avouer que je n'ai que peu d'expérience de cet outil, je ne sais donc pas dire si tout va bien ou pas au vu de cette copie d'écran.

    À noter quand même, je vois que libpq.dll dépend de msvcrt.dll (run-time C de Visual C++ 5.0 ou 6.0) tandis que qtsql4.dll dépend de msvcr80.dll (run-time C de Visual C++ 8.0). Je ne sais pas si c'est très bon de mélanger les compilateurs et par conséquent les run-time C de cette manière.

    Sinon il est toujours possible de mettre le driver PostgreSQL directement dans la bibliothèque Qt au lieu de le mettre dans un plugin séparé, ce qui élimine tous les problèmes de chargement de plugins, qui sont je dois l'avouer assez complexes à résoudre, peut-être par manque de messages d'erreur. Sous Linux c'est l'option -qt-sql-psql, c'est probablement la même chose sous Windows.

  10. #10
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par dimitri-trolltech
    Si ça ne marche toujours pas, je conseille de mettre libpq.dll à la fois dans QTDIR/plugins/sqldrivers et dans le répertoire de l'application. Normalement le répertoire de l'application devrait suffire, mais je conseille d'essayer les deux.
    ça dépend des options qu'utilise Qt s'il charge dynamiquement la dll. Mettre libpq dans le répertoire de la dll chargée n'assure pas que libpq soit chargée lorsque le plugin l'est (en fonction des options...). Mais en mettant libpq dans le path de l'exe (même répertoire, ou autre...), pas de problème.

    À noter quand même, je vois que libpq.dll dépend de msvcrt.dll (run-time C de Visual C++ 5.0 ou 6.0) tandis que qtsql4.dll dépend de msvcr80.dll (run-time C de Visual C++ 8.0). Je ne sais pas si c'est très bon de mélanger les compilateurs et par conséquent les run-time C de cette manière.
    Exact. J'avais constaté des plantages incompréhensibles de l'appli dans le module QPSQL, plantages qui ont disparu en recompilant la libpq avec la version de VC++ que j'utilisais. J'en parle un peu ici:
    http://arb.developpez.com/qt4/vc++/c...#Lavance-libpq


    Sinon il est toujours possible de mettre le driver PostgreSQL directement dans la bibliothèque Qt au lieu de le mettre dans un plugin séparé, ce qui élimine tous les problèmes de chargement de plugins, qui sont je dois l'avouer assez complexes à résoudre, peut-être par manque de messages d'erreur. Sous Linux c'est l'option -qt-sql-psql, c'est probablement la même chose sous Windows.
    Oui c'est le cas. Pourquoi s'embêter avec un driver sous forme de dll?

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut
    À noter qu'il devrait être possible de rendre Qt plus « verbeux » concernant les erreurs de plugin en positionnant la variable d'environnement QT_DEBUG_PLUGINS avant l'exécution du programme.

    Voir QPluginLoader errors.

Discussions similaires

  1. [PDO] PDO ne trouve pas le pilote pour PostgreSql
    Par Crackerz dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 19/06/2014, 14h50
  2. MCD ou MLD pour postgresql?
    Par jujuz dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 26/01/2005, 22h22
  3. syntax sql spéciale pour postgresql ???
    Par krimson dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 05/05/2004, 15h23
  4. Quel hébergeur pour postgreSQL?
    Par Murielleg dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 08/01/2004, 14h33
  5. Client windows pour postgresql
    Par Flint dans le forum PostgreSQL
    Réponses: 11
    Dernier message: 10/09/2003, 16h26

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