一、连接Access数据库:
① 在.pro文件中添加 QT+=sql ;
② 在Qt中有自带的QSql类是用来操作数据库的,将数据库连接封装成一个类,引入头文件。三个类可以通过查Qt的帮助文档搞清楚含义,通俗来讲QSqlDatabase就是连接数据库,QSqlQuery就是查询语句;
#include <QMutex> //线程保护序列化
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>
#include <QtSql/QSqlIndex>
#include <QtSql/QSqlRecord>
#include <QTextStream>
#include <QStringList>
#include <QVariant>
#include <windows.h>
#include <QFile>
#include <QFileDialog>
typedef struct
{
QString a;
DWORD b;
long c;
}CDBPARAMETER;
typedef std::vector<CDBPARAMETER*> ParamListVec;
class MyDataBase
{
public:
MyDataBase();
~MyDataBase();
private:
MyDataBase(const MyDataBase &);
MyDataBase operator =(const MyDataBase &);
private:
static MyDataBase *m_pInstance;
public:
static MyDataBase * GetInstance();
bool ConnectAccessDB(const QString &strDBName,const QString &strUser,const QString &strPwd) const;
public:
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();
}
};
③.cpp文件
#include "mydatabase.h"
#include <QDebug>
MyDataBase * MyDataBase::m_pInstance(NULL);
ParamListVec paramListVec;
MyDataBase::MyDataBase()
{
}
MyDataBase::~MyDataBase()
{
this->GetDatabase().close();
}
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;
if(QSqlDatabase::contains("MyAccessDB"))
{
db = QSqlDatabase::database("MyAccessDB");
}
else
{
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);
if (!db.isValid())
{
return false;
}
if (db.isOpen())
{
return true;
}
if (db.open())
{
return true;
}
else
{
qDebug() << db.lastError().text();
return false;
}
}
④调用连接Access
.h
MyDataBase *p_ParamWrite;
.cpp
p_ParamWrite->GetInstance();
QString filePath = qApp->applicationDirPath + QString("/xxx/%1").arg(DSN);//存放位置
bool ret = p_ParamWrite->ConnectAccessDB(filePath,User,Psw);
if(ret == false)
{
//失败
}
else
{
//成功
}
⑤运行并debug打印,测试是否连接成功,如果连接失败,提示driver not load;
因为程序中使用了QSqlDatabase创建数据库,需要添加相应数据库的驱动:
1)将D:\Qt\Qt5.14.1\5.14.1\mingw73_32(编译器对应)路径下的文件夹plugins复制到exe文件目录下,打开plugins,只保留sqldrivers文件夹,需要确认里面是否有你需要的驱动, 如:程序中使用了QSqlite数据库,则需要有qsqlite.dll(发布版)qsqlited.dll(调试版),
2)在main.cpp文件中添加下面第二行和第三行:
QApplication a(argc, argv);
QString strLibPath(QDir::toNativeSeparators(QApplication::applicationDirPath())+QDir::separator()+"plugins");
a.addLibraryPath(strLibPath);
二、获取Access数据
void MyDataBase::GetDataOfDBParameter()
{
QSqlDatabase db = this->GetDatabase();
if(!db.isOpen())
{
return;
}
QStringList tables;
QString tabName,sqlString;
tables = db.tables(QSql::Tables);
paramListVec.clear();
for (int i = 0; i < tables.size(); ++i)//读表中记录
{
tabName = tables.at(i);//表名
sqlString = "select * from " + tabName;
QSqlQuery q(sqlString,db);
QSqlRecord rec = q.record();
int fieldCount = rec.count();//表列数
QString fieldName;
for(int j=0;j<fieldCount;j++)//列的名字
{
fieldName = rec.fieldName(j);
}
while(q.next())//每一行的数据
{
QString qvalue = q.value(0).toString();
if(qvalue.contains("xxx"))
{
CDBPARAMETER* data = new CDBPARAMETER;
data->a = q.value(0).toString();
data->b = q.value(1).toUInt();
data->b = q.value(2).toFloat();
paramListVec.push_back(data);
}
}
}
}
参考文档:
Qt连接本地Access数据库
Qt操作数据库(access为例)
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection'解决办法
QT程序发布提示driver not load
第二次连接数据库-sqlite数据库连接出错
Qt对Access数据库进行操作(表、字段和域的读取)
更多推荐
Qt获取Access数据库数据
发布评论