Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Returning QSqlQueryModel for TableView
Qt 6.12 LTS is out! See what's new in the release blog

Returning QSqlQueryModel for TableView

Scheduled Pinned Locked Moved Solved General and Desktop
23 Posts 4 Posters 8.2k Views
  • 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.
  • E Offline
    E Offline
    Emre MUTLU
    wrote on last edited by
    #7
    DB *db = new DB; 
    QSqlQueryModel *model=new QSqlQueryModel;
    model->setQuery(db->SelectData());
    ui->tableView->setModel(model);
    delete db;//closed and deleted db objects
    

    db.cpp:

    DB::~DB()//db destructor
    {
    database.close();
    QSqlDatabase::removeDatabase("qt_sql_default_connection");//your dbname here
    }
    

    example class.cpp:

    {
    DB *db=new DB;
    do something
    delete db;
    }
    

    example class1.cpp:

    DB *db=new DB;
    do something
    delete db;//we deleting db object and its call DB destructor
    
    M 1 Reply Last reply
    1
    • E Emre MUTLU
      DB *db = new DB; 
      QSqlQueryModel *model=new QSqlQueryModel;
      model->setQuery(db->SelectData());
      ui->tableView->setModel(model);
      delete db;//closed and deleted db objects
      

      db.cpp:

      DB::~DB()//db destructor
      {
      database.close();
      QSqlDatabase::removeDatabase("qt_sql_default_connection");//your dbname here
      }
      

      example class.cpp:

      {
      DB *db=new DB;
      do something
      delete db;
      }
      

      example class1.cpp:

      DB *db=new DB;
      do something
      delete db;//we deleting db object and its call DB destructor
      
      M Offline
      M Offline
      masa4
      wrote on last edited by masa4
      #8

      @Emre-MUTLU
      constructor:

      DB::DB(const QString &path)
      {
          m_db = QSqlDatabase::addDatabase("QSQLITE");
          m_db.setDatabaseName(path);
      
          if(!m_db.open())
              qDebug() << "Error: connection with database failed";
          else
              qDebug() << "Database: connection ok";
          qDebug() << m_db.lastError().text();
      }
      

      destructor:

      DB::~DB()
      {
          m_db.close();
          m_db.removeDatabase("mypath"); //value of "path"  variable in constructor
      }
      

      and i got:

      Database: connection ok
      ""
      QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
      Database: connection ok
      ""
      ""
      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.
      Database: connection ok
      ""
      QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
      Database: connection ok
      ""
      QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
      Database: connection ok
      ""
      ""
      

      Every time new db oject instantiated with DB db = new DB(); i got these errors. Im using delete db like you recommended.

      jsulmJ E 2 Replies Last reply
      0
      • E Offline
        E Offline
        Emre MUTLU
        wrote on last edited by
        #9
        DB::~DB()
        {
            m_db.close();
            m_db.removeDatabase("qt_sql_default_connection"); 
        }
        
        1 Reply Last reply
        0
        • M masa4

          @Emre-MUTLU
          constructor:

          DB::DB(const QString &path)
          {
              m_db = QSqlDatabase::addDatabase("QSQLITE");
              m_db.setDatabaseName(path);
          
              if(!m_db.open())
                  qDebug() << "Error: connection with database failed";
              else
                  qDebug() << "Database: connection ok";
              qDebug() << m_db.lastError().text();
          }
          

          destructor:

          DB::~DB()
          {
              m_db.close();
              m_db.removeDatabase("mypath"); //value of "path"  variable in constructor
          }
          

          and i got:

          Database: connection ok
          ""
          QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
          Database: connection ok
          ""
          ""
          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.
          Database: connection ok
          ""
          QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
          Database: connection ok
          ""
          QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
          Database: connection ok
          ""
          ""
          

          Every time new db oject instantiated with DB db = new DB(); i got these errors. Im using delete db like you recommended.

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #10

          @masa4 There is really no need to add same database connection again and again. Do it once and use it. That is why I pointed you to the documentation. You can get existing database at any time in any place of your application using https://doc.qt.io/qt-6/qsqldatabase.html#database

          To analyse the errors you posted: how many DB instances do you have at the same time? Because each of them will try to add same database...

          https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          1
          • M masa4

            @Emre-MUTLU
            constructor:

            DB::DB(const QString &path)
            {
                m_db = QSqlDatabase::addDatabase("QSQLITE");
                m_db.setDatabaseName(path);
            
                if(!m_db.open())
                    qDebug() << "Error: connection with database failed";
                else
                    qDebug() << "Database: connection ok";
                qDebug() << m_db.lastError().text();
            }
            

            destructor:

            DB::~DB()
            {
                m_db.close();
                m_db.removeDatabase("mypath"); //value of "path"  variable in constructor
            }
            

            and i got:

            Database: connection ok
            ""
            QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
            Database: connection ok
            ""
            ""
            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.
            Database: connection ok
            ""
            QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
            Database: connection ok
            ""
            QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
            Database: connection ok
            ""
            ""
            

            Every time new db oject instantiated with DB db = new DB(); i got these errors. Im using delete db like you recommended.

            E Offline
            E Offline
            Emre MUTLU
            wrote on last edited by Emre MUTLU
            #11

            @masa4

            DB::~DB()
            {
                m_db.close();
                m_db.removeDatabase(mypath); your path is string value already so you dont need to use(");
            }`
            
            JonBJ M 2 Replies Last reply
            0
            • E Emre MUTLU

              @masa4

              DB::~DB()
              {
                  m_db.close();
                  m_db.removeDatabase(mypath); your path is string value already so you dont need to use(");
              }`
              
              JonBJ Offline
              JonBJ Offline
              JonB
              wrote on last edited by
              #12

              @Emre-MUTLU , @masa4
              Up to you, but as @jsulm/documentation states you really should not have a QSqlDatabase m_db member variable in a class. If you need to access the QSqlDatabase instance use static QSqlDatabase QSqlDatabase::database().

              E 1 Reply Last reply
              2
              • JonBJ JonB

                @Emre-MUTLU , @masa4
                Up to you, but as @jsulm/documentation states you really should not have a QSqlDatabase m_db member variable in a class. If you need to access the QSqlDatabase instance use static QSqlDatabase QSqlDatabase::database().

                E Offline
                E Offline
                Emre MUTLU
                wrote on last edited by
                #13

                @JonB

                DB::~DB()
                {
                    m_db.close();
                   m_db=QSqlDatabase();
                    m_db.removeDatabase(mypath); your path is string value already so you dont need to use(");
                }
                

                like that?

                JonBJ 1 Reply Last reply
                0
                • E Emre MUTLU

                  @JonB

                  DB::~DB()
                  {
                      m_db.close();
                     m_db=QSqlDatabase();
                      m_db.removeDatabase(mypath); your path is string value already so you dont need to use(");
                  }
                  

                  like that?

                  JonBJ Offline
                  JonBJ Offline
                  JonB
                  wrote on last edited by JonB
                  #14

                  @Emre-MUTLU
                  No! You have a QSqlDatabase m_db member variable in your DB class. Start by getting rid of that variable and then make your code work! Remember that instead you can re-access the current database instance via QSqlDatabase::database() if you need it. You may have QSqlDatabase db variables local to methods if you wish, but no class member variable which persists for the lifetime of the class.

                  M 1 Reply Last reply
                  2
                  • JonBJ JonB

                    @Emre-MUTLU
                    No! You have a QSqlDatabase m_db member variable in your DB class. Start by getting rid of that variable and then make your code work! Remember that instead you can re-access the current database instance via QSqlDatabase::database() if you need it. You may have QSqlDatabase db variables local to methods if you wish, but no class member variable which persists for the lifetime of the class.

                    M Offline
                    M Offline
                    masa4
                    wrote on last edited by
                    #15

                    @jsulm @JonB So you guys mean change code to like:

                    DB::DB(const QString &path)
                    {
                        QSqlDatabase::addDatabase("QSQLITE");
                        QSqlDatabase.setDatabaseName(path); //this doesnt work, the method is not static.
                    
                        if(!QSqlDatabase::open()) //non static, not work
                            qDebug() << "Error: connection with database failed";
                        else
                            qDebug() << "Database: connection ok";
                        qDebug() << QSqlDatabase::lastError().text(); //non static, not work
                    }
                    

                    I got errors from nonstatic functions in this way. And secondly if i try to call from another class( selectData() is method of DB class.)
                    otherclass.cpp:

                    //db = new DB();
                    //model->setQuery(db->selectData(ui->lineedit->text())); //normally its in this way
                    model->setQuery(QSqlDatabase::database().selectData(ui->lineedit->text())); //No member named 'selectData' in 'QSqlDatabase'
                    

                    How should i modify my class actually?

                    jsulmJ 1 Reply Last reply
                    0
                    • M masa4

                      @jsulm @JonB So you guys mean change code to like:

                      DB::DB(const QString &path)
                      {
                          QSqlDatabase::addDatabase("QSQLITE");
                          QSqlDatabase.setDatabaseName(path); //this doesnt work, the method is not static.
                      
                          if(!QSqlDatabase::open()) //non static, not work
                              qDebug() << "Error: connection with database failed";
                          else
                              qDebug() << "Database: connection ok";
                          qDebug() << QSqlDatabase::lastError().text(); //non static, not work
                      }
                      

                      I got errors from nonstatic functions in this way. And secondly if i try to call from another class( selectData() is method of DB class.)
                      otherclass.cpp:

                      //db = new DB();
                      //model->setQuery(db->selectData(ui->lineedit->text())); //normally its in this way
                      model->setQuery(QSqlDatabase::database().selectData(ui->lineedit->text())); //No member named 'selectData' in 'QSqlDatabase'
                      

                      How should i modify my class actually?

                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #16

                      @masa4 said in Returning QSqlQueryModel for TableView:

                      So you guys mean change code to like

                      No, we only suggested to not to have the m_db member variable in your DB class. I don't know why you changed model->setQuery part.

                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                      M 1 Reply Last reply
                      0
                      • jsulmJ jsulm

                        @masa4 said in Returning QSqlQueryModel for TableView:

                        So you guys mean change code to like

                        No, we only suggested to not to have the m_db member variable in your DB class. I don't know why you changed model->setQuery part.

                        M Offline
                        M Offline
                        masa4
                        wrote on last edited by
                        #17

                        @jsulm Ho okay i see, so I will continue to use

                        db = new DB();
                        some code
                        delete DB();
                        

                        paradigm, right? And what can u say for other non static methods? Without m_db how will i use them? In destructor i cant use QSqlDatabase::close() without member variable too.

                        jsulmJ 1 Reply Last reply
                        0
                        • E Emre MUTLU

                          @masa4

                          DB::~DB()
                          {
                              m_db.close();
                              m_db.removeDatabase(mypath); your path is string value already so you dont need to use(");
                          }`
                          
                          M Offline
                          M Offline
                          masa4
                          wrote on last edited by
                          #18

                          @Emre-MUTLU No no i mean i used same path in both sides.
                          constructor:

                          m_db.setDatabaseName(DB_PATH);
                          

                          destructor

                          m_db.removeDatabase(DB_PATH);
                          

                          I am passing same value to both but i keep getting this error every time new DB(); called i think:

                          QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
                          
                          E 1 Reply Last reply
                          0
                          • M masa4

                            @jsulm Ho okay i see, so I will continue to use

                            db = new DB();
                            some code
                            delete DB();
                            

                            paradigm, right? And what can u say for other non static methods? Without m_db how will i use them? In destructor i cant use QSqlDatabase::close() without member variable too.

                            jsulmJ Offline
                            jsulmJ Offline
                            jsulm
                            Lifetime Qt Champion
                            wrote on last edited by
                            #19

                            @masa4 said in Returning QSqlQueryModel for TableView:

                            And what can u say for other non static methods? Without m_db how will i use them?

                            Which non static members do you mean? As already explained you can get the database instance you need by simply calling QSqlDatabase::database().

                            And with your current implementation you're still creating the connection everytime you create a DB instance. You should use https://doc.qt.io/qt-6/qsqldatabase.html#contains to check whether the connection already exist and only add the connection if it does not yet exist.

                            https://forum.qt.io/topic/113070/qt-code-of-conduct

                            M 1 Reply Last reply
                            1
                            • M masa4

                              @Emre-MUTLU No no i mean i used same path in both sides.
                              constructor:

                              m_db.setDatabaseName(DB_PATH);
                              

                              destructor

                              m_db.removeDatabase(DB_PATH);
                              

                              I am passing same value to both but i keep getting this error every time new DB(); called i think:

                              QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
                              
                              E Offline
                              E Offline
                              Emre MUTLU
                              wrote on last edited by
                              #20

                              @masa4
                              i think you db name defaultly is qt_sql_default_connection

                              QSqlDatabase::removeDatabase("qt_sql_default_connection");
                              

                              try this

                              M 1 Reply Last reply
                              1
                              • jsulmJ jsulm

                                @masa4 said in Returning QSqlQueryModel for TableView:

                                And what can u say for other non static methods? Without m_db how will i use them?

                                Which non static members do you mean? As already explained you can get the database instance you need by simply calling QSqlDatabase::database().

                                And with your current implementation you're still creating the connection everytime you create a DB instance. You should use https://doc.qt.io/qt-6/qsqldatabase.html#contains to check whether the connection already exist and only add the connection if it does not yet exist.

                                M Offline
                                M Offline
                                masa4
                                wrote on last edited by
                                #21

                                @jsulm You mean like this? :

                                DB::DB(const QString &path)
                                {
                                    if(!QSqlDatabase::contains(QSqlDatabase::database().connectionName())){
                                            QSqlDatabase::addDatabase("QSQLITE");
                                            QSqlDatabase::database().setDatabaseName(path);
                                    }
                                
                                    if(!QSqlDatabase::database().open())
                                        qDebug() << "Error: connection with database failed";
                                    else
                                        qDebug() << "Database: connection ok";
                                    qDebug() << QSqlDatabase::database().lastError().text();
                                }
                                DB::~DB()
                                {
                                    QSqlDatabase::database().close();
                                }
                                
                                JonBJ 1 Reply Last reply
                                0
                                • E Emre MUTLU

                                  @masa4
                                  i think you db name defaultly is qt_sql_default_connection

                                  QSqlDatabase::removeDatabase("qt_sql_default_connection");
                                  

                                  try this

                                  M Offline
                                  M Offline
                                  masa4
                                  wrote on last edited by
                                  #22

                                  @Emre-MUTLU Yes when i add this i dont see the error output, but i changed the code again.

                                  1 Reply Last reply
                                  0
                                  • M masa4

                                    @jsulm You mean like this? :

                                    DB::DB(const QString &path)
                                    {
                                        if(!QSqlDatabase::contains(QSqlDatabase::database().connectionName())){
                                                QSqlDatabase::addDatabase("QSQLITE");
                                                QSqlDatabase::database().setDatabaseName(path);
                                        }
                                    
                                        if(!QSqlDatabase::database().open())
                                            qDebug() << "Error: connection with database failed";
                                        else
                                            qDebug() << "Database: connection ok";
                                        qDebug() << QSqlDatabase::database().lastError().text();
                                    }
                                    DB::~DB()
                                    {
                                        QSqlDatabase::database().close();
                                    }
                                    
                                    JonBJ Offline
                                    JonBJ Offline
                                    JonB
                                    wrote on last edited by JonB
                                    #23

                                    @masa4
                                    If it helps, you are welcome to use a local variable in a method to reference a database, just that you should not keep it around in a class member variable. You might have code looking like this (only a suggestion):

                                    DB::DB(const QString &path)
                                    {
                                        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
                                        db.setDatabaseName(path);
                                        if (!db.open())
                                            qDebug() << db.lastError().text();
                                    }
                                    
                                    DB::~DB()
                                    {
                                        bool valid = false;
                                        QString connectionName = "";
                                        {
                                            // the need for these enclosing parentheses for scope is explained at https://doc.qt.io/qt-6/qsqldatabase.html#removeDatabase
                                            // only because I am going to call `removeDatabase()` here
                                            QSqlDatabase db = QSqlDatabase::database();
                                            valid = db.isValid();
                                            if (valid)
                                            {
                                                connectionName = db.connectionName();
                                                if (db.isOpen())
                                                    db.close();
                                            }
                                        }
                                        if (valid && !connectionName.isEmpty())
                                            QSqlDatabase::removeDatabase(connectionName);
                                    }
                                    
                                    1 Reply Last reply
                                    1

                                    • Login

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