database.h
#ifndef DATABASE_H
#define DATABASE_H
#include <QObject>
#include <QSqlDatabase>
#include <QMutex>
#include <QSqlError>
#include "databasestruct.h"
class DataBase : public QObject
{
Q_OBJECT
private:
explicit DataBase(QObject *parent = 0);
~DataBase();
DataBase(const DataBase &dataBase);
DataBase operator=(const DataBase &dataBase);
public:
// 是否已连接上数据库
bool isOpen();
// 数据库错误信息
QSqlError lastError() const;
public:
static DataBase* getInstance();
private:
static DataBase *_instance;
static QSqlDatabase _database;
static QMutex _mutex;
signals:
public slots:
// 设置数据库相关参数
void setDatabaseInfo(const QString &databaseType, const QString &databaseName, const QString &username, const QString &password);
// 设置主机参数
void setHostInfo(const QString &hostName, int port);
// 打开连接数据库
bool open();
// 关闭数据库连接
void close();
};
#endif // DATABASE_H
database.cpp
#include "database.h"
#include <QDebug>
#include <QSqlQuery>
#include <QDateTime>
DataBase *DataBase::_instance = NULL;
QSqlDatabase DataBase::_database;
QMutex DataBase::_mutex;
DataBase::DataBase(QObject *parent) : QObject(parent)
{
}
DataBase::~DataBase()
{
close();
}
//DataBase::DataBase(const DataBase &dataBase)//indifferent
//{
//}
//DataBase DataBase::operator=(const DataBase &dataBase)//indifferent
//{
// return *this;
//}
bool DataBase::isOpen()
{
return _database.isOpen();
}
QSqlError DataBase::lastError() const
{
return _database.lastError();
}
DataBase *DataBase::getInstance()
{
_mutex.lock();
if( NULL == _instance )
{
_instance = new DataBase;
}
_mutex.unlock();
return _instance;
}
void DataBase::setDatabaseInfo(const QString &databaseType, const QString &databaseName, const QString &username, const QString &password)
{
_mutex.lock();
_database = QSqlDatabase::addDatabase( databaseType );
_database.setDatabaseName( databaseName );
_database.setUserName( username );
_database.setPassword( password );
_mutex.unlock();
}
void DataBase::setHostInfo(const QString &hostName, int port)
{
_mutex.lock();
_database.setHostName( hostName );
_database.setPort( port );
_mutex.unlock();
}
bool DataBase::open()
{
_mutex.lock();
if( !_database.open() )
{
qDebug() << _database.lastError();
qDebug() << _database.lastError().text();
_mutex.unlock();
return false;
}
_mutex.unlock();
return true;
}
void DataBase::close()
{
_mutex.lock();
_database.close();
_mutex.unlock();
}
确保程序正常运行需要libeay32.dll、libintl.dll、libpq.dll、ssleay32.dll。