最近做项目需要使用Qt做一个表格,想法是直接绑定本地数据库字段然后显示就行了,由于刚学习Qt不久,过程十分曲折,先博客一篇仅作记录,新手上路,欢迎批评指正。
在Qt中有自带的QSql类是用来操作数据库的,本着面向对象的原则,我决定将数据库连接封装成一个类。先引入头文件
#include <QMutex> //线程保护序列化
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
三个类可以通过查Qt的帮助文档搞清楚含义,通俗来讲QSqlDatabase就是连接数据库,QSqlQuery就是查询语句,废话不多说,直接上代码。
class MyDataBase
{
public:
MyDataBase();
~MyDataBase();
private:
MyDataBase(const MyDataBase &);
MyDataBase operator =(const MyDataBase &);
public:
static MyDataBase * GetInstance();
bool ConnectAccessDB(const QString &strDBName,
const QString &strUser,
const QString &strPwd) const;
QSqlDatabase GetDatabase() const
{
return QSqlDatabase::database("MyAccessDB");
}
QSqlQuery GetSqlQuery() const
{
static QSqlQuery query(m_pInstance->GetDatabase());
return query;
}
bool IsValid() const
{
return this->GetDatabase().isValid();
}
bool IsConnected() const
{
return this->GetDatabase().isOpen();
}
private:
static MyDataBase *m_pInstance;
};
.cpp文件是这样的
#include "mydatabase.h"
#include <QDebug>
MyDataBase * MyDataBase::m_pInstance(NULL);
MyDataBase::MyDataBase()
{
}
MyDataBase::~MyDataBase()
{
}
MyDataBase * MyDataBase::GetInstance()
{
if(NULL == m_pInstance)
{
static QMutex mutex;
mutex.lock();
if( NULL == m_pInstance)
{
static MyDataBase myDB;
m_pInstance = &myDB;
}
mutex.unlock();
}
return m_pInstance;
}
bool MyDataBase::ConnectAccessDB(const QString &strDBName, const QString &strUser, const QString &strPwd) const
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "MyAccessDB");
const QString strName(QString("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DBQ=%1;Uid=%2;Pwd=%3")
.arg(strDBName)
.arg(strUser)
.arg(strPwd));
db.setDatabaseName(strName);
qDebug()<<strName;
if (!db.isValid())
{
return false;
}
if (db.isOpen())
{
return true;
}
if (db.open())
{
// QStringList p=db.tables(QSql::AllTables);
// for(int i=0;i<p.count();i++)
// {
// qDebug()<<p[i];
// }
return true;
}
else
{
qDebug() << db.lastError().text();
return false;
}
}