2017-09-05 218 views
0

我有類似於我見過的一些問題,但解決方案似乎不適合我,所以我會添加一個新的之一:QSqlRecord:從QT中的SQLite表訪問數值,結果爲空

我想從一個SQLite訪問表的數值(最高的用戶ID)到我的QT程序,用下面的查詢:

SELECT Name, MAX(ID) FROM User_lib; 

這個工作從命令外殼,與預期結果。

然後我嘗試與訪問最大ID值:

QSqlQuery qry_ID;  
qry_ID.prepare("SELECT Name, MAX(User_lib.ID) FROM User_lib"); 
qry_ID.exec() 
qDebug() << qry_ID.record().value("ID").toInt(); 

結果爲零(和空,如果我訪問「姓名」與toString()

另外,作爲測試

qDebug() << "Number of Rows: " << qry_ID.size(); 

我在其他幾個答案中看到給我-1。 在另一方面,

qDebug() << "Number of columns: " << qry_ID.record().count(); 

給我按預期的「2列數」。看起來查詢沒有結果。

起初我以爲我的查​​詢有問題,但同樣的事情發生時,當我試圖計數查詢中的行清楚地工作正確(表顯示,我可以正確添加元素等),所以我認爲我必須在QT中做錯了什麼。

+0

如何獲得'qry_ID'值? – vahancho

+0

這是查詢名稱:qry_ID.prepare(「SELECT Name,MAX(User_lib.ID)FROM User_lib」);將相應地編輯我的問題。 – user30248

+0

但你執行它?如果是,如何?請展示更多代碼。 – vahancho

回答

0

我還沒有檢查過上面的CL的答案,我相信它也能工作,但我設法找到了替代解決方案,對我來說很有用,而且可能很有趣。由於QsqlQuery的內部指針設置爲第一條記錄之前的一個字段,因此我必須繼續前進。這是工作的代碼:

QSqlQuery qry_ID; 
qry_ID.prepare("SELECT Name, MAX(ID) FROM User_lib"); 
qry_ID.exec(); 
qry_ID.next(); 

QString name = qry_ID.value(0).toString(); 
int IDmax = qry_ID.value(1).toInt();     

如果您需要訪問各種行,需要while循環,但這是一個不同的問題。

1

讓我們來看看你在命令行shell真正得到:

 
sqlite> .mode columns 
sqlite> .header on 
sqlite> SELECT Name, MAX(ID) FROM User_lib; 
Name  MAX(ID) 
---------- ---------- 
user30248 8562493 

所以在你從查詢得到的輸出,第二列是未命名IDMAX(ID)

documentation居然說:

結果列的名稱是該列的「AS」條款的評估,如果有一個AS子句。如果沒有AS子句,那麼列的名稱是未指定的,並可能從一個SQLite版本更改爲下一個。

因此使用AS,或通過其索引訪問列。


SQLite的按需計算輸出行,所以不可能給行的總數已經全部讀取之前。因此,SQLite驅動程序不支持the QuerySize feature