QSqlTableModel 类操作数据库(创建、查询、删除、修改)详解

简介

读取表中全部数据

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

猜你喜欢

转载自blog.csdn.net/wokaowokaowokao12345/article/details/106710484