Question

Hi I have a sqlite db which I am manipulating using qts built in sqlite database driver.

I have a small test app that allows me to run an sql query from a line edit and it will be executed and the results are then updated in a view of the relevant model.

I have created a table which uses autoincremented primary key values, but if I execute an insert statement without providing the key, I get two rows inserted, each with an autoincremented value.

If I provide the key value, only one row is created. Any ideas why this is?

Table is simple enough, e.g

CREATE TABLE GroupNames (  ID    integer PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE,  Name  varchar(50)) 

and when I run the query

insert into groupnames (name) values ("testName");

I get two new rows with autoincremented ids. However, if I run

insert into groupnames (id, name) values (100, "testName");

I get one row as expected, with the correct id 100. Also of note is that if I try

insert into table groupnames (id, name) values (100, "testName");
insert into table groupnames (name) values ("testName");

the query does not run. The qt code to run the query could not be simpler:

QSqlQuery *DbCore::run_query(const QString &query_string)
{
  QSqlDatabase db = QSqlDatabase::database(defConnectionName);    
  if(!db.isOpen())
    return NULL;
  QSqlQuery *q = new QSqlQuery(query_string, db);  
  q->exec();    
  return q;
}

I have added some logging code to check that the query is executed once:

QSqlDatabase db = QSqlDatabase::database(defConnectionName);    
  if(!db.isOpen())
    return NULL;

  qDebug() << "Running query:" << query_string;
  QSqlQuery *q = new QSqlQuery(query_string, db);  
  if(!q->exec())
    qDebug() << "Error running query:" << q->lastError();    
  return q;

The log confirms that I'm only executing once:

Running query: "insert into groupnames (name) values ("hello")" 

If i then check the database using sqlite3 shell (to remove any doubt about qt views etc):

sqlite> select * from groupnames;
1|hello
2|hello
Was it helpful?

Solution

question was answered above in a comment: As i see in the documentation, when you create a QSqlQuery the way you do, the query, if not empty, is executed. To create the QSqlQuery and execute the query, use this: QSqlQuery *q = new QSqlQuery(db); q->exec(query_string) To see the last executed query, use QSqlQuery::lastQuery() And for the last query that was successfully executed QSqlQuery::executedQuery() Hope this helps. – Hector Mar 16 at

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top