使用QSqlQuery可以方便地查询数据信息,插入新的数据。下面是本文示例使用的表:
一 查询
两种方式:
1.直接式
QSqlQuery query;
query.exec(sqlstatement);
例:
QSqlQuery query;
QString str = time.toString();
str = QObject::tr("select tempreture , rtime from weathers where time(rtime) < '%1'").arg(time.toString() ) ;
bool bRet = query.exec(str);
if(!bRet)
QString DbError = query.getLastError().text();
上面的代码中使用了占位符来传递程序中的参数,注意%1要被单引号包住,sql语句没有最后的分号‘;’.
2.使用prepare
QSqlQuery query;
query.prepare(sqlstatement);
query.exec();
例:
QSqlQuery query;
query.prepare("select tempreture , rtime from weathers where time(rtime) < ? and date(rtime) = ? ");
query.addBindValue(time.toString());
query.addBindValue(QDate::currentDate());
query.exec();
在上面的代码中,?为占位符,addBindValue()按照点位符出现的顺序来绑定相应的参数。
二. 处理查询结果
while(query.next()){
QString tempreture = query.value(0).toString();
vecTempre.push_back(tempreture.toInt());
QString theTime = query.value(1).toString();
qDebug()<< tempreture << theTime;
}
第一次调用next()将QSqlQuery()定位到返回的第一条记录,后续的next()调用每次将记录指针后移一条记录,直到记录末尾next()返回"false".
value()函数以QVariant类型按照参数中指定的编号返回一个字段的值,其中编号是这些字段在select语句中的排列顺序。
数据库中的不同数据类型被映射成相应的C++和Qt数据类型存储于QVariant变量中, 如VARCHAR被映射成QString类型,DATETIME被映射成QDateTime类型。
三. 插入数据
插入操作与查询基本相同,可以在QSqlQuery中直接执行,也可以prepare.即可以直接写入数据也可以采用占位符的方式。
QSqlQuery query;
bool bRet = query.prepare("INSERT INTO weathers (tempreture, humidity, wind_direction, wind_level, rtime, updateTime )"
"VALUES(:tempreture, :humidity, :wind_direction, :wind_level, :rtime, :updateTime)");
QString dbError = query.lastError().text();
query.bindValue(":tempreture", QString::number(pInfo->tempreture));
query.bindValue(":humidity", QString::number(pInfo->humidity));
query.bindValue(":wind_direction", QString::fromLocal8Bit(pInfo->wind_direction.c_str()));
query.bindValue(":wind_level", QString::number(pInfo->wind_level));
QDateTime day = QDateTime::currentDateTime();
QString sday = day.toString(Qt::ISODate);
sday.replace("T", " ");
query.bindValue(":rtime",sday);
QString time = pInfo->time.c_str();
time += ":00";
query.bindValue(":updateTime" , time );
bRet = query.exec();
dbError = query.lastError().text();
query.exec("commit");