Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Forum Updated on Feb 6th

    [SOLVED] Exec full script by QSqlDatabase

    General and Desktop
    4
    11
    7175
    Loading More Posts
    • 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.
    • M
      maxim.prishchepa last edited by

      Hi, dose any body can say me, what i do wrong?
      I have DB SQLite, and create DB like this:
      @m_database->m_db = QSqlDatabase::addDatabase("QSQLITE");@
      then, i wont exec a sql script witch create a tables and data in this tables, but when i exec a script - implemented just first command, script store at file, i read end exec a sql script by this code:
      @QString script;
      QFileInfo fi(QDir(DATA_FOLDER), DATABASE_INSTALL_SCRIPT);
      QString path = fi.absoluteFilePath();
      QFile file(path);
      if(file.exists()){
      file.open(QIODevice::Text | QIODevice::ReadOnly);
      QTextStream stream(&file);
      script = stream.readAll();
      m_db.exec(script);// when i set breakpoint hear, variable script is not empty, and have a needed script
      }@
      script file contains a text:
      @CREATE TABLE IF NOT EXISTS [tab1] (
      [S_ID] integer NOT NULL,
      [E_ID] int NOT NULL,
      [ALLSET] BOOLEAN NOT NULL,
      [DATETIME] datetime NOT NULL,
      [SOURCE] text NOT NULL,
      CONSTRAINT [PK_tab1] PRIMARY KEY ([S_ID], [E_ID], [ALLSET], [DATETIME])
      );

      CREATE TABLE IF NOT EXISTS [tab2] (
      [S_ID] smallint NOT NULL UNIQUE,
      [NAME] char(50) NOT NULL,
      );

      REPLACE INTO [tab2] (S_ID, NAME) VALUES (1, "Number 1");
      REPLACE INTO [tab2] (S_ID, NAME) VALUES (2, "Number 2");
      REPLACE INTO [tab2] (S_ID, NAME) VALUES (3, "Number 3");@

      Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz).

      1 Reply Last reply Reply Quote 0
      • Z
        ZapB last edited by

        The QSqlDataBase::exec() function is just a convenience function to save you having to create a QSqlQuery object yourself. Reading the docs you'll see that it executes a single SQL statement not an entire sql script.

        You are responsible for passing the script statements to the QSqlDataBase yourself either using exec() or by creating QSqlQuery objects. Don't forget to check that each was successful before moving onto the next.

        Nokia Certified Qt Specialist
        Interested in hearing about Qt related work

        1 Reply Last reply Reply Quote 0
        • M
          maxim.prishchepa last edited by

          Tnx, i solve this problem that:
          @QSqlQuery query(m_db);
          QStringList queryes = script.split(QChar(';'));
          foreach(QString queryString, queryes){
          query.exec(queryString);
          }
          @

          Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz).

          1 Reply Last reply Reply Quote 0
          • Z
            ZapB last edited by

            Don't forget to check for any errors after issuing each query.

            Nokia Certified Qt Specialist
            Interested in hearing about Qt related work

            1 Reply Last reply Reply Quote 0
            • G
              goetz last edited by

              [quote author="Maxim Prishchepa" date="1309855003"]Tnx, i solve this problem that:
              @QSqlQuery query(m_db);
              QStringList queryes = script.split(QChar(';'));
              foreach(QString queryString, queryes){
              query.exec(queryString);
              }
              @[/quote]

              This only works if you never have a semicolon (';') in your data.

              http://www.catb.org/~esr/faqs/smart-questions.html

              1 Reply Last reply Reply Quote 0
              • A
                andre last edited by

                Indeed. For safety, you need to do some more intelligent parsing for your split than just splitting on a semicolon.

                1 Reply Last reply Reply Quote 0
                • M
                  maxim.prishchepa last edited by

                  Tnx a lot!
                  I'm rewrite code to this:
                  @QString queryToExec;
                  foreach(QString queryString, queryes){
                  queryToExec += queryString;
                  if(queryString.endsWith(QChar(')')) == false){
                  queryToExec += ";";
                  continue;
                  }
                  query.exec(queryToExec);
                  queryToExec = QString();
                  }@
                  I think in current data field never happen a string like ");"

                  Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz).

                  1 Reply Last reply Reply Quote 0
                  • G
                    goetz last edited by

                    @
                    CREATE sequence foo;
                    CREATE sequence bar;
                    @

                    bang

                    http://www.catb.org/~esr/faqs/smart-questions.html

                    1 Reply Last reply Reply Quote 0
                    • M
                      maxim.prishchepa last edited by

                      Ah... :)
                      Why Qt dose not contains a SQL parser? :))

                      Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz).

                      1 Reply Last reply Reply Quote 0
                      • G
                        goetz last edited by

                        [quote author="Maxim Prishchepa" date="1309862429"]Ah... :)
                        Why Qt dose not contains a SQL parser? :))[/quote]

                        Why should it? It's hard to implement and used only for corner cases... (yes I saw the smiley :-) )

                        http://www.catb.org/~esr/faqs/smart-questions.html

                        1 Reply Last reply Reply Quote 0
                        • A
                          andre last edited by

                          Note that for those corner cases, it may be acceptable to access the API of the underlying driver directly. There may be support for sending multiple statements in one go at that level. Otherwise, perhaps you can look into using Predicate. I believe that that SQL framework does include an SQL parser.

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post