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 :

QSqlDatabase comme attribut de classe


Sujet :

Bases de données

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Par défaut QSqlDatabase comme attribut de classe
    Bonjour

    Je crée un appli Qt C++ avec connexion a une base de données. J'utilise le driver ODBC (pas réussi a recompiler le driver OCI, mais la n'est pas le sujet).
    Je désire créer une classe RequestMaker qui gère tous les acces à la base.
    Mon pb est la suivant:
    Bien que je déclare à ma classe RequestMaker un arttribut m_db qui est un QSqlDatabase (correctement ouvert dans le constructeur),
    cet attribut n'est pas conservé pour les appels de méthode autre que le contraucteur.
    Si dans ma méthode query1 je veux utiliser cette connexion m_db (par exemple pour executer une query dessus),
    he bien il faut que je re-définisse m_db avec un m_db = QSqlDatabase::database("xxx"). POURQUOI ?
    Idem pour mon attribut m_query, il faudra a chaque fois que je le re-définisse avec un QSqlQuery m_query(m_db);

    Merci de votre aide

    déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class RequestMaker
    {
    public:
        RequestMaker(); //constructeur
        bool query1(); //appel d'un requete
        bool query2(); //appel d'une autre requete
     
    private:
        QSqlDatabase m_db; //connexion à la base
        QSqlQuery m_query; //requete sur cette connexion
     
    };

    définition :

    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
    RequestMaker::RequestMaker() //constructeur
    {
        QSqlDatabase m_db = QSqlDatabase::addDatabase("QODBC", "xxx");
        m_db.setDatabaseName("xxx");
        m_db.setUserName("xxx");
        m_db.setPassword("xxx");
        bool ok = m_db.open();
     
        if (!ok)
        {
            qDebug() << m_db.lastError();
            QMessageBox::critical(0, QString("Cannot open database"), QString (m_db.lastError().text()).toAscii(),
                                  QMessageBox::Cancel, QMessageBox::NoButton);
        }
        else
        {
            QMessageBox::information(0, QString("Connected to database"), "Connected to database",
                                     QMessageBox::Cancel, QMessageBox::NoButton); // <- je passe bien ici à l'execusion => ma base m_db est bien ouverte
            QSqlQuery m_query(m_db); //si connecté, on crée la query qui point sur la base m_db
        }
    }
     
     
    bool RequestMaker::query1()
    {
        m_db = QSqlDatabase::database("xxx"); // <- Si je ne recrée pas ma base m_db, ca ne marche pas => POURQUOI ?
        bool open = m_db.open();
        if (!open) {
            QMessageBox::information(0, "Database not opened", m_db.lastError().text().toAscii(),
                                     QMessageBox::Cancel, QMessageBox::NoButton);
        }
     
        QSqlQuery m_query(m_db); // idem, si je ne recrée pas ma query sur ma base, ca ne fonctionne pas => POURQUOI ?
        bool ok = m_query.exec("UPDATE XXX SET OWNER='moimoimoi' WHERE ZZZ = 1");
     
     
     
        return true;
     
    }

  2. #2
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Par défaut
    Pb résolu tt seul
    Pour info le pb est que mes m_db et m_query étaient déclarés commes variables locales du contructeur

    il falait mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    m_db = QSqlDatabase::addDatabase("QODBC", "xxx");
    et 
    m_query = QSqlQuery(m_db);
    et voila !

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Par défaut
    merci pour votre effort qui m'a aidé aussi dans mon projet

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

Discussions similaires

  1. Classe comme attribut d'une classe parente
    Par tamerla dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 15/12/2014, 22h41
  2. Classe comme attribut
    Par ngui_004 dans le forum Débuter
    Réponses: 6
    Dernier message: 18/12/2011, 10h37
  3. Passer un objet comme attribut d'une classe
    Par Leduc08 dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 05/04/2011, 11h54
  4. Réponses: 3
    Dernier message: 16/03/2010, 23h47

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