天天看點

QT的QSqlQuery與QSqlQueryModel讀取資料庫問題

在使用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;

      }