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. Qt SQL Update Parameter count mismatch while insert works

Qt SQL Update Parameter count mismatch while insert works

Scheduled Pinned Locked Moved Solved General and Desktop
sqlite3help
7 Posts 2 Posters 955 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.
  • B Offline
    B Offline
    BambusFan
    wrote on 12 Sept 2021, 22:27 last edited by BambusFan 9 Dec 2021, 23:04
    #1

    Hey,
    i have no idea why this error occurs:

    QString=name;
    name = ui->txt_name->toPlainText();
    QSqlQuery query;
    if(idd==0){
        query.prepare("INSERT INTO Table (name) VALUES(:name)");
    }
    else{
        query.prepare("UPDATE Table SET (name) VALUES (:name) WHERE id=1");
    }
    query.bindValue(":name", name);
    query.exec();
    qDebug() << query.lastError();
    

    Insert works, but update does not and I get the message: QSqlError("", "Parameter count mismatch", "")

    Could someone please tell me where the mistak is?

    E 1 Reply Last reply 12 Sept 2021, 22:54
    0
    • B BambusFan
      12 Sept 2021, 22:27

      Hey,
      i have no idea why this error occurs:

      QString=name;
      name = ui->txt_name->toPlainText();
      QSqlQuery query;
      if(idd==0){
          query.prepare("INSERT INTO Table (name) VALUES(:name)");
      }
      else{
          query.prepare("UPDATE Table SET (name) VALUES (:name) WHERE id=1");
      }
      query.bindValue(":name", name);
      query.exec();
      qDebug() << query.lastError();
      

      Insert works, but update does not and I get the message: QSqlError("", "Parameter count mismatch", "")

      Could someone please tell me where the mistak is?

      E Offline
      E Offline
      eyllanesc
      wrote on 12 Sept 2021, 22:54 last edited by eyllanesc 9 Dec 2021, 22:55
      #2
      This post is deleted!
      B 1 Reply Last reply 12 Sept 2021, 23:05
      0
      • E eyllanesc
        12 Sept 2021, 22:54

        This post is deleted!

        B Offline
        B Offline
        BambusFan
        wrote on 12 Sept 2021, 23:05 last edited by
        #3

        @eyllanesc Thank you, but was only in this post - accordingly not the problem

        E 1 Reply Last reply 12 Sept 2021, 23:21
        0
        • B BambusFan
          12 Sept 2021, 23:05

          @eyllanesc Thank you, but was only in this post - accordingly not the problem

          E Offline
          E Offline
          eyllanesc
          wrote on 12 Sept 2021, 23:21 last edited by
          #4

          @BambusFan The update syntax is:

          UPDATE table
          SET column_1 = new_value_1,
              column_2 = new_value_2
          WHERE
              search_condition 
          ORDER column_or_expression
          LIMIT row_count OFFSET offset;
          

          In your case:

          query.prepare("UPDATE Table SET name = :name  WHERE id=1");
          
          B 1 Reply Last reply 13 Sept 2021, 00:19
          2
          • E eyllanesc
            12 Sept 2021, 23:21

            @BambusFan The update syntax is:

            UPDATE table
            SET column_1 = new_value_1,
                column_2 = new_value_2
            WHERE
                search_condition 
            ORDER column_or_expression
            LIMIT row_count OFFSET offset;
            

            In your case:

            query.prepare("UPDATE Table SET name = :name  WHERE id=1");
            
            B Offline
            B Offline
            BambusFan
            wrote on 13 Sept 2021, 00:19 last edited by
            #5

            @eyllanesc I used bindValue over prepare and used placeholder:
            https://doc.qt.io/qt-5/qsqlquery.html#qsqlquery-examples

            query.prepare("UPDATE Table SET name = :name  WHERE id=1");
            

            is therefore the same as:

            query.prepare("UPDATE Table SET (name) VALUES (:name) WHERE id=1");
            query.bindValue(":name", name);
            

            Accordingly, also the same error message
            But thank you, you've given me a few ideas.

            E 1 Reply Last reply 13 Sept 2021, 01:20
            0
            • B BambusFan
              13 Sept 2021, 00:19

              @eyllanesc I used bindValue over prepare and used placeholder:
              https://doc.qt.io/qt-5/qsqlquery.html#qsqlquery-examples

              query.prepare("UPDATE Table SET name = :name  WHERE id=1");
              

              is therefore the same as:

              query.prepare("UPDATE Table SET (name) VALUES (:name) WHERE id=1");
              query.bindValue(":name", name);
              

              Accordingly, also the same error message
              But thank you, you've given me a few ideas.

              E Offline
              E Offline
              eyllanesc
              wrote on 13 Sept 2021, 01:20 last edited by
              #6

              @BambusFan I know you use bindValue-prepare with placeholders but that doesn't mean the syntax changes. In the following demo I verify that my suggestion works.

              #include <QCoreApplication>
              #include <QSqlDatabase>
              #include <QSqlError>
              #include <QSqlQuery>
              
              #include <QDebug>
              
              int main(int argc, char *argv[])
              {
                  QCoreApplication a(argc, argv);
              
                  QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
                  db.setDatabaseName(":memory:");
                  if(!db.open()){
                      qDebug() << db.lastError().text();
                      return EXIT_FAILURE;
                  }
              
                  QSqlQuery query;
                  if(!query.exec("CREATE TABLE FooTable(id INTEGER PRIMARY KEY, name TEXT NOT NULL )")){
                      qDebug() << query.lastError().text();
                      return EXIT_FAILURE;
                  }
              
                  query.prepare("INSERT INTO FooTable (id, name) VALUES (?, ?)");
                  query.addBindValue(1);
                  query.addBindValue("Foo");
                  if(!query.exec()){
                      qDebug() << query.lastError().text();
                      return EXIT_FAILURE;
                  }
              
                  query= QSqlQuery("SELECT id, name FROM FooTable");
                  if(!query.exec()){
                      qDebug() << query.lastError().text();
                      return EXIT_FAILURE;
                  }
                  while (query.next()) {
                      qDebug() << query.value("id").toString() << query.value("name").toString();;
                  }
              
                  query.prepare("UPDATE FooTable SET name = :name  WHERE id=1");
                  query.bindValue(":name", "Bar");
                  if(!query.exec()){
                      qDebug() << query.lastError().text();
                      return EXIT_FAILURE;
                  }
                  query= QSqlQuery("SELECT id, name FROM FooTable");
                  if(!query.exec()){
                      qDebug() << query.lastError().text();
                      return EXIT_FAILURE;
                  }
                  while (query.next()) {
                      qDebug() << query.value("id").toString() << query.value("name").toString();;
                  }
              
                  return EXIT_SUCCESS;
              }
              

              Output:

              "1" "Foo"
              "1" "Bar"
              
              B 1 Reply Last reply 13 Sept 2021, 18:03
              3
              • E eyllanesc
                13 Sept 2021, 01:20

                @BambusFan I know you use bindValue-prepare with placeholders but that doesn't mean the syntax changes. In the following demo I verify that my suggestion works.

                #include <QCoreApplication>
                #include <QSqlDatabase>
                #include <QSqlError>
                #include <QSqlQuery>
                
                #include <QDebug>
                
                int main(int argc, char *argv[])
                {
                    QCoreApplication a(argc, argv);
                
                    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
                    db.setDatabaseName(":memory:");
                    if(!db.open()){
                        qDebug() << db.lastError().text();
                        return EXIT_FAILURE;
                    }
                
                    QSqlQuery query;
                    if(!query.exec("CREATE TABLE FooTable(id INTEGER PRIMARY KEY, name TEXT NOT NULL )")){
                        qDebug() << query.lastError().text();
                        return EXIT_FAILURE;
                    }
                
                    query.prepare("INSERT INTO FooTable (id, name) VALUES (?, ?)");
                    query.addBindValue(1);
                    query.addBindValue("Foo");
                    if(!query.exec()){
                        qDebug() << query.lastError().text();
                        return EXIT_FAILURE;
                    }
                
                    query= QSqlQuery("SELECT id, name FROM FooTable");
                    if(!query.exec()){
                        qDebug() << query.lastError().text();
                        return EXIT_FAILURE;
                    }
                    while (query.next()) {
                        qDebug() << query.value("id").toString() << query.value("name").toString();;
                    }
                
                    query.prepare("UPDATE FooTable SET name = :name  WHERE id=1");
                    query.bindValue(":name", "Bar");
                    if(!query.exec()){
                        qDebug() << query.lastError().text();
                        return EXIT_FAILURE;
                    }
                    query= QSqlQuery("SELECT id, name FROM FooTable");
                    if(!query.exec()){
                        qDebug() << query.lastError().text();
                        return EXIT_FAILURE;
                    }
                    while (query.next()) {
                        qDebug() << query.value("id").toString() << query.value("name").toString();;
                    }
                
                    return EXIT_SUCCESS;
                }
                

                Output:

                "1" "Foo"
                "1" "Bar"
                
                B Offline
                B Offline
                BambusFan
                wrote on 13 Sept 2021, 18:03 last edited by
                #7

                @eyllanesc Thank you very much, you are right and it works now. I thought it was a function of prepare, so it would be identical.

                1 Reply Last reply
                0

                2/7

                12 Sept 2021, 22:54

                topic:navigator.unread, 5
                • Login

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