一、连接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数据库数据