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

Qt通过事务读写操作多个数据库

相关推荐