Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Open MYSQL Database with connectionName
Forum Updated to NodeBB v4.3 + New Features

Open MYSQL Database with connectionName

Scheduled Pinned Locked Moved Unsolved General and Desktop
16 Posts 3 Posters 6.3k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #2

    Hi,

    You don't need to re-create the database object each time, just create once e.g. in the constructor and open/close the connection as needed.

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    1 Reply Last reply
    0
    • H Offline
      H Offline
      helenebro
      wrote on last edited by
      #3

      Thank you for your help.
      In reality, I open two differents database from two classes. The first class create the second class.
      First class, MyApp:

      MyApp::MyApp() {
          MyClass *myClass = new MyClass();
          getDataApp();
      }
      void MyApp::getDataApp() {
          if(openDataBaseApp()) {
             ...
             dbApp.close();
         }
      }
      bool MyApp::openDataBaseApp() {
        if(!dbApp.isValid()) {
          dbApp = QSqlDatabase::addDatabase("QMYSQL3");
          dbApp.setHostName("localhost");
          dbApp.setUserName("myUserName");
          dbApp.setPassword("myPassword");
          dbApp.setDatabaseName("databaseMyApp");
        }
        if(!dbApp.open())
        {
          qDebug() << dbApp.lastError().text() << "\n";
          return false;
        }
        return true;
      }
      

      Second Class , MyClass:

      MyClass::MyClass() {
          getDataMyClass();
      }
      void MyClass::getDataMyClass() {
          if(openDataBaseMyClass()) {
             ...
            dbMyClass.close()
         }
      }
      bool MyClass::openDataBaseMyClass() {
        if(!dbMyClass.isValid()) {
          dbMyClass = QSqlDatabase::addDatabase("QMYSQL3");
          dbMyClass.setHostName("localhost");
          dbMyClass.setUserName("myUserName");
          dbMyClass.setPassword("myPassword");
          dbMyClass.setDatabaseName("databaseMyClass");
        }
        if(!dbMyClass.open())
        {
          qDebug() << MyClass.lastError().text() << "\n";
          return false;
        }
        return true;
      }
      

      If I put dbMyClass and dbMyApp on respective constructor, I have a problem when I re-call getDataBase, it seems driver not loaded.

      MyApp::MyApp() {
          MyClass *myClass = new MyClass();
          dbApp = QSqlDatabase::addDatabase("QMYSQL3");
          dbApp.setHostName("localhost");
          dbApp.setUserName("myUserName");
          dbApp.setPassword("myPassword");
          dbApp.setDatabaseName("databaseMyApp");
          getDataApp();
      }
      MyClass::MyClass() {
          dbMyClass = QSqlDatabase::addDatabase("QMYSQL3");
          dbMyClass.setHostName("localhost");
          dbMyClass.setUserName("myUserName");
          dbMyClass.setPassword("myPassword");
          dbMyClass.setDatabaseName("databaseMyClass");
          getDataMyClass();
      }
      

      This is the log :

      dbDataCube is create QSqlDatabase(driver=""QMYSQL3"", database=""databaseMyClass"", host=""localhost"", port=-1, user=""myUserName"", open=false) 
      openDataBase dbMyClass
      dbMyClass is open 
      dbMyClass close
      QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
      QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
      dbApp is create QSqlDatabase(driver=""QMYSQL3"", database=""databaseMyApp"", host=""localhost"", port=-1, user=""myUserName"", open=false) 
      dbApp is open 
      openDataBase dbMyClass
      "Driver not loaded Driver not loaded" false 
      dbMyClass not open
      
      1 Reply Last reply
      0
      • SGaistS Offline
        SGaistS Offline
        SGaist
        Lifetime Qt Champion
        wrote on last edited by
        #4

        Ok, that's because you're not naming your connections when setting up your QSqlDatabase objects. You should give each a different name.

        By the way, which OS are you running ?

        Interested in AI ? www.idiap.ch
        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

        1 Reply Last reply
        0
        • H Offline
          H Offline
          helenebro
          wrote on last edited by
          #5

          have to admit I'm a little bit confused.

          • When I has a connection name, my database doesn't open.
          • If I setup my QSqlDatabase on constructor (whitout connection name), it works the first timer (with the warning) but if I call again my function to get my database, I have the errror : Driver not loaded

          If I understand, I should first create two QSqlDatabase with two different name, then get the QSqlDatabase but in this case I can't open database (access denied).

          #include "myapp.h"
          
          MyApp::MyApp(QQmlContext *ctx, QObject *parent) : QObject( parent)
          {
                  QSqlDatabase::addDatabase("QMYSQL3", "myapp");
                  QSqlDatabase::addDatabase("QMYSQL3", "myclass");
          
                  MyClass *myClass = new MyClass();
                  ctx->setContextProperty("myClass", myClass);
          
                  dbMyApp = QSqlDatabase::database("myapp");
                  dbMyApp.setHostName("localhost");
                  dbMyApp.setUserName("userName");
                  dbMyApp.setPassword("password");
                  dbMyApp.setDatabaseName("dbMyApp");
                  getDataMyApp();
          }
          
          void MyApp::getDataMyApp()
          {
              if(openDataBaseMyApp()) {
                   QSqlQuery query ;
                   int nb = 0;
                   if(query.exec("SELECT * from MaTable"))
                   {
                       while(query.next()) {
                       nb++;
                   }
               }
               dbMyApp.close();
               qDebug()<<"there are "<<nb<<"input";
              }
          }
          
          bool MyApp::openDataBaseMyApp()
          {
              if(!dbMyApp.open())
              {
                  qDebug() << dbMyApp.lastError().text() << "\n";
                  return false;
              }
              return true;
          }
          
          
          #include "myclass.h"
          
          MyClass::MyClass(QObject *parent) : QObject(parent)
          {
              dbMyClass = QSqlDatabase::database("myclass");
              dbMyClass.setHostName("localhost");
              dbMyClass.setUserName("userName");
              dbMyClass.setPassword("password");
              dbMyClass.setDatabaseName("dbMyClass");
          
              getDataMyClass();
          }
          
          void MyClass::getDataMyClass()
          {
              if(openDataBaseMyClass()) {
                  QSqlQuery query ;
                  int nb = 0;
                  if(query.exec("SELECT * from MaTable"))
                  {
                      while(query.next()) {
                          nb++;
                      }
                  }
                  dbMyClass.close();
                  qDebug()<<"there are "<<nb<<"input";
              }
          }
          
          bool MyClass::openDataBaseMyClass()
          {
                  if(!dbMyClass.open())
                  {
                      qDebug() << dbMyClass.lastError().text() << "\n";
                      return false;
                  }
              return true;
          }
          

          But I have ther error ;

          QSqlDatabasePrivate::database: unable to open database: "Access denied for user 'otherName'@'localhost' (using password: NO) QMYSQL: Impossible d'établir une connexion" 
          QSqlQuery::exec: database not open
          il y a  0 product dans la base 
          QSqlDatabasePrivate::database: unable to open database: "Access denied for user 'otherName'@'localhost' (using password: NO) QMYSQL: Impossible d'établir une connexion" 
          QSqlQuery::exec: database not open
          il y a  0 titre dans la base
          
          1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #6

            That's not a Qt problem there. You otherName user doesn't have access to the database you want to get.

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            1 Reply Last reply
            0
            • H Offline
              H Offline
              helenebro
              wrote on last edited by
              #7

              Yes but "OtherName" isn't the name that I have set with dbMyApp.setUserName("userName");

              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #8

                How did you setup the databases ?

                Out of curiosity, why two different databases for your application ?

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                1 Reply Last reply
                0
                • H Offline
                  H Offline
                  helenebro
                  wrote on last edited by
                  #9

                  What do you mean by saying "setup" ?

                  MyApp

                  MyApp::MyApp(QQmlContext *ctx, QObject *parent) : QObject( parent)
                  {
                      QSqlDatabase::addDatabase("QMYSQL3", "myapp");
                      QSqlDatabase::addDatabase("QMYSQL3", "myclass");
                      MyClass *myClass = new MyClass();
                      ctx->setContextProperty("myClass", myClass);
                      dbMyApp = QSqlDatabase::database("myapp");
                      dbMyApp.setHostName("localhost");
                      dbMyApp.setUserName("root");
                      dbMyApp.setPassword("mySQL:r00t");
                      dbMyApp.setDatabaseName("cube_application");
                      getDataMyApp();
                  }
                  

                  MyClass

                  MyClass::MyClass(QObject *parent) : QObject(parent)
                  {
                      dbMyClass = QSqlDatabase::database("myclass");
                      dbMyClass.setHostName("localhost");
                      dbMyClass.setUserName("root");
                      dbMyClass.setPassword("mySQL:r00t");
                      dbMyClass.setDatabaseName("catalogue_4mod");
                      getDataMyClass();
                  }
                  

                  I have two databases because data have no relationship. My application contains several "mini application".

                  1 Reply Last reply
                  0
                  • SGaistS Offline
                    SGaistS Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on last edited by
                    #10

                    I meant server side setup.

                    But again why multiple databases ? You can have your unrelated tables in only one database. They don't need to have any relation between them.

                    Interested in AI ? www.idiap.ch
                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                    1 Reply Last reply
                    0
                    • H Offline
                      H Offline
                      helenebro
                      wrote on last edited by
                      #11

                      My database is only on localhost and create by command line.
                      Indeed the two database can be merged, I find it more clear like this (It is maybe a mistake)

                      1 Reply Last reply
                      0
                      • SGaistS Offline
                        SGaistS Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on last edited by
                        #12

                        Do you mean you find it more clear to connect your application to two different databases ?

                        Interested in AI ? www.idiap.ch
                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                        1 Reply Last reply
                        0
                        • H Offline
                          H Offline
                          helenebro
                          wrote on last edited by
                          #13

                          Yes, because my application is the merge of different application which has a data on database

                          1 Reply Last reply
                          0
                          • SGaistS Offline
                            SGaistS Offline
                            SGaist
                            Lifetime Qt Champion
                            wrote on last edited by
                            #14

                            That I understood, but still, deploying several databases for one application sounds like an overkill.

                            Interested in AI ? www.idiap.ch
                            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                            1 Reply Last reply
                            1
                            • H Offline
                              H Offline
                              helenebro
                              wrote on last edited by helenebro
                              #15

                              Ok, I will merge my two databases

                              1 Reply Last reply
                              0
                              • L Offline
                                L Offline
                                lqsa
                                wrote on last edited by lqsa
                                #16

                                In my app, the error

                                QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
                                QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
                                

                                solves when pass the database on QSqlQuery constructor.

                                In your case could be something like QSqlQuery(dbMyClass) for querys on MyClass and QSqlQuery(dbApp) for querys on MyApp.

                                1 Reply Last reply
                                0

                                • Login

                                • Login or register to search.
                                • First post
                                  Last post
                                0
                                • Categories
                                • Recent
                                • Tags
                                • Popular
                                • Users
                                • Groups
                                • Search
                                • Get Qt Extensions
                                • Unsolved