现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

QT的QSqlQuery与QSqlQueryModel读取数据库问题

2015-10-08 15:17 工业·编程 ⁄ 共 1426字 ⁄ 字号 暂无评论

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

      }

作者:qinpanke

给我留言

留言无头像?