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 :

Connexion à une base de données avec un singleton


Sujet :

Bases de données

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 49
    Points : 37
    Points
    37
    Par défaut Connexion à une base de données avec un singleton
    Bonjour. Je souhaite réaliser une classe Singleton pour pouvoir me connecter à une BDD, mais je rame un peu !

    Voici l'erreur que j'obtiens à la compilation :
    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
    DBConnection.h: In member function `DBConnection& DBConnection::operator=(const
    DBConnection&)':
    DBConnection.h:20: warning: no return statement in function returning non-void
    DBConnection.cpp: In constructor `DBConnection::DBConnection()':
    DBConnection.cpp:9: error: `class QSqlDatabase::addDatabase' is not a type
    DBConnection.cpp: At global scope:
    DBConnection.cpp:34: error: ISO C++ forbids declaration of `get_db' with no type
     
    DBConnection.cpp:34: error: prototype for `int DBConnection::get_db()' does not
    match any in class `DBConnection'
    DBConnection.h:12: error: candidate is: static DBConnection DBConnection::get_db
    ()
    DBConnection.cpp:34: error: `int DBConnection::get_db()' and `static DBConnectio
    n DBConnection::get_db()' cannot be overloaded
    DBConnection.cpp: In member function `int DBConnection::get_db()':
    DBConnection.cpp:35: error: cannot convert `QSqlDatabase' to `int' in return
    DBConnection.h
    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
    #ifndef DEF_DBCONNECTION
    #define DEF_DBCONNECTION
     
    #include <QSqlDatabase>
    #include <iostream>
     
    class DBConnection
    {
        public:
               static DBConnection* Get();
               static void Kill();
               static DBConnection get_db();
     
        private:
                static DBConnection* m_instance;
     
                DBConnection();
                ~DBConnection();
     
                DBConnection& operator= (const DBConnection&){}
                DBConnection (const DBConnection&){}
     
                QSqlDatabase db;
                bool check_con;
    };
     
    #endif
    DBConnection.cpp
    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
    #include "DBConnection.h"
     
    using namespace std;
     
    DBConnection* DBConnection::m_instance=0;
     
    DBConnection::DBConnection()
    {
        db = new QSqlDatabase::addDatabase("QMYSQL");
        db.setHostName("localhost");
        db.setDatabaseName("bob");
        db.setUserName("truc");
        db.setPassword("muche");
    }
     
    DBConnection::~DBConnection(){}
     
    DBConnection* DBConnection::Get()
    {
        if(m_instance==0)
    	{
    	    m_instance=new DBConnection();
    	}
        return m_instance;
    }
     
    void DBConnection::Kill()
    {
        delete m_instance;
        m_instance=0;
    }
     
    DBConnection::get_db()
    {
        return db;
    }
    Et le morceau de code que j'utilise pour créer ma connection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        DBConnection* con_DB=DBConnection::Get();
     
        db = con_DB->get_db();
     
        if( db.open())
        {
            m_TexteInformation->setText("réussi !");
        }
        else { m_TexteInformation->setText(":(");}

    Voilà... merci d'avance.

  2. #2
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DBConnection.h: In member function `DBConnection& DBConnection::operator=(const
    DBConnection&)':
    DBConnection.h:20: warning: no return statement in function returning non-void
    Ton opérateur devrait renvoyer un DBConnection&.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DBConnection.cpp: In constructor `DBConnection::DBConnection()':
    DBConnection.cpp:9: error: `class QSqlDatabase::addDatabase' is not a type
    Tu fais une construction (puisque new) mais tu appelles addDatabase().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DBConnection.cpp: At global scope:
    DBConnection.cpp:34: error: ISO C++ forbids declaration of `get_db' with no type
    get_db retourne DBConnection (d'après la déclaration de la classe), il faut le spécifier à la définition de la fonction. En plus elle retourne db qui est un QSqlDatabase et un membre non static.

    Je m'arrête là. Il y a plein d'erreurs pour le moment, reprend les messages un par un et résous le problème. Les messages sont assez explicites (si on parle l'anglais).

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 49
    Points : 37
    Points
    37
    Par défaut
    Bonsoir.
    J'ai effectivement compris d'où venaient mes erreurs... elles sont vraiment bêtes mais on va mettre sur le dos de mon manque d'expérience en C++

    Mais concernant le warning je ne comprend pas vraiment... il faut dire que j'ai regardé sur le net pour trouver un Design Pattern Singleton pour faire mes classes... Donc il y a des fonctions que j'écris que je ne comprend qu'à moitié...

    Donc si tu pouvais plus m'éclairer concernant le warning s'il te plait... je t'en remercie d'avance !

  4. #4
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    Ce warning la ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBConnection.h:20: warning: no return statement in function returning
    Il dit juste que ta fonction operator= ne renvoit rien alors qu'elle le devrait. (D'ailleurs pour moi ça devrait être une erreur pas un warning).
    En effet, tu déclares (et tu la définis aussi au passage) cette fonction avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBConnection& operator= (const DBConnection&){}
    Donc normalement ton opérateur d'affectation est censé renvoyer une référence vers une DBConnection, or là l'implémentation ne fait rien, donc ne renvoit rien, d'où le warning.
    Le fait de déclarer les constructeurs et operator= private ça assure que l'on pourra pas créer comme on veut des objets de cette classe (puisqu'on en veut un seul), n'empêche que ces fonctions même si elles ne font pas grand chose doivent être cohérentes avec leur déclaration.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 49
    Points : 37
    Points
    37
    Par défaut
    Bonsoir.

    Voilà juste pour dire que j'ai pu réaliser ma classe de connexion en singleton, mais un autre problème se pose à moi maintenant... Comment puis-je vérifier les messages d'erreurs lorsque la connexion n'a pu être initialiser ? Quelque chose du genre qu'il n'a pu joindre l'adresse que je lui ai spécifier etc...

    Bref pour l'instant je vérifie si il a pu ouvrir correctement la connexion avec isOpen() mais bon il me retourne toujours false...

    Sachant que j'ai une interface graphique avec Qt derrière tout ça, comment connaître les messages d'erreur que l'on peut avoir à l'exécution ?

  6. #6
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    Dans QSqlDatabase les fonctions qui font des appels à la base revoient normalement des bool qui disent si ça a réussi ou pas.
    En cas d'échec l'erreur s'obtient avec lastError(). Pour savoir s'il y a eu une erreur de connexion il y a aussi isOpenError().

    Une fois la QSqlError récupérée, les messages s'obtiennent avec text(), databaseText() ou driverText(), je sais pas ce qui est le plus pertinent, surement celui de la database. Enfin toujours est-il que tu as toutes les infos sur l'erreur.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 49
    Points : 37
    Points
    37
    Par défaut
    Ok très bien je vais mettre tout ça en application, je te remercie !

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

Discussions similaires

  1. [MySQL] Connexion à une base de données avec php-gtk
    Par mawusse dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 12/09/2007, 18h30
  2. Connexion à une base de données avec PgAdmin 3
    Par bartounet dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 05/07/2007, 12h56
  3. connexion à une base de données avec l'objet dataview
    Par mademoizel dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 12/03/2007, 13h31
  4. Connexion à une base de donnée avec swing sous eclipse
    Par kodo dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 07/04/2006, 11h03
  5. [XSL]Connexion à une base de données avec XSL
    Par muad'dib dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 07/02/2006, 10h06

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