qt sqlite插入autoincrement表会产生两行

时间:2011-03-15 09:14:46

标签: qt sqlite auto-increment insertion

您好 我有一个sqlite数据库,我正在使用sqlite数据库驱动程序内置的qts进行操作。

我有一个小的测试应用程序,允许我从行编辑运行一个SQL查询,它将被执行,然后在相关模型的视图中更新结果。

我创建了一个使用自动增量主键值的表,但如果我在不提供键的情况下执行insert语句,则会插入两行,每行都有一个自动增量值。

如果我提供键值,则只创建一行。任何想法为什么会这样?

表格很简单,例如

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

当我运行查询时

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

我得到两个带有自动增量ID的新行。但是,如果我跑

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

我按预期得到一行,正确的ID为100。 另外值得注意的是,如果我尝试

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

查询未运行。 运行查询的qt代码不能简单:

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;
}

我添加了一些日志代码来检查查询是否执行一次:

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;

日志确认我只执行一次:

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

如果我然后使用sqlite3 shell检查数据库(删除有关qt视图的任何疑问等):

sqlite> select * from groupnames;
1|hello
2|hello

1 个答案:

答案 0 :(得分:0)

上面的评论中回答了问题: 正如我在文档中看到的那样,当您按照自己的方式创建QSqlQuery时,查询(如果不为空)将被执行。要创建QSqlQuery并执行查询,请使用:QSqlQuery * q = new QSqlQuery(db); q-&gt; exec(query_string)要查看上次执行的查询,请使用QSqlQuery :: lastQuery()并且对于成功执行的最后一个查询,QSqlQuery :: executedQuery()希​​望这会有所帮助。 - Hector Mar 16 at