#pragma once #include "qtdatabasemodel_global.h" #include#include "QMutex" #include class QTDATAbaseMODEL_EXPORT DatabaseUtil { public: DatabaseUtil(); ~DatabaseUtil(); void setDatabaseInfo(QString strDatabaseIp, QString strDatabaseName, QString strAccount, QString strPassword, QString strDrive); QSqlDatabase getNewConnection(const QString& connectName); void closeConnection(const QString& connectName); private: //@brief 地址 QString m_strDatabaseIp; //@brief 数据库名称 QString m_strDatabaseName; //@brief 账号 QString m_strAccount; //@brief 密码 QString m_strPassword; //@brief 驱动类型 QString m_strDrive; //@brief 锁 static QMutex mutex; //@brief 已连接的数据名 QStack m_usedConnectionName; };
#include "DatabaseUtil.h" #include调用#include #include "QSqlError" QMutex DatabaseUtil::mutex; DatabaseUtil::DatabaseUtil() { } DatabaseUtil::~DatabaseUtil() { //销毁所有正在连接的数据库 for each (auto var in m_usedConnectionName) { getNewConnection(var).close(); if (QSqlDatabase::contains(var)) { closeConnection(var); } } } void DatabaseUtil::setDatabaseInfo(QString strDatabaseIp, QString strDatabaseName, QString strAccount, QString strPassword, QString strDrive) { m_strDatabaseIp = strDatabaseIp; m_strDatabaseName = strDatabaseName; m_strAccount = strAccount; m_strPassword = strPassword; m_strDrive = strDrive; } QSqlDatabase DatabaseUtil::getNewConnection(const QString& connectName) { QMutexLocker tempLock(&mutex); if (QSqlDatabase::contains(connectName)) { QSqlDatabase tempDB = QSqlDatabase::database(connectName); if (!tempDB.isOpen()) { tempDB.open(); } //测试数据连接通畅性 if (!tempDB.isOpenError()) { QSqlQuery query = tempDB.exec("SELECT 0;"); if (query.lastError().type() == QSqlError::NoError) { return tempDB; } } return QSqlDatabase(); } else { QSqlDatabase db = QSqlDatabase::addDatabase(m_strDrive, connectName); db.setDatabaseName(QString("DRIVER={SQL SERVER};" "SERVER=%1;" //服务器名称 "DATAbase=%2;"//数据库名 "UID=%3;" //登录名 "PWD=%4;" //密码 ) .arg(m_strDatabaseIp) .arg(m_strDatabaseName) .arg(m_strAccount) .arg(m_strPassword) ); db.setConnectOptions("SQL_ATTR_LOGIN_TIMEOUT=2"); db.connectOptions(); if (db.open()) { m_usedConnectionName.append(connectName); return db; } else { return QSqlDatabase(); } } } void DatabaseUtil::closeConnection(const QString & connectName) { QMutexLocker tempLock(&mutex); if (QSqlDatabase::contains(connectName)) { QSqlDatabase tempDB = QSqlDatabase::database(connectName); if (tempDB.isOpen()) { tempDB.close(); } QSqlDatabase::removeDatabase(connectName); } }
QString LogInfo;
LogInfo.sprintf("%p", QThread::currentThread());
auto db = getNewConnection(LogInfo);
获取线程的ID,作为数据库的连接名。



