Qt經過事務讀寫操做多個數據庫

sqlite的事務機制,正常狀況下執行sql語句,會出現頻繁的數據庫讀寫操做,啓用事務機制後,會在必定狀態下去執行數據庫的讀寫,至關於內存裏面有一個緩衝池,會提升n倍的數據庫操做效率。sql

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.cppspa

#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 << "\n";
  }
  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\n";

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()<<"\n";

  }
}

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\n";

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);
相關文章
相關標籤/搜索