简介
读取表中全部数据
QSqlTableModel每次最多只能缓存查询结果的256条。即,如果查询语句(filter select)操作的结果超过256条了,rowCount也只能返回256。
QSqlTableModel model;
MonitorPointsC mpc;
model.setTable(MONITORTABLENAME);//设置表
model.setFilter(""); //选择表
model.select();
//在操作结果前先通过fetchmore()来获取所有的结果
while (model.canFetchMore())
{
model.fetchMore();
}
addMessage("", QStringLiteral("%1").arg(model.rowCount()));
更新表中某列数据
这里采用QSqlTableModel操作数据库,对于数据量较大情况,性能与QSqlQuery相比有巨大差距。为了提升性能,db.transaction();与db.commit();的使用可以使的二者性能接近。
db.transaction();
for (int i = 0; i < model.rowCount(); ++i)
{
QSqlRecord record = model.record(i);
QString temp = record.value(mpc.CurrentTime).toString();
if (temp.indexOf(" 00:00:00") == -1)
{
continue;
}
temp = temp.replace(" 00:00:00", "");
record.setValue(mpc.CurrentTime, temp);
model.setRecord(i, record);
if (model.submitAll()){
//addMessage("", QStringLiteral("%1").arg("succ"));
}
else{
//addMessage("", QStringLiteral("%1").arg("fail"));
}
}
//addMessage("", QStringLiteral("%1").arg("成功"));
db.commit();
关于transaction()与commit()介绍
Qt在操作大量数据执行插入操作时,推荐使用事务
1.SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行query.exec(“insert into DataBase(……) values(……)”);就会打开和关闭文件100万次,所以速度当然会很慢。
2.SQLite数据库是支持事务操作的,于是我们就可以通过事务来提高数据库的读写速度。事务的基本原理是:数据库管理系统首先会把要执行的sql语句存储到内存当中,只有当commit()的时候才一次性全部执行所有内存中的数据库。
不用事务
如果不用事务,插入1000条数据到sqlite数据库,要执行1000次开启事务、结束事务。
Qt中使用事务的大致方法:
db.transaction();
执行插入的sql(n条插入操作)
db.commit();
或者
QSqlDatabase::database().transaction();
执行插入的sql(n条插入操作)
QSqlDatabase::database().commit();
参考:https://blog.csdn.net/rl529014/article/details/79451381