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;
}
运行与验证
- 将上述代码保存为
main.cpp,在.pro文件中添加QT += sql。 - 将
dbPath修改为实际Access文件路径。 - 编译并运行程序。
通过条件:控制台输出连接成功,随后列出数据库中的所有表名。若数据库中有Users表,输出中应包含表名: Users。若连接失败,输出错误信息,请检查文件路径是否正确、驱动是否可用。
常见问题
- 驱动不匹配:若提示
QODBC driver not loaded,确认Qt安装时勾选了SQL驱动模块,或手动将qsqlodbc.dll放入Qt的plugins/sqldrivers目录。 - 路径含中文:确保
dbPath使用正确编码,建议路径中避免中文或空格。 - 64位/32位不匹配:若Access驱动为32位而Qt为64位(或反之),会连接失败。请确保两者位数一致。