QSqlQuery 执行完 SELECT 语句后,调用.size函数总是返回-1……找不到原因,求助

时间:2021-06-26 10:45:45
代码如下:

   bool OpenTempSeriesDB( QString strDBFile)
  {
      QSqlDatabase pTempDB = QSqlDatabase::addDatabase("QSQLITE", "SeriDatabase");

      pTempDB.setHostName("localhost");
      pTempDB.setDatabaseName( strDBFile );  (strDBFile是指定的数据库文件)

      if ( !pTempDB.open() )
      {
          qDebug()<<"连接数据库失败,请检查数据库设置!";
          return false;
      }

      return true;
  }


   if( !OpenTempSeriesDB(strDBFile, bUseDefaultSeriesDB) )
    {
        return false;
    }

    // 数据库操作
    QSqlQuery RS( QSqlDatabase::database( "SeriDatabase" ) );

    RS.exec("SELECT COUNT(UID) FROM Tables WHERE UID = '123456'" )

    RS.size() == -1  ( 总是返回 -1 , 找不到原因啊  )



9 个解决方案

#1


这个只能自己调试,用 QSqlError,比如你的情况:
#include <QSqlError>
...
RS.exec("SELECT COUNT(UID) FROM Tables WHERE UID = '123456'" );
qDebug() << RS.lastError();

#2


是-1.你往后挪一个位置就行了。执行RS.next();这样再使用就行了

#3


看不懂,OpenTempSeriesDB函数里面就是用局部变量打开了一下数据库,这个函数是干什么用的啊?后面的代码就调用了一下这个函数然后就去执行数据库操作了,调用OpenTempSeriesDB函数的参数个数还和前面的不一样。

#4


给你贴段代码上来
int DBAdvertise::getAdvertiseCount()
{
QString sql;
QSqlQuery query(DB::m_db);
bool result;
int count = 0;

QString time = QDate::currentDate().toString("yyyy-MM-dd");

sql.append("SELECT count(*) FROM ");
sql.append(ADVERTISE_TABLE_NAME); 
sql.append(" WHERE time=");
sql.append(DB::addYinHao(time));
result = query.exec(sql);

query.next();
count = query.value(0).toInt();

return count;
}
我就是这么用的

#5


你看看这样用行不行

#6


谢谢,我这里RS.size() ,是想返回刚才RS执行查询结果 的“记录数目”,看查询出了 几行记录,正常情况下应该是大于等于0的

#7


可能的原因如下:
1. 数据库的连接是否为有效连接。SQLITE数据库无论路径是否有效,open总是返回true。如果在windows系统下,注意路径字符串的传入等是否正确。
2. SQL语句是否有误。建议先在sql工具下测试运行一遍,是否能正常运行。

#8


谢谢各位,我测试了一下,发现select语句执行完之后,.size()函数返回都是-1    
        pRS->next();
        nRecordCounts = pRS->value(0).toInt();

最后用 上面两句话  代替了  开始代码中的 RS.size()  就可以正确获取到  select 执行完之后的符合条件的记录的数目。

此问题暂时解决,谢谢大家帮助。

#9


看看文档吧,还没结贴,我还想查Qt5.0以上版本有没有解决qsqlquery对sqlite驱动 size的问题呢
Returns the size of the result (number of rows returned), or -1 if the size cannot be determined or if the database does not support reporting information about query sizes.

#1


这个只能自己调试,用 QSqlError,比如你的情况:
#include <QSqlError>
...
RS.exec("SELECT COUNT(UID) FROM Tables WHERE UID = '123456'" );
qDebug() << RS.lastError();

#2


是-1.你往后挪一个位置就行了。执行RS.next();这样再使用就行了

#3


看不懂,OpenTempSeriesDB函数里面就是用局部变量打开了一下数据库,这个函数是干什么用的啊?后面的代码就调用了一下这个函数然后就去执行数据库操作了,调用OpenTempSeriesDB函数的参数个数还和前面的不一样。

#4


给你贴段代码上来
int DBAdvertise::getAdvertiseCount()
{
QString sql;
QSqlQuery query(DB::m_db);
bool result;
int count = 0;

QString time = QDate::currentDate().toString("yyyy-MM-dd");

sql.append("SELECT count(*) FROM ");
sql.append(ADVERTISE_TABLE_NAME); 
sql.append(" WHERE time=");
sql.append(DB::addYinHao(time));
result = query.exec(sql);

query.next();
count = query.value(0).toInt();

return count;
}
我就是这么用的

#5


你看看这样用行不行

#6


谢谢,我这里RS.size() ,是想返回刚才RS执行查询结果 的“记录数目”,看查询出了 几行记录,正常情况下应该是大于等于0的

#7


可能的原因如下:
1. 数据库的连接是否为有效连接。SQLITE数据库无论路径是否有效,open总是返回true。如果在windows系统下,注意路径字符串的传入等是否正确。
2. SQL语句是否有误。建议先在sql工具下测试运行一遍,是否能正常运行。

#8


谢谢各位,我测试了一下,发现select语句执行完之后,.size()函数返回都是-1    
        pRS->next();
        nRecordCounts = pRS->value(0).toInt();

最后用 上面两句话  代替了  开始代码中的 RS.size()  就可以正确获取到  select 执行完之后的符合条件的记录的数目。

此问题暂时解决,谢谢大家帮助。

#9


看看文档吧,还没结贴,我还想查Qt5.0以上版本有没有解决qsqlquery对sqlite驱动 size的问题呢
Returns the size of the result (number of rows returned), or -1 if the size cannot be determined or if the database does not support reporting information about query sizes.