4. ODBC数据源连接

任务目标

本案例演示如何在Qt中通过ODBC驱动连接Access数据库(.mdb/.accdb),并读取数据库中的表结构(表名列表)。案例使用Windows系统自带的Microsoft Access Driver,无需额外安装数据库引擎。

环境准备

  • Windows系统(需已安装ODBC驱动,通常系统自带)
  • Qt 5.x 或 Qt 6.x(需包含Qt SQL模块)
  • 一个Access数据库文件(.mdb或.accdb),本案例使用sample.mdb,其中包含至少一张表(如Users)

在.pro文件中添加:QT += sql

关键完整代码

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QStringList>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // 1. 添加ODBC数据库连接
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

    // 2. 设置连接字符串(指向Access文件)
    QString dbPath = "D:/databases/sample.mdb";  // 请修改为实际路径
    db.setDatabaseName(QString("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};"
                               "DBQ=%1;").arg(dbPath));

    // 3. 打开连接
    if (!db.open()) {
        qDebug() << "连接失败:" << db.lastError().text();
        return 1;
    }
    qDebug() << "连接成功";

    // 4. 读取表结构(表名列表)
    QStringList tables = db.tables(QSql::Tables);  // 仅获取用户表
    qDebug() << "数据库中的表数量:" << tables.size();
    for (const QString &table : tables) {
        qDebug() << "表名:" << table;
    }

    // 5. 可选:读取第一张表的字段信息
    if (!tables.isEmpty()) {
        QSqlQuery query(db);
        query.exec(QString("SELECT * FROM [%1] WHERE 1=0").arg(tables.first()));
        QSqlRecord record = query.record();
        qDebug() << "表 [" << tables.first() << "] 的字段:";
        for (int i = 0; i < record.count(); ++i) {
            qDebug() << "  -" << record.fieldName(i)
                     << "(" << record.field(i).typeID() << ")";
        }
    }

    db.close();
    return 0;
}

运行与验证

  1. 将上述代码保存为main.cpp,在.pro文件中添加QT += sql。
  2. 将dbPath修改为实际Access文件路径。
  3. 编译并运行程序。

通过条件:控制台输出连接成功,随后列出数据库中的所有表名。若数据库中有Users表,输出中应包含表名: Users。若连接失败,输出错误信息,请检查文件路径是否正确、驱动是否可用。

常见问题

  • 驱动不匹配:若提示QODBC driver not loaded,确认Qt安装时勾选了SQL驱动模块,或手动将qsqlodbc.dll放入Qt的plugins/sqldrivers目录。
  • 路径含中文:确保dbPath使用正确编码,建议路径中避免中文或空格。
  • 64位/32位不匹配:若Access驱动为32位而Qt为64位(或反之),会连接失败。请确保两者位数一致。