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

Qt SQL Update Parameter count mismatch while insert works

Scheduled Pinned Locked Moved Solved General and Desktop
sqlite3help
7 Posts 2 Posters 990 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.
  • BambusFanB Offline
    BambusFanB Offline
    BambusFan
    wrote on last edited by BambusFan
    #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?

    eyllanescE 1 Reply Last reply
    0
    • BambusFanB BambusFan

      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?

      eyllanescE Offline
      eyllanescE Offline
      eyllanesc
      wrote on last edited by eyllanesc
      #2
      This post is deleted!
      BambusFanB 1 Reply Last reply
      0
      • eyllanescE eyllanesc

        This post is deleted!

        BambusFanB Offline
        BambusFanB Offline
        BambusFan
        wrote on last edited by
        #3

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

        eyllanescE 1 Reply Last reply
        0
        • BambusFanB BambusFan

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

          eyllanescE Offline
          eyllanescE Offline
          eyllanesc
          wrote on 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");
          
          BambusFanB 1 Reply Last reply
          2
          • eyllanescE eyllanesc

            @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");
            
            BambusFanB Offline
            BambusFanB Offline
            BambusFan
            wrote on 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.

            eyllanescE 1 Reply Last reply
            0
            • BambusFanB BambusFan

              @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.

              eyllanescE Offline
              eyllanescE Offline
              eyllanesc
              wrote on 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"
              
              BambusFanB 1 Reply Last reply
              3
              • eyllanescE eyllanesc

                @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"
                
                BambusFanB Offline
                BambusFanB Offline
                BambusFan
                wrote on 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

                • Login

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