2011-03-15 103 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()希​​望這有幫助。 - 在