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

QxOrm Discussion :

Initialisation d'une base de données SQLite


Sujet :

QxOrm

  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant EPITECH 5e année
    Inscrit en
    Octobre 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Etudiant EPITECH 5e année

    Informations forums :
    Inscription : Octobre 2014
    Messages : 28
    Points : 23
    Points
    23
    Par défaut Initialisation d'une base de données SQLite
    Bonjour,

    J'utilise pour initialiser mes bases de données pour l'utilisation de QxOrm la fonction qx::dao::call_query avec en entrée, le fichier .sql généré avec QxEntityEditor. Alors que cela fonctionne très bien avec mysql, lorsque je passe en sqlite, la fonction me renvoi l'erreur suivante : "No query Unable to fetch row" et ne rempli pas la base.

    En connaîtriez vous la raison ? Auriez vous une solution à me proposer ?

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut


    J'utilise pour initialiser mes bases de données pour l'utilisation de QxOrm la fonction qx::dao::call_query avec en entrée, le fichier .sql généré avec QxEntityEditor.
    Parfait, tu peux effectivement procéder comme ça

    lorsque je passe en sqlite, la fonction me renvoi l'erreur suivante : "No query Unable to fetch row"
    QxEntityEditor génère le schéma DDL SQL spécifique à chaque type de SGBD, donc pour MySQL, tu dois avoir un fichier .sql dédié, et pour SQLite, tu dois avoir un autre fichier .sql (différent de celui pour MySQL). Les paramètres du plugin d'export DDL SQL de QxEntityEditor permettent de choisir vers quel type de SGBD (MySQL, SQLite, PostgreSQL, Oracle, etc...) tu souhaites obtenir le schéma de ta BDD.

    Es-tu certain d'utiliser le fichier généré dédié à SQLite ?

    Si oui, pour avoir une erreur plus précise, il faudrait que tu essayes d'importer le fichier avec un outil comme SQLite Manager par exemple. Cet outil devrait t'indiquer exactement ce qui ne va pas dans le fichier .sql.
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Etudiant EPITECH 5e année
    Inscrit en
    Octobre 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Etudiant EPITECH 5e année

    Informations forums :
    Inscription : Octobre 2014
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Merci de ta réponse

    En effet, j'utilise bien un fichier d'initialisation dédié à chaque type de base de données. Voici l'erreur affiché lors de l’exécution manuel de la requête sous sqlitemanager :

    SQLiteManager: CREATE TABLE t_Module (Module_id SMALLINT NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT, hashId SMALLINT, minorVersion INTEGER, majorVersion INTEGER); [ AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY ]
    Après changement du mapping pour les short (le type de Module_id) vers un INTEGER et non plus un SMALLINT, l'éxécution de la requête fonctionne sous sqlitemanager. En revanche, l'erreur est toujours présente sur mon logiciel sous qxOrm.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Essaye de décomposer le fichier en plusieurs requêtes (utilise la méthode QString::split() avec comme séparateur le ";" ).
    De cette façon tu peux exécuter les requêtes 1 par 1 et voir celle qui ne va pas (plusieurs appels à qx::dao::call_query()).
    Mais normalement, si ça fonctionne avec SQLite Manager, il ne devrait pas y avoir de soucis avec QxOrm.
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Etudiant EPITECH 5e année
    Inscrit en
    Octobre 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Etudiant EPITECH 5e année

    Informations forums :
    Inscription : Octobre 2014
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    L'erreur est présente sur chaque appel lorsque je découpe la requête. Voici un screenshot qui t'éclairera peut être :

    Nom : Requete sqlite.PNG
