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
Forum Updated to NodeBB v4.3 + New Features

QTSql Read row by row

Scheduled Pinned Locked Moved Solved General and Desktop
17 Posts 7 Posters 4.0k 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