0

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

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

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

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

表很简单,例如

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
4

1 回答 1

0

上面在评论中回答了问题:正如我在文档中看到的,当您以您的方式创建 QSqlQuery 时,查询(如果不为空)将被执行。要创建 QSqlQuery 并执行查询,请使用: QSqlQuery *q = new QSqlQuery(db); q->exec(query_string) 要查看最后执行的查询,请使用 QSqlQuery::lastQuery() 并且对于成功执行的最后一个查询 QSqlQuery::executedQuery() 希望这会有所帮助。– 赫克托 3 月 16 日在

于 2011-04-07T10:25:23.817 回答