2011-03-15 130 views
0

嗨 我有我使用内置的SQLite数据库驱动程序QTS操纵一个SQLite数据库。QT sqlite的插入到自动增量表产生两行

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

我创建了使用自动增量的主键值表,但如果我不提供关键执行INSERT语句,我得到两个行插入,每一个自动增量值。

如果我提供密钥值,将创建只有一行。任何想法,为什么这是?

表是很简单的,e.g

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

,当我运行查询

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

我与自动增量IDS两个新行。但是,如果我跑

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的外壳(以除去约QT观点等任何疑问)检查数据库:

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

你一定赫克托03月16日你的'run_query'不会被调用两次?在'q-> exec()'和_log返回code_之前和之后添加一些日志记录。请使用日志记录信息更新您的文章。 – Mat 2011-03-15 09:20:09

+1

正如我在文档中看到的,当您按照您的方式创建QSqlQuery时,将执行查询(如果不为空)。 要创建QSqlQuery并执行查询,请使用:'QSqlQuery * q = new QSqlQuery(db); Q-> EXEC(QUERY_STRING)' 要看到最后执行的查询,使用'QSqlQuery :: lastQuery()' 而在过去的查询,这是** **成功执行'QSqlQuery :: executedQuery()'希望这帮助。 – Hector 2011-03-16 03:44:09

+0

就是这样!谢谢!当我提供索引时,我只得到一行,因为第二个查询失败! – mike 2011-03-16 07:26:13

回答

0

问题是在评论上述回答: 正如我的文档中看到,当你创建一个QSqlQuery你的方式,查询,如果不为空,则执行。要创建QSqlQuery并执行查询,请使用以下命令:QSqlQuery * q = new QSqlQuery(db); q-> exec(query_string)要查看上次执行的查询,请使用QSqlQuery :: lastQuery()并为最后一个成功执行的查询QSqlQuery :: executedQuery()希​​望这有帮助。 - 在