Qt通过事务读写操作多个数据库
sqlite的事务机制,正常情况下执行sql语句,会出现频繁的数据库读写操作,启用事务机制后,会在一定状态下去执行数据库的读写,相当于内存里面有一个缓冲池,会提高n倍的数据库操作效率。
DataControl.h
#ifndef _DATA_CONTROL_H_ #define _DATA_CONTROL_H_ #include <QtSql/qsqldatabase.h> #include <QtSql/qsqlquery.h> #include <QtSql/qsqlerror> #include <qstring> #include <QtCore/qstringlist> #include <QFile> #include <QtCore/qmap.h> //数据操作类 //使用QMap实现一个简单的锁 namespace QTOOL { class DataControl { public: DataControl(); ~DataControl(); //打开、关闭数据库 QSqlDatabase* OpenDataBase(QString strDataBase); bool CloseDataBase(QString strDataBase); QSqlDatabase* FindDataBase(QString strDataBase); QSqlDatabase* FlushDataBase(QString strDataBase); //打开、关闭文件 QFile* OpenFile(QString strFile,QFlags<QIODevice::OpenModeFlag> eOpenMode = QIODevice::Append); bool CloseFile(QString strFile); QFile* FindFile(QString strFile); //bool public: QMap<QString,QSqlDatabase*> m_mapDataBase; QMap<QString,QFile*> m_mapFile; }; } #endif
DataControl.cpp
#include "DataControl.h" QTOOL::DataControl::DataControl() { } QTOOL::DataControl::~DataControl() { //对没有关闭的数据库进行关闭 if (m_mapDataBase.count() > 0) { QMap<QString,QSqlDatabase*>::iterator it = m_mapDataBase.begin(); if (it != m_mapDataBase.end()) { if (it.value()->isOpen()) { it.value()->close(); } } m_mapDataBase.clear(); } //对没有关闭的文件进行关闭 if (m_mapFile.count() > 0) { QMap<QString,QFile*>::iterator it2 = m_mapFile.begin(); if (it2 != m_mapFile.end()) { if (it2.value()->isOpen()) { it2.value()->close(); } } m_mapFile.clear(); } } QSqlDatabase* QTOOL::DataControl::OpenDataBase( QString strDataBase ) { QMap<QString,QSqlDatabase*>::iterator it = m_mapDataBase.find(strDataBase); if (it != m_mapDataBase.end()) { //判断数据库库是否已经被关闭 if (!m_mapDataBase[strDataBase]->isOpen()) { m_mapDataBase[strDataBase]->open(); } //开启一个事务,使用事务批量写入SQLite的速度会有很大的提高。 m_mapDataBase[strDataBase]->transaction(); return (m_mapDataBase[strDataBase]); } //注意:这里使用文件地址作为链接名称,否则打开多个数据库,先打开的会被后打开的覆盖。 QSqlDatabase* database= new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE",strDataBase)); database->setDatabaseName(strDataBase); database->setUserName("root123"); database->setPassword("123456"); //打开数据库 if(!database->open()) { return NULL; } m_mapDataBase.insert(strDataBase,database); m_mapDataBase[strDataBase]->transaction(); return m_mapDataBase[strDataBase]; } bool QTOOL::DataControl::CloseDataBase( QString strDataBase ) { QMap<QString,QSqlDatabase*>::iterator it = m_mapDataBase.find(strDataBase); if (it != m_mapDataBase.end()) { //关闭文件 //先结束事务(不结束应该也没什么影响,关闭会自动刷新的) it.value()->commit(); it.value()->close(); //从列表里面删除 m_mapDataBase.erase(it); return true; } return false; } QSqlDatabase* QTOOL::DataControl::FindDataBase( QString strDataBase ) { QMap<QString,QSqlDatabase*>::iterator it = m_mapDataBase.find(strDataBase); if (it != m_mapDataBase.end()) { return (it.value()); } return NULL; } QSqlDatabase* QTOOL::DataControl::FlushDataBase( QString strDataBase ) { QMap<QString,QSqlDatabase*>::iterator it = m_mapDataBase.find(strDataBase); if (it != m_mapDataBase.end()) { //提交上一个事务,并开始一个新的事务 it.value()->commit(); it.value()->transaction(); return (it.value()); } return NULL; } QFile* QTOOL::DataControl::OpenFile( QString strFile, QFlags<QIODevice::OpenModeFlag> eOpenMode) { QMap<QString,QFile*>::iterator it = m_mapFile.find(strFile); if (it != m_mapFile.end()) { //判断文件是否已经被关闭 if (!m_mapFile[strFile]->isOpen()) { m_mapFile[strFile]->open(eOpenMode); } return (m_mapFile[strFile]); } QFile* file = new QFile(strFile); if (file->open(eOpenMode)) { m_mapFile.insert(strFile,file); return (m_mapFile[strFile]); } return NULL; } bool QTOOL::DataControl::CloseFile( QString strFile ) { QMap<QString,QFile*>::iterator it = m_mapFile.find(strFile); if (it != m_mapFile.end()) { //关闭文件 it.value()->close(); //从列表里面删除 m_mapFile.erase(it); return true; } return false; } QFile* QTOOL::DataControl::FindFile( QString strFile ) { QMap<QString,QFile*>::iterator it = m_mapFile.find(strFile); if (it != m_mapFile.end()) { return (it.value()); } return NULL; }
//================================写文件示例============================== QTOOL::DataControl dc; QFile* file = dc.OpenFile(QString::fromLocal8Bit("d:/test.ini")); if (file != NULL) { QTextStream ts(&*file); for (int i = 0; i < 10;i++) { ts<<"hello " << i << " "; } file->flush(); file->close(); } //============================读文件示例================================== QTOOL::DataControl dc; QString fileAddress = QString::fromLocal8Bit("d:/test.ini"); QFile* file = dc.OpenFile(fileAddress,QIODevice::ReadOnly); QTextStream ts(file); QString fileDate = ts.readLine(); QString dataBaseStruct = ts.readLine(); while(!ts.atEnd()) { a++; QString strCurrentLine = ts.readLine(); QStringList strListCurrentLine = strCurrentLine.split(";"); } dc.CloseFile(fileAddress);
//======================读数据库并写入文件示例============================ QTOOL::DataControl dc; QString fileAddress = QString::fromLocal8Bit("d:/test2.ini"); QFile* file = dc.OpenFile(fileAddress,QIODevice::ReadWrite|QIODevice::Truncate); QTextStream ts(file); //ts<<"ID;BELONG;NAME;STATE;LON;LAT;PIC "; QString fileDate = ts.readLine(); QString dataBaseStruct = ts.readLine(); //打开数据库 QString strDataBaseAddress = QString::fromLocal8Bit("d:/test.db"); QSqlDatabase* database = dc.OpenDataBase(strDataBaseAddress); QString create_sql = "create table student (id int ,belong varchar(100), name varchar(100),state int,lon float,lat float,pic varchar(200))"; QString insert_sql = "insert into student values (?, ?, ?, ? ,? ,? ,?)"; QString select_all_sql = "select * from student"; //QSqlQuery类提供执行和操作的SQL语句的方法。 //可以用来执行DML(数据操作语言)语句,如SELECT、INSERT、UPDATE、DELETE, //以及DDL(数据定义语言)语句,例如CREATE TABLE。 //也可以用来执行那些不是标准的SQL的数据库特定的命令。 QSqlQuery sql_query(*database); sql_query.prepare(select_all_sql); if (sql_query.exec()) { while(sql_query.next()) { ts<<sql_query.value(0).toString()<<";"<<sql_query.value(1).toString()<<";" <<sql_query.value(2).toString()<<";"<<sql_query.value(3).toString()<<";" <<sql_query.value(4).toString()<<";"<<sql_query.value(5).toString()<<";" <<sql_query.value(6).toString()<<" "; } } dc.FlushDataBase(strDataBaseAddress); dc.CloseFile(fileAddress); dc.CloseDataBase(strDataBaseAddress);
//=======================读文件并写入数据库示例=========================== QTOOL::DataControl dc; QString fileAddress = QString::fromLocal8Bit("d:/test.ini"); QFile* file = dc.OpenFile(fileAddress,QIODevice::ReadOnly); QTextStream ts(file); //ts<<"ID;BELONG;NAME;STATE;LON;LAT;PIC "; QString fileDate = ts.readLine(); QString dataBaseStruct = ts.readLine(); //打开数据库 QString strDataBaseAddress = QString::fromLocal8Bit("d:/test.db"); QSqlDatabase* database = dc.OpenDataBase(strDataBaseAddress); QString create_sql = "create table student (id int ,belong varchar(100), name varchar(100),state int,lon float,lat float,pic varchar(200))"; QString insert_sql = "insert into student values (?, ?, ?, ? ,? ,? ,?)"; //QSqlQuery类提供执行和操作的SQL语句的方法。 //可以用来执行DML(数据操作语言)语句,如SELECT、INSERT、UPDATE、DELETE, //以及DDL(数据定义语言)语句,例如CREATE TABLE。 //也可以用来执行那些不是标准的SQL的数据库特定的命令。 QSqlQuery sql_query(*database); sql_query.prepare(create_sql); if(!sql_query.exec()) { qDebug()<<sql_query.lastError(); } else { qDebug()<<"table created!"; } int a = 0; while(!ts.atEnd()) { a++; QString strCurrentLine = ts.readLine(); QStringList strListCurrentLine = strCurrentLine.split(";"); strListCurrentLine.at(0); sql_query.prepare(insert_sql); sql_query.addBindValue(strListCurrentLine.at(0).toInt()); sql_query.addBindValue(strListCurrentLine.at(1)); sql_query.addBindValue(strListCurrentLine.at(2)); sql_query.addBindValue(strListCurrentLine.at(3).toInt()); sql_query.addBindValue(strListCurrentLine.at(4).toFloat()); sql_query.addBindValue(strListCurrentLine.at(5).toFloat()); sql_query.addBindValue(strListCurrentLine.at(6)); if(!sql_query.exec()) { qDebug()<<sql_query.lastError(); } else { qDebug()<<"inserted!"; } } dc.FlushDataBase(strDataBaseAddress); dc.CloseFile(fileAddress); dc.CloseDataBase(strDataBaseAddress);{!-- PGC_COLUMN --}
本文转载自:https://blog.csdn.net/xiaopeixiaojun/article/details/49232859
作者:大圣39