在使用QT的QSqlQueryModel操作SQLite數據庫的時候,遇到了查詢只能返回256個結果的問題,經過差不多大半天的時候才找到解決方法。既然說到數據庫操作了,就把一些基礎性的東西也都貼出來,一方面供初學者參考,另一方面自己也做個備忘。
QT中使用QSqlQuery或者QSqlQueryModelc操作數據庫的方法很簡單,這裏不再贅述,僅貼一個小例子來說明一下。
第一步:連接數據庫
QSqlDatabase m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(strDBPath);
if(!m_db.open())
{
QMessageBox::critical(0,tr("數據庫打開失敗"),tr("無法建立數據庫連接.\n"),QMessageBox::Cancel);
}
第二步:使用QSqlQueryModel或者QSqlQuery操作數據庫
QSqlQueryModel sqlModel;
QString strQuery = "select provinceID,province from province";
sqlModel.setQuery(strQuery);
for(int nProvinceNum = 0; nProvinceNum < sqlModel.rowCount(); nProvinceNum++)
{
cout<<sqlModel.record(nProvinceNum).value("provinceID").toDouble()<<endl;
cout<<strProvinceSqliteName = sqlModel.record(nProvinceNum).value("province").toString()<<endl;
}
通過上面兩步,就可以實現最簡單的SQLite數據庫操作了,可以正確的返回數據表中的數據一點兒問題都沒有。然後,錯誤就隱藏在疏忽大意之間,QT的QSqlQuery或QSqlQueryModel每次最多隻能緩存查詢結果的256條。即,如果查詢語句操作的結果超過256條了,也只能返回256。這樣就必然會導致在後續操作中的錯誤。
解決這個問題的方法也很簡答,但是卻讓我耗費了整整一個下午的時間:在操作結果前先通過fetchmore()來獲取所有的結果,方法如下:
while(dataSqlModel.canFetchMore())
{
dataSqlModel.fetchMore();
}
for(int nProvinceNum = 0; nProvinceNum < sqlModel.rowCount(); nProvinceNum++)
{
cout<<sqlModel.record(nProvinceNum).value("provinceID").toDouble()<<endl;
cout<<strProvinceSqliteName = sqlModel.record(nProvinceNum).value("province").toString()<<endl;
}