Qt数据库

数据库

数据库交互

SQLHelper.h

#ifndef SQLHELPER_H
#define SQLHELPER_H

#include <QObject>
#include<QSqlDatabase>
#include<QSqlError>
#include<QSqlQuery>


class SQLHelper : public QObject
{
    Q_OBJECT
public:
    explicit SQLHelper(QObject *parent = 0);

    // 获取Qt支持的驱动
    QStringList showDriver();

    //初始化
    bool init(QString connName, QString dbName, QString ip, int port, QString userName, QString pwd, const QString dbType = "QSQLITE");

    //打开
    bool open();

    //关闭
    void close();

    //执行sql语句
    bool exec(QString sql);

    //批量执行
    bool execBatch();

    //事务
    bool transaction();

    //提交
    bool commit();

    //回滚
    bool rollback();

    //获取Query对象
    QSqlQuery& getSqlQuery();

    //获取数据库对象
    QSqlDatabase& getSqlDatabase();

    //错误信息
    QString errorMessage();


signals:

public slots:


private:
    QSqlQuery sqlQuery;   //todo 1,调度线程使用其查询,2,事务处理线程使用其进行数据存储,二者都用到
                            //QSqlQuery中的数据使用时要防止出现线程安全问题
    QSqlDatabase sqlDataBase;
    QString sqlErrorMessage;

    QString sqlConnName;
    QString sqlDbName;
    QString sqlIP;
    QString sqlUserName;
    QString sqlPassword;
    QString sqlDbType;
    int  sqlPort;

};

#endif // SQLHELPER_H

SQLHelper.cpp

#include "SQLHelper.h"

#include <QUuid>
#include <QVariant>
#include <QDebug>
#include <QTime>
#include <QFileInfo>
#include <QDir>
#include "LogHelper/LogHelper.h"

SQLHelper::SQLHelper(QObject *parent) : QObject(parent)
{

}

QStringList SQLHelper::showDriver()
{
    QStringList list = sqlDataBase.drivers();
    qInfo() << list;
    return list;
}

bool SQLHelper::init(QString connName, QString dbName, QString ip, int port, QString userName, QString pwd, const QString dbType)
{
    if (connName.isEmpty() ||
        dbName.isEmpty()   ||
        ip.isEmpty()       ||
        userName.isEmpty() ||
        pwd.isEmpty()      ||
        dbType.isEmpty()   ||
        port <= 0 || port > 65535) {
        return false;
    }

    //初始化配置
    sqlConnName = connName;
    sqlDbName = dbName;
    sqlIP=ip;
    sqlUserName = userName;
    sqlPassword=pwd;
    sqlDbType=dbType;

    sqlPort = port;
    return true;
}


bool SQLHelper::open()
{
    if (QSqlDatabase::contains(sqlConnName)) {
        sqlDataBase = QSqlDatabase::database(sqlConnName);
    }
    else {
        //!平台初始化读取配置
        sqlDataBase = QSqlDatabase::addDatabase(sqlDbType, sqlConnName);
        QString dirPath = QDir::fromNativeSeparators(sqlDbName);
//        qInfo()<<"dirPath=="<< dirPath;
        if(dirPath.contains("/")){
            QString folder = dirPath.replace(dirPath.split("/")[dirPath.split("/").size()-1],"");
            //qInfo()<< folder;
            QFileInfo fileInfo(folder);
            if(!fileInfo.exists()){
                QDir tmpDir;
                tmpDir.mkpath(folder);
            }
        }
        sqlDataBase.setDatabaseName(sqlDbName);//使用哪个数据库
        sqlDataBase.setHostName(sqlIP);//数据库服务器IP
        sqlDataBase.setPort(sqlPort);//数据库端口号
        sqlDataBase.setUserName(sqlUserName);//数据库用户名
        sqlDataBase.setPassword(sqlPassword);//密码
    }

    if(!sqlDataBase.open()){
        sqlErrorMessage = sqlDataBase.lastError().text();
        qInfo()<<sqlDataBase.lastError().text().toLocal8Bit().constData();
        return false;
    }

    //!连接成功后设置query
    sqlQuery = QSqlQuery(sqlDataBase);
//    qInfo()<<"open db success! dbName:"<<sqlDbName<<QTime::currentTime()<<"\n";

    return true;
}

void SQLHelper::close()
{
    sqlQuery.clear();
    ///
    if(sqlDataBase.isOpen()){
        sqlDataBase.close();
    }
    if(sqlDataBase.contains(sqlConnName)){
        sqlDataBase = QSqlDatabase();
        ///  解决UOS数据库连接问题
        sqlDataBase.removeDatabase(sqlConnName);
    }

}

bool SQLHelper::exec(QString sql)
{
    if(!sqlDataBase.isOpen()){
        open();
    }

    if(!sqlQuery.exec(sql)){
        sqlErrorMessage = sqlQuery.lastError().text();
        qInfo()<<sqlDataBase.lastError().text().toLocal8Bit().constData();
        Log_ERROR("sql Error:%s ",sql.toUtf8().data());

        return false;
    }


    return true;
}


bool SQLHelper::execBatch() {
    if(!sqlDataBase.isOpen()){
        open();
    }
    if(!sqlQuery.execBatch()){
        sqlErrorMessage = sqlQuery.lastError().text();
        qInfo()<<sqlDataBase.lastError().text().toLocal8Bit().constData();
        return false;
    }
    return true;
}

bool SQLHelper::transaction()
{
    if(!sqlDataBase.isOpen()){
        open();
    }
    return sqlDataBase.transaction();
}

bool SQLHelper::commit()
{
    if(!sqlDataBase.commit()){
        sqlErrorMessage = sqlDataBase.lastError().text();
        qInfo()<<sqlDataBase.lastError().text().toLocal8Bit().constData();
        return false;
    }
    return true;
}

bool SQLHelper::rollback()
{
    if(!sqlDataBase.rollback()){
        sqlErrorMessage = sqlDataBase.lastError().text();
        qInfo()<<sqlDataBase.lastError().text().toLocal8Bit().constData();

        return false;
    }

    return true;
}

QSqlQuery &SQLHelper::getSqlQuery()
{
    return sqlQuery;
}

QSqlDatabase &SQLHelper::getSqlDatabase()
{
    return sqlDataBase;
}

QString SQLHelper::errorMessage()
{
    return sqlErrorMessage;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值