Affichages : 537
Taille : 22,5 Ko

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Pourrais-tu stp nous montrer (ou bien envoyer carrément un mini-projet qui reproduit ton soucis) :
    - la façon dont tu paramètres la connexion à SQLite ;
    - un appel de requête SQL.

    Es-tu certain que ton fichier SQlite (ta BDD) est accessible en lecture/écriture ?
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Etudiant EPITECH 5e année
    Inscrit en
    Octobre 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Etudiant EPITECH 5e année

    Informations forums :
    Inscription : Octobre 2014
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Le problème ne survient qu'à l'initialisation, lorsque les table sont créés (via sqlite manager), les requêtes en lecture et écriture fonctionnent, j'en déduit que mon fichier doit posséder les autorisations nécessaires.

    Voici le code utilisé pour l'initialisation. La fonction launch est appelé dans le constructeur sans rien de très pertinent avant.

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    bool serverCore::launch()
    {
        qx::service::QxConnect::getSingleton()->setPort(port);
        qx::service::QxConnect::getSingleton()->setThreadCount(MAXCO);
        qx::service::QxConnect::getSingleton()->setSerializationType(qx::service::QxConnect::serialization_binary);
        qx::service::QxConnect::getSingleton()->setCompressData(true);
        qx::service::QxConnect::getSingleton()->setEncryptData(true);
        qx::QxSqlDatabase::getSingleton()->setDriverName(_conf->getDriverName());
        qx::QxSqlDatabase::getSingleton()->setDatabaseName(_conf->getDatabase());
        qx::QxSqlDatabase::getSingleton()->setHostName(_conf->getHostname());
        qx::QxSqlDatabase::getSingleton()->setUserName(_conf->getUsername());
        qx::QxSqlDatabase::getSingleton()->setPassword(_conf->getPassword());
        qx::QxSqlDatabase::getSingleton()->setTraceSqlQuery(true);
     
        m_pThreadPool.reset(new qx::service::QxThreadPool());
        QObject::connect(m_pThreadPool.get(), SIGNAL(error(const QString &, qx::service::QxTransaction_ptr)), this,
                         SLOT(onError(const QString &, qx::service::QxTransaction_ptr)));
     
        QObject::connect(m_pThreadPool.get(), SIGNAL(transactionFinished(qx::service::QxTransaction_ptr)), this,
                         SLOT(onTransactionFinished(qx::service::QxTransaction_ptr)));
        m_pThreadPool->start();
     
        loadServices();
    ...
    }
     
    void serverCore::loadServices()
    {
        QPluginLoader loader("../../Services/bin/LimaCoreServicesServerd.dll");
        QObject * pPlugin = loader.instance();
     
        if (!pPlugin)
            qFatal(loader.errorString().toStdString().data());
     
        qDebug() << "QxOrm services found and operational, starting continue";
     
        QFile file("../../../LimaCore_"+_conf->getDb().toLower()+"_db_schema_full.sql");
     
        qDebug() << "FILENAME :" << file.fileName();
     
        file.open(QIODevice::ReadOnly);
        QList<QByteArray> requests = file.readAll().split('\n');
        foreach(QByteArray req, requests)
        {
            qDebug() << "REQUETE :" << req;
            QSqlError err= qx::dao::call_query(qx::QxSqlQuery(req.data()));
            qDebug() << err.text();
        }
     
     
        file.close();
    }
    Je peux fournir au besoin un mini projet mais pas avant jeudi (j'aurai plus de temps à ce moment là).

    Je te remercie !

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Je viens de tester avec un code minimal (juste un main) et je n'ai eu aucun problème, voici mon code de test :
    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
    int main(int argc, char * argv[])
    {
       QCoreApplication app(argc, argv);
       QFile::remove("qxBlog.sqlite");
     
       qx::QxSqlDatabase::getSingleton()->setDriverName("QSQLITE");
       qx::QxSqlDatabase::getSingleton()->setDatabaseName("qxBlog.sqlite");
       qx::QxSqlDatabase::getSingleton()->setHostName("localhost");
       qx::QxSqlDatabase::getSingleton()->setUserName("root");
       qx::QxSqlDatabase::getSingleton()->setPassword("");
     
       QSqlError daoError = qx::dao::call_query(qx_query("CREATE TABLE t_author (author_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, lastname TEXT, firstname TEXT, sex INTEGER, birthdate TIMESTAMP);"));
       qAssert(! daoError.isValid());
     
       return 0;
    }
    Ce que tu peux faire pour vérifier la connexion à ta BDD : avant l'appel à qx::dao::call_query() (avant la lecture de ton fichier qui contient les requêtes DDL SQL), écrit ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Vérifie que la connexion à la BDD est ouverte
    QSqlDatabase db = qx::QxSqlDatabase::getDatabase();
    if (! db.isOpen()) { db.open(); }
    qAssert(db.isValid() && db.isOpen());
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Etudiant EPITECH 5e année
    Inscrit en
    Octobre 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Etudiant EPITECH 5e année

    Informations forums :
    Inscription : Octobre 2014
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    J'ai finalement réessayé après avoir supprimé le fichier .sqlite et en ligne par ligne et ça fonctionne . Je vais laisser comme cela. Merci en tout cas

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    J'ai finalement réessayé après avoir supprimé le fichier .sqlite et en ligne par ligne et ça fonctionne
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

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

Discussions similaires

  1. Intégrer une base de données SQLite
    Par lucciana dans le forum Débuter
    Réponses: 5
    Dernier message: 08/05/2011, 00h08
  2. Réponses: 2
    Dernier message: 01/04/2011, 11h55
  3. Importer une base de données sqlite
    Par Watier_53 dans le forum Android
    Réponses: 1
    Dernier message: 05/01/2011, 08h03
  4. Réponses: 1
    Dernier message: 25/08/2009, 19h22
  5. Réponses: 2
    Dernier message: 05/07/2009, 18h20

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