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. Saving to SQLite from text edit (help pwetty pwease)
Forum Updated to NodeBB v4.3 + New Features

Saving to SQLite from text edit (help pwetty pwease)

Scheduled Pinned Locked Moved Unsolved General and Desktop
28 Posts 4 Posters 9.2k 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.
  • p3c0P p3c0

    @Scottish_Jason Since you are trying to overwrite the existing value shouldn't you use update instead of insert query ?

    S Offline
    S Offline
    Scottish_Jason
    wrote on last edited by
    #6

    @p3c0 Hi p3C0

    I did in fact try using the update command previously and also struggled to achieve what I was after. I did at one point manage to pass "cp1" text rather than the actual variable somehow but I lost the code and couldn't recreate scenario!

    could you possibly give me a little example of it's use under my scenario? I usually try and figure these things out for myself but i'm really scratching my head at this one as lots of material I have read says the things I have tried should work..... It's a Qt 5.5 application and I'm running windows 10.

    I am connecting to the database as so: ( a database connection has already been opened to display this sensor data in tables if that matters any - it just appears to close the exisiting one and create a new one without error )

    QSqlDatabase db4 = QSqlDatabase::addDatabase("QSQLITE");
    db4.setDatabaseName("sensors.sqlite");

    Perhaps I should try another SQL driver? not that I know much about that.

    p3c0P 1 Reply Last reply
    0
    • C clochydd

      @Scottish_Jason
      Hi, according to p3c0s suggestion you may update your record that way:

      query.prepare("UPDATE sensors SET pin1 = :dp, attached_gpio = :cp 
                     WHERE sensor_name = 'FC-28';");
      query.bindValue(":dp", dp1);
      query.bindValue(":cp", cp1 );
      
      S Offline
      S Offline
      Scottish_Jason
      wrote on last edited by Scottish_Jason
      #7

      @clochydd Hi

      I have actually already tried this approach also without success.
      I just tried again with your code and it still never worked.

      I'm really scratching my head. qDebug show's the appropriate values that I have typed into the table cells but it just simply does not split them out to the database. I am running DB Browser for SQLite on my 2nd monitor to monitor for any changes and none are happening. It's a mystery!

      [if (db4.open())
      {
      QSqlQuery query(db4);
      int rowcount1 = ui->physicaltable->rowCount();
      int rowcount2 = ui->logicaltable->rowCount() - 1;
      if (rowcount1 > 0)
      {
      QString dp1 = ui->physicaltable->item(0,0)->text();
      QString cp1 = ui->physicaltable->item(0,1)->text();
      query.prepare("UPDATE sensors SET pin1 = :dp, attached_gpio = :cp WHERE sensor_name = 'FC-28';");
      query.bindValue(":dp", dp1);
      query.bindValue(":cp", cp1 );
      query.exec();
      qDebug() << dp1 << " " << cp1;
      }
      }

      p3c0P 1 Reply Last reply
      0
      • jsulmJ Offline
        jsulmJ Offline
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #8

        Is there already an entry in sensors table with sensor_name = 'FC-28'?
        If not the update will fail.

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

        S 1 Reply Last reply
        1
        • S Scottish_Jason

          @p3c0 Hi p3C0

          I did in fact try using the update command previously and also struggled to achieve what I was after. I did at one point manage to pass "cp1" text rather than the actual variable somehow but I lost the code and couldn't recreate scenario!

          could you possibly give me a little example of it's use under my scenario? I usually try and figure these things out for myself but i'm really scratching my head at this one as lots of material I have read says the things I have tried should work..... It's a Qt 5.5 application and I'm running windows 10.

          I am connecting to the database as so: ( a database connection has already been opened to display this sensor data in tables if that matters any - it just appears to close the exisiting one and create a new one without error )

          QSqlDatabase db4 = QSqlDatabase::addDatabase("QSQLITE");
          db4.setDatabaseName("sensors.sqlite");

          Perhaps I should try another SQL driver? not that I know much about that.

          p3c0P Offline
          p3c0P Offline
          p3c0
          Moderators
          wrote on last edited by
          #9

          @Scottish_Jason Did you try the query suggested by @clochydd ? It should work.

          I am connecting to the database as so: ( a database connection has already been opened to display this sensor data in tables if that matters any - it just appears to close the exisiting one and create a new one without error )

          Well in that case just don't add new database connection. Let it use the default one.

          157

          1 Reply Last reply
          1
          • jsulmJ jsulm

            Is there already an entry in sensors table with sensor_name = 'FC-28'?
            If not the update will fail.

            S Offline
            S Offline
            Scottish_Jason
            wrote on last edited by
            #10

            @jsulm

            there is only one entry called "FC-28" under the "sensor_name" column
            I am attempting to update another column connected to that sensor (pin1) and update it

            1 Reply Last reply
            0
            • S Scottish_Jason

              @clochydd Hi

              I have actually already tried this approach also without success.
              I just tried again with your code and it still never worked.

              I'm really scratching my head. qDebug show's the appropriate values that I have typed into the table cells but it just simply does not split them out to the database. I am running DB Browser for SQLite on my 2nd monitor to monitor for any changes and none are happening. It's a mystery!

              [if (db4.open())
              {
              QSqlQuery query(db4);
              int rowcount1 = ui->physicaltable->rowCount();
              int rowcount2 = ui->logicaltable->rowCount() - 1;
              if (rowcount1 > 0)
              {
              QString dp1 = ui->physicaltable->item(0,0)->text();
              QString cp1 = ui->physicaltable->item(0,1)->text();
              query.prepare("UPDATE sensors SET pin1 = :dp, attached_gpio = :cp WHERE sensor_name = 'FC-28';");
              query.bindValue(":dp", dp1);
              query.bindValue(":cp", cp1 );
              query.exec();
              qDebug() << dp1 << " " << cp1;
              }
              }

              p3c0P Offline
              p3c0P Offline
              p3c0
              Moderators
              wrote on last edited by
              #11

              @Scottish_Jason Use QSqlQuery::lastError to check for errors if any.

              157

              S 1 Reply Last reply
              1
              • C Offline
                C Offline
                clochydd
                wrote on last edited by
                #12

                @Scottish_Jason You can open your database with another connection:

                db4 = QSqlDatabase::addDatabase("QSQLITE","xsql"); // adds connection xsql
                db4.setDatabaseName (fullpath + "sensors.sqlite");
                if(!db4.open ()){
                    qDebug() << db4.lastError().text();
                }
                

                Provide the full path to your .sqlite to make sure it's accessable

                1 Reply Last reply
                1
                • p3c0P p3c0

                  @Scottish_Jason Use QSqlQuery::lastError to check for errors if any.

                  S Offline
                  S Offline
                  Scottish_Jason
                  wrote on last edited by Scottish_Jason
                  #13

                  @p3c0 - p3c0 the error returns "true" ??? The application also locks up and / or crashes

                  if (db4.open())
                  {
                      QSqlQuery query(db4);
                      int rowcount1 = ui->physicaltable->rowCount();
                      int rowcount2 = ui->logicaltable->rowCount() - 1;
                      if (rowcount1 > 0)
                      {
                      QString dp1 = ui->physicaltable->item(0,0)->text();
                      QString cp1 = ui->physicaltable->item(0,1)->text();
                  
                      query.prepare("UPDATE sensors SET pin1 = :dp, attached_gpio = :cp WHERE sensor_name = 'FC-28';");
                      query.bindValue(":dp", dp1);
                      query.bindValue(":cp", cp1 );
                      if (query.exec())
                           {
                          qDebug() << "inserted";
                           }
                           else
                          {
                          qDebug() << QSqlQuery::lastError;
                          }
                  
                      }
                  

                  }

                  p3c0P 1 Reply Last reply
                  0
                  • S Scottish_Jason

                    @p3c0 - p3c0 the error returns "true" ??? The application also locks up and / or crashes

                    if (db4.open())
                    {
                        QSqlQuery query(db4);
                        int rowcount1 = ui->physicaltable->rowCount();
                        int rowcount2 = ui->logicaltable->rowCount() - 1;
                        if (rowcount1 > 0)
                        {
                        QString dp1 = ui->physicaltable->item(0,0)->text();
                        QString cp1 = ui->physicaltable->item(0,1)->text();
                    
                        query.prepare("UPDATE sensors SET pin1 = :dp, attached_gpio = :cp WHERE sensor_name = 'FC-28';");
                        query.bindValue(":dp", dp1);
                        query.bindValue(":cp", cp1 );
                        if (query.exec())
                             {
                            qDebug() << "inserted";
                             }
                             else
                            {
                            qDebug() << QSqlQuery::lastError;
                            }
                    
                        }
                    

                    }

                    p3c0P Offline
                    p3c0P Offline
                    p3c0
                    Moderators
                    wrote on last edited by
                    #14

                    @Scottish_Jason No. You didn't use it properly. I posted it like that just for the sake of that link. Try :

                    query.exec()
                    ...
                    qDebug() << query.lastError() << query.lastError().text();
                    //Also some other useful methods
                    qDebug() << query.lastQuery();
                    qDebug() << query.executedQuery();
                    

                    157

                    S 1 Reply Last reply
                    1
                    • p3c0P p3c0

                      @Scottish_Jason No. You didn't use it properly. I posted it like that just for the sake of that link. Try :

                      query.exec()
                      ...
                      qDebug() << query.lastError() << query.lastError().text();
                      //Also some other useful methods
                      qDebug() << query.lastQuery();
                      qDebug() << query.executedQuery();
                      
                      S Offline
                      S Offline
                      Scottish_Jason
                      wrote on last edited by Scottish_Jason
                      #15

                      @p3c0

                      QSqlError("5", "Unable to fetch row", "database is locked") "database is locked Unable to fetch row"

                      I am unsure how to handle databases... so far I have been opening and closing them on each function since I can't call db.whatever if I have not initialized it, or the lack of it being a global variable. Is this my issue?

                      p3c0P 1 Reply Last reply
                      0
                      • S Scottish_Jason

                        @p3c0

                        QSqlError("5", "Unable to fetch row", "database is locked") "database is locked Unable to fetch row"

                        I am unsure how to handle databases... so far I have been opening and closing them on each function since I can't call db.whatever if I have not initialized it, or the lack of it being a global variable. Is this my issue?

                        p3c0P Offline
                        p3c0P Offline
                        p3c0
                        Moderators
                        wrote on last edited by
                        #16

                        @Scottish_Jason Don't do that. Instead open the connection only once. QSqlQuery will always use this default connection.

                        157

                        S 1 Reply Last reply
                        1
                        • p3c0P p3c0

                          @Scottish_Jason Don't do that. Instead open the connection only once. QSqlQuery will always use this default connection.

                          S Offline
                          S Offline
                          Scottish_Jason
                          wrote on last edited by
                          #17

                          @p3c0

                          When I take out the secondary QSqlQuery query(db) lines I always end up with query was not declared. How do I initialize the database per function? it has always confused me until now

                          p3c0P 1 Reply Last reply
                          0
                          • S Scottish_Jason

                            @p3c0

                            When I take out the secondary QSqlQuery query(db) lines I always end up with query was not declared. How do I initialize the database per function? it has always confused me until now

                            p3c0P Offline
                            p3c0P Offline
                            p3c0
                            Moderators
                            wrote on last edited by
                            #18

                            @Scottish_Jason Check this example specifically the createConnection method. Modify it as per your need.

                            157

                            S 1 Reply Last reply
                            1
                            • p3c0P p3c0

                              @Scottish_Jason Check this example specifically the createConnection method. Modify it as per your need.

                              S Offline
                              S Offline
                              Scottish_Jason
                              wrote on last edited by
                              #19

                              @p3c0 Thanks, but what if I want to use the same database throughout many functions?
                              how do I pass the db variable to open?

                              p3c0P 1 Reply Last reply
                              0
                              • S Scottish_Jason

                                @p3c0 Thanks, but what if I want to use the same database throughout many functions?
                                how do I pass the db variable to open?

                                p3c0P Offline
                                p3c0P Offline
                                p3c0
                                Moderators
                                wrote on last edited by
                                #20

                                @Scottish_Jason That is what is default connection. It is available across all functions or classes. Just use QSqlQuery directly or you can also try

                                QSqlQuery query(QSqlDatabase::database())
                                

                                in this case it will return the default one.

                                157

                                S 1 Reply Last reply
                                1
                                • p3c0P p3c0

                                  @Scottish_Jason That is what is default connection. It is available across all functions or classes. Just use QSqlQuery directly or you can also try

                                  QSqlQuery query(QSqlDatabase::database())
                                  

                                  in this case it will return the default one.

                                  S Offline
                                  S Offline
                                  Scottish_Jason
                                  wrote on last edited by Scottish_Jason
                                  #21

                                  @p3c0

                                  well guys, thanks for the help but I think I really need to hang up the hat on this one... no matter how I try to initialize the database on a second function ( or lack of initilization) I either get database not open or duplicate database open that causes instability and crashes.

                                  I have been up all night trying to get it working so maybe I'm just tired but I'm starting to think this might be a bit over my head. Thanks for the help guys

                                  p3c0P 1 Reply Last reply
                                  0
                                  • S Scottish_Jason

                                    @p3c0

                                    well guys, thanks for the help but I think I really need to hang up the hat on this one... no matter how I try to initialize the database on a second function ( or lack of initilization) I either get database not open or duplicate database open that causes instability and crashes.

                                    I have been up all night trying to get it working so maybe I'm just tired but I'm starting to think this might be a bit over my head. Thanks for the help guys

                                    p3c0P Offline
                                    p3c0P Offline
                                    p3c0
                                    Moderators
                                    wrote on last edited by
                                    #22

                                    @Scottish_Jason I would suggest you to start from some simple examples keeping the earlier example code in mind ofcourse after some sleep. It works :)

                                    157

                                    S 1 Reply Last reply
                                    1
                                    • p3c0P p3c0

                                      @Scottish_Jason I would suggest you to start from some simple examples keeping the earlier example code in mind ofcourse after some sleep. It works :)

                                      S Offline
                                      S Offline
                                      Scottish_Jason
                                      wrote on last edited by Scottish_Jason
                                      #23

                                      @p3c0

                                      The strange thing is I am only implementing this block once in my loadsensors() function

                                      QString dbname = "sensors";
                                      QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
                                      db.setDatabaseName("sensors.sqlite");
                                      QSqlQuery query(QSqlDatabase::database());
                                      

                                      and then just QSqlQuery query; in the following functions but it still insists that the database is locked.
                                      ( I need query defined so I can do the prepare's etc on each function )

                                      I probably sound awfully silly right now but I'm kinda struggling coming from a php mainly background to this. Any hints down the correct path would be appreciated

                                      1 Reply Last reply
                                      0
                                      • C Offline
                                        C Offline
                                        clochydd
                                        wrote on last edited by clochydd
                                        #24

                                        @Scottish_Jason
                                        Hi, what happens, if you declare your query that way:

                                        QSqlQuery query;
                                        ...
                                        query = QSqlQuery(db);
                                        
                                        1 Reply Last reply
                                        1
                                        • C Offline
                                          C Offline
                                          clochydd
                                          wrote on last edited by
                                          #25

                                          @Scottish_Jason

                                          You are using DB Browser for SQLite parallel - is there a chance that it locks your database?

                                          S 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 Extensions
                                          • Unsolved