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. QTSql Read row by row

QTSql Read row by row

Scheduled Pinned Locked Moved Solved General and Desktop
17 Posts 7 Posters 5.4k Views 2 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.
  • ? Offline
    ? Offline
    A Former User
    wrote on last edited by A Former User
    #1

    I have a problem with following code:

    QSqlQuery query(db);
    QSqlRecord row = query.record();
    if (!query.exec("SELECT member FROM Database"))
    	qDebug() << "Error occurred while accessing table: " << query.lastError().text();
    if (row.count() > 0) {
    	for (int i = 0; i < row.count(); ++i) {
    		QString row_str = row.field(i).value().toString();
    		cout << i+1 << ". " << row_str.toStdString();
    	}
    }
    else
    	cout << "There are no members!\n";
    

    The member column contains 10 random names, but it prints one empty row. db is a mysql driver with opened connection to a database. Thanks for help.

    1 Reply Last reply
    0
    • mranger90M Offline
      mranger90M Offline
      mranger90
      wrote on last edited by
      #2

      I've found row.count() to be notoriously unreliable. I believe it's mentioned in the docs somewhere but I don't have a link handy.
      You should traverse by using query.next().

      1 Reply Last reply
      2
      • ? Offline
        ? Offline
        A Former User
        wrote on last edited by A Former User
        #3

        Could you give me an example? How to do that for any number of rows? I have no experience with QtSql and I can't figure it out.
        Edit:

        while (query.isValid()) {
        	QString row_str = query.nextResult();
        	cout << row_str.toStdString();
        }
        

        I have written this code, but it does not work.

        mrjjM 1 Reply Last reply
        0
        • ? A Former User

          Could you give me an example? How to do that for any number of rows? I have no experience with QtSql and I can't figure it out.
          Edit:

          while (query.isValid()) {
          	QString row_str = query.nextResult();
          	cout << row_str.toStdString();
          }
          

          I have written this code, but it does not work.

          mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @ranger281
          Hi

             QSqlQuery query("SELECT country FROM artist");
              while (query.next()) {
                  QString country = query.value(0).toString();
                  doSomething(country);
              }
          

          http://doc.qt.io/qt-5/qsqlquery.html

          1 Reply Last reply
          4
          • ? Offline
            ? Offline
            A Former User
            wrote on last edited by A Former User
            #5

            How can I load the driver first and then execute the query?

                    QSqlQuery query(db);
            	query = QSqlQuery("SELECT member FROM Database");
            	while (query.next()) {
            	        QString row = query.value(0).toString();
            		cout << row.toStdString();
            	}
            

            This is not working

            mrjjM 1 Reply Last reply
            0
            • ? A Former User

              How can I load the driver first and then execute the query?

                      QSqlQuery query(db);
              	query = QSqlQuery("SELECT member FROM Database");
              	while (query.next()) {
              	        QString row = query.value(0).toString();
              		cout << row.toStdString();
              	}
              

              This is not working

              mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by
              #6

              @ranger281

              you dont need to give it db as paramter.

              just open the database somewhere and u can use
              QSqlQuery in whole program.

              1 Reply Last reply
              1
              • ? Offline
                ? Offline
                A Former User
                wrote on last edited by A Former User
                #7

                In that case I get this error:

                QSqlQuery::exec: database not open
                

                db is already opened (i added db.open() before creating query).

                JonBJ 1 Reply Last reply
                0
                • ? A Former User

                  In that case I get this error:

                  QSqlQuery::exec: database not open
                  

                  db is already opened (i added db.open() before creating query).

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

                  @ranger281
                  Where did you do @mrjj's "just open the database somewhere"?
                  You've edited your post --- now show the code where you open the database and how it relates to where you execute the query. [BTW, did you check it actually opened correctly? QSqlDatabase::open() returns a value...]

                  ? 1 Reply Last reply
                  1
                  • JonBJ JonB

                    @ranger281
                    Where did you do @mrjj's "just open the database somewhere"?
                    You've edited your post --- now show the code where you open the database and how it relates to where you execute the query. [BTW, did you check it actually opened correctly? QSqlDatabase::open() returns a value...]

                    ? Offline
                    ? Offline
                    A Former User
                    wrote on last edited by A Former User
                    #9

                    @JonB I opened db in other function called from main and tried doing the same in this code, but it does not work.

                    db.open();
                    QSqlQuery query("SELECT member FROM Database");
                    while (query.next()) {
                    	QString row = query.value(0).toString();
                    	cout << row.toStdString();
                    }
                    
                    jsulmJ 1 Reply Last reply
                    0
                    • ? A Former User

                      @JonB I opened db in other function called from main and tried doing the same in this code, but it does not work.

                      db.open();
                      QSqlQuery query("SELECT member FROM Database");
                      while (query.next()) {
                      	QString row = query.value(0).toString();
                      	cout << row.toStdString();
                      }
                      
                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #10

                      @ranger281 What does http://doc.qt.io/qt-5/qsqldatabase.html#open return?

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

                      ? 1 Reply Last reply
                      0
                      • jsulmJ jsulm

                        @ranger281 What does http://doc.qt.io/qt-5/qsqldatabase.html#open return?

                        ? Offline
                        ? Offline
                        A Former User
                        wrote on last edited by A Former User
                        #11

                        @jsulm This code returns 2:

                        if (db.isOpen())
                        	return 2;
                        

                        I will add the QSqlDatabase::open() in a moment.
                        Edit:
                        This code:

                        	if (db.open())
                        	        cout << "opened\n";
                        	QSqlQuery query("SELECT member FROM Database");
                        	while (query.next()) {
                        		QString row = query.value(0).toString();
                        		cout << row.toStdString();
                        	}
                        

                        Returns:

                        opened
                        QSqlQuery::exec: database not open
                        

                        When I open the db only in the other function it returns the same error.

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

                          Hi,

                          You might want to consider printing the error if the open call failed rather than printing that message if it succeed.

                          Also, where did you setup your database ? Can you show the related code ?

                          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
                          • ? Offline
                            ? Offline
                            A Former User
                            wrote on last edited by
                            #13
                                    QSqlDatabase db;
                            	db = QSqlDatabase::addDatabase("QMYSQL", "SQLFileDatabase");
                            	db.setHostName(QString::fromStdString(host));
                            	db.setDatabaseName(QString::fromStdString(name));
                            	db.setUserName(QString::fromStdString(user));
                            	db.setPassword(QString::fromStdString(password));
                            	db.open();
                            
                            JonBJ 1 Reply Last reply
                            0
                            • SGaistS Offline
                              SGaistS Offline
                              SGaist
                              Lifetime Qt Champion
                              wrote on last edited by
                              #14

                              Then check whether the open call is successful here and print the error if it's not the case.

                              Also:

                              • What version of Qt are you using ?
                              • What platform ?
                              • Did you install the MySQL client libraries ?

                              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
                              • ? A Former User
                                        QSqlDatabase db;
                                	db = QSqlDatabase::addDatabase("QMYSQL", "SQLFileDatabase");
                                	db.setHostName(QString::fromStdString(host));
                                	db.setDatabaseName(QString::fromStdString(name));
                                	db.setUserName(QString::fromStdString(user));
                                	db.setPassword(QString::fromStdString(password));
                                	db.open();
                                
                                JonBJ Offline
                                JonBJ Offline
                                JonB
                                wrote on last edited by
                                #15
                                This post is deleted!
                                1 Reply Last reply
                                0
                                • G Offline
                                  G Offline
                                  Gerd
                                  wrote on last edited by
                                  #16

                                  Change
                                  db = QSqlDatabase::addDatabase("QMYSQL", "SQLFileDatabase");

                                  to

                                  db = QSqlDatabase::addDatabase("QMYSQL");

                                  and everything should work.
                                  An explanation for using a default database can be found in the desricption of QSqlDatabase::addDatabase

                                  1 Reply Last reply
                                  4
                                  • ? Offline
                                    ? Offline
                                    A Former User
                                    wrote on last edited by
                                    #17

                                    The @Gerd 's solution works. Reading row by row too.
                                    Thank you all for help.

                                    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