1. 引言达梦数据库(DM)是国产主流关系型数据库之一,在政务、金融、能源等行业应用广泛。Qt 作为跨平台 C++ 应用框架,常被用于开发桌面端和嵌入式端业务系统。本文围绕 Linux 环境下 Qt 连接达梦数据库的完整流程展开,涵盖驱动准备、环境配置、连接代码、常见错误排查等环节,帮助读者快速跑通「Qt + 达梦」的本地开发链路。2. 环境准备在开始编码之前,需要先确认操作系统、Qt 版本以及达梦数据库的安装情况。以下是一套常见的开发环境组合:操作系统:Ubuntu 20.04 / CentOS 7 及以上(本文以 Ubuntu 20.04 为例)。Qt 版本:Qt 5.12 或 Qt 5.15(建议使用 Qt 5.15 LTS)。达梦数据库:DM8 及以上版本,已安装并启动服务。编译器:GCC 7.5 或更高版本。确认环境后,建议先通过命令行工具disql验证达梦数据库是否可正常连接,排除数据库本身的问题后再进入 Qt 开发环节。3. 达梦数据库驱动准备Qt 默认不附带达梦数据库驱动,需要手动编译生成。达梦官方在安装目录下提供了 Qt 驱动源码,通常位于/opt/dmdbms/drivers/qt目录中。编译前需要确认 Qt 的 qmake 路径以及达梦安装目录。以下是编译驱动的核心步骤:# 进入达梦提供的 Qt 驱动源码目录 cd /opt/dmdbms/drivers/qt 使用 qmake 生成 Makefile /opt/Qt/5.15.2/gcc_64/bin/qmake 编译并安装驱动 make make install编译完成后,驱动文件libqsqlodbc.so或libqsqldm.so会生成到 Qt 的插件目录中。可以通过以下命令确认驱动是否已就绪:# 查看 Qt 已加载的数据库驱动 /opt/Qt/5.15.2/gcc_64/bin/qtpaths --query QT_INSTALL_PLUGINS如果驱动编译过程中提示缺少头文件,请检查达梦安装目录下的include文件夹是否已加入编译路径。4. 配置 Qt 项目文件在 Qt Creator 中新建项目后,需要在.pro文件中添加达梦数据库相关的库路径和头文件路径。以下是一个可用的配置示例:# 达梦数据库安装目录 DM_HOME = /opt/dmdbms INCLUDEPATH += $$DM_HOME/include LIBS += -L$$DM_HOME/bin -ldmapi Qt SQL 模块 QT += sql如果驱动编译时使用的是 ODBC 方式,还需要额外链接 ODBC 库:LIBS += -lodbc配置完成后,重新执行 qmake 并构建项目,确保没有链接错误。5. 编写连接代码Qt 通过QSqlDatabase类管理数据库连接。连接达梦数据库时,需要指定驱动名称、主机地址、端口、数据库名、用户名和密码。以下是一个完整的连接示例:#include <QCoreApplication> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <QDebug> bool connectToDM() { // 添加达梦数据库连接 QSqlDatabase db = QSqlDatabase::addDatabase("QDM", "dm_connection"); // 设置连接参数 db.setHostName("127.0.0.1"); db.setPort(5236); db.setDatabaseName("SYSDBA"); db.setUserName("SYSDBA"); db.setPassword("SYSDBA"); // 打开连接 if (!db.open()) { qDebug() << "连接失败:" << db.lastError().text(); return false; } qDebug() << "连接成功"; return true; } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); if (connectToDM()) { QSqlQuery query; if (query.exec("SELECT 1 FROM DUAL")) { qDebug() << "查询执行成功"; } } return app.exec(); }需要注意,达梦数据库默认端口为5236,默认用户名和密码均为SYSDBA。实际项目中请根据部署环境修改这些参数。5.1 字符集配置达梦数据库在创建实例时会指定默认字符集,常见的有UTF-8和GBK。如果客户端与数据库字符集不一致,中文数据在读写时会出现乱码。Qt 连接达梦时,可以通过在连接参数中设置charset或encoding来指定字符集。在QSqlDatabase中,使用setConnectOptions()方法设置连接选项。以下示例演示了如何显式指定 UTF-8 字符集:bool connectToDMWithCharset() { QSqlDatabase db = QSqlDatabase::addDatabase("QDM", "dm_connection_charset"); db.setHostName("127.0.0.1"); db.setPort(5236); db.setDatabaseName("SYSDBA"); db.setUserName("SYSDBA"); db.setPassword("SYSDBA"); // 设置字符集为 UTF-8 db.setConnectOptions("charset=UTF8"); if (!db.open()) { qDebug() << "连接失败:" << db.lastError().text(); return false; } qDebug() << "连接成功,字符集为 UTF-8"; return true; }如果数据库实例使用 GBK 字符集,可以将连接选项改为charset=GBK:// 设置字符集为 GBK db.setConnectOptions("charset=GBK");部分达梦驱动版本也支持encoding参数,用法与charset类似:// 使用 encoding 参数指定字符集 db.setConnectOptions("encoding=UTF8");5.2 UTF-8 与 GBK 的选择建议在中文场景下,字符集的选择需要结合数据库实例配置和业务需求综合考虑:UTF-8:支持全球所有语言的字符,是跨平台、跨语言协作的首选。如果达梦数据库实例本身使用 UTF-8,且业务系统需要处理多语言数据,建议统一使用 UTF-8。Qt 的QString内部使用 Unicode 编码,与 UTF-8 天然兼容,中文读写无需额外转换。GBK:主要面向简体中文场景,单字符占用空间更小,在纯中文业务且数据库实例为 GBK 时,可以选用 GBK 以节省存储空间。但 GBK 不支持繁体中文、日文、韩文等字符,跨语言场景下不推荐。选择字符集时,应遵循以下原则:优先与达梦数据库实例的字符集保持一致,避免客户端与服务器之间发生隐式转换。如果数据库实例字符集未知,可以通过disql查询SELECT * FROM V$INSTANCE或查看达梦初始化参数确认。在新建项目时,建议直接使用 UTF-8,以兼容 Qt 的 Unicode 字符串处理和未来可能的国际化需求。设置字符集后,建议插入一条中文测试数据并查询验证,确保读写均无乱码。6. 执行查询与事务处理连接建立后,可以通过QSqlQuery执行增删改查操作。以下示例演示了如何查询数据并遍历结果集:void queryData() { QSqlDatabase db = QSqlDatabase::database("dm_connection"); QSqlQuery query(db); if (!query.exec("SELECT ID, NAME FROM T_USER")) { qDebug() << "查询失败:" << query.lastError().text(); return; } while (query.next()) { int id = query.value(0).toInt(); QString name = query.value(1).toString(); qDebug() << "ID:" << id << "NAME:" << name; } }事务处理同样通过QSqlDatabase提供的方法完成:bool insertWithTransaction() { QSqlDatabase db = QSqlDatabase::database("dm_connection"); if (!db.transaction()) { qDebug() << "开启事务失败"; return false; } QSqlQuery query(db); query.prepare("INSERT INTO T_USER (ID, NAME) VALUES (?, ?)"); query.addBindValue(1001); query.addBindValue("张三"); if (!query.exec()) { db.rollback(); qDebug() << "插入失败,已回滚:" << query.lastError().text(); return false; } if (!db.commit()) { qDebug() << "提交事务失败"; return false; } return true; }7. 常见问题与排查在实际开发中,连接达梦数据库可能会遇到以下几类问题,这里给出对应的排查思路:问题现象可能原因解决方案提示驱动未加载Qt 驱动插件未编译或未放入插件目录重新编译达梦驱动,确认插件路径正确连接超时防火墙拦截或端口配置错误检查达梦端口 5236 是否开放,确认主机地址可达认证失败用户名或密码错误使用 disql 工具验证账号信息中文乱码字符集不匹配在连接参数中设置正确的字符集编码如果程序启动时提示QSqlDatabase: QDM driver not loaded,请优先检查驱动插件是否存在于 Qt 的sqldrivers目录中,并确认插件与 Qt 版本匹配。8. 总结本文从环境准备、驱动编译、项目配置到连接代码,完整梳理了 Linux 环境下 Qt 连接达梦数据库的流程。核心要点包括:正确编译达梦 Qt 驱动、在.pro文件中配置库路径、使用QSqlDatabase建立连接,以及通过QSqlQuery执行查询和事务。按照上述步骤操作,即可在本地快速搭建起 Qt 与达梦数据库的联调环境。
1. 引言达梦数据库(DM)是国产主流关系型数据库之一,在政务、金融、能源等行业应用广泛。Qt 作为跨平台 C++ 应用框架,常被用于开发桌面端和嵌入式端业务系统。本文围绕 Linux 环境下 Qt 连接达梦数据库的完整流程展开,涵盖驱动准备、环境配置、连接代码、常见错误排查等环节,帮助读者快速跑通「Qt + 达梦」的本地开发链路。2. 环境准备在开始编码之前,需要先确认操作系统、Qt 版本以及达梦数据库的安装情况。以下是一套常见的开发环境组合:操作系统:Ubuntu 20.04 / CentOS 7 及以上(本文以 Ubuntu 20.04 为例)。Qt 版本:Qt 5.12 或 Qt 5.15(建议使用 Qt 5.15 LTS)。达梦数据库:DM8 及以上版本,已安装并启动服务。编译器:GCC 7.5 或更高版本。确认环境后,建议先通过命令行工具disql验证达梦数据库是否可正常连接,排除数据库本身的问题后再进入 Qt 开发环节。3. 达梦数据库驱动准备Qt 默认不附带达梦数据库驱动,需要手动编译生成。达梦官方在安装目录下提供了 Qt 驱动源码,通常位于/opt/dmdbms/drivers/qt目录中。编译前需要确认 Qt 的 qmake 路径以及达梦安装目录。以下是编译驱动的核心步骤:# 进入达梦提供的 Qt 驱动源码目录 cd /opt/dmdbms/drivers/qt 使用 qmake 生成 Makefile /opt/Qt/5.15.2/gcc_64/bin/qmake 编译并安装驱动 make make install编译完成后,驱动文件libqsqlodbc.so或libqsqldm.so会生成到 Qt 的插件目录中。可以通过以下命令确认驱动是否已就绪:# 查看 Qt 已加载的数据库驱动 /opt/Qt/5.15.2/gcc_64/bin/qtpaths --query QT_INSTALL_PLUGINS如果驱动编译过程中提示缺少头文件,请检查达梦安装目录下的include文件夹是否已加入编译路径。4. 配置 Qt 项目文件在 Qt Creator 中新建项目后,需要在.pro文件中添加达梦数据库相关的库路径和头文件路径。以下是一个可用的配置示例:# 达梦数据库安装目录 DM_HOME = /opt/dmdbms INCLUDEPATH += $$DM_HOME/include LIBS += -L$$DM_HOME/bin -ldmapi Qt SQL 模块 QT += sql如果驱动编译时使用的是 ODBC 方式,还需要额外链接 ODBC 库:LIBS += -lodbc配置完成后,重新执行 qmake 并构建项目,确保没有链接错误。5. 编写连接代码Qt 通过QSqlDatabase类管理数据库连接。连接达梦数据库时,需要指定驱动名称、主机地址、端口、数据库名、用户名和密码。以下是一个完整的连接示例:#include <QCoreApplication> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <QDebug> bool connectToDM() { // 添加达梦数据库连接 QSqlDatabase db = QSqlDatabase::addDatabase("QDM", "dm_connection"); // 设置连接参数 db.setHostName("127.0.0.1"); db.setPort(5236); db.setDatabaseName("SYSDBA"); db.setUserName("SYSDBA"); db.setPassword("SYSDBA"); // 打开连接 if (!db.open()) { qDebug() << "连接失败:" << db.lastError().text(); return false; } qDebug() << "连接成功"; return true; } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); if (connectToDM()) { QSqlQuery query; if (query.exec("SELECT 1 FROM DUAL")) { qDebug() << "查询执行成功"; } } return app.exec(); }需要注意,达梦数据库默认端口为5236,默认用户名和密码均为SYSDBA。实际项目中请根据部署环境修改这些参数。5.1 字符集配置达梦数据库在创建实例时会指定默认字符集,常见的有UTF-8和GBK。如果客户端与数据库字符集不一致,中文数据在读写时会出现乱码。Qt 连接达梦时,可以通过在连接参数中设置charset或encoding来指定字符集。在QSqlDatabase中,使用setConnectOptions()方法设置连接选项。以下示例演示了如何显式指定 UTF-8 字符集:bool connectToDMWithCharset() { QSqlDatabase db = QSqlDatabase::addDatabase("QDM", "dm_connection_charset"); db.setHostName("127.0.0.1"); db.setPort(5236); db.setDatabaseName("SYSDBA"); db.setUserName("SYSDBA"); db.setPassword("SYSDBA"); // 设置字符集为 UTF-8 db.setConnectOptions("charset=UTF8"); if (!db.open()) { qDebug() << "连接失败:" << db.lastError().text(); return false; } qDebug() << "连接成功,字符集为 UTF-8"; return true; }如果数据库实例使用 GBK 字符集,可以将连接选项改为charset=GBK:// 设置字符集为 GBK db.setConnectOptions("charset=GBK");部分达梦驱动版本也支持encoding参数,用法与charset类似:// 使用 encoding 参数指定字符集 db.setConnectOptions("encoding=UTF8");5.2 UTF-8 与 GBK 的选择建议在中文场景下,字符集的选择需要结合数据库实例配置和业务需求综合考虑:UTF-8:支持全球所有语言的字符,是跨平台、跨语言协作的首选。如果达梦数据库实例本身使用 UTF-8,且业务系统需要处理多语言数据,建议统一使用 UTF-8。Qt 的QString内部使用 Unicode 编码,与 UTF-8 天然兼容,中文读写无需额外转换。GBK:主要面向简体中文场景,单字符占用空间更小,在纯中文业务且数据库实例为 GBK 时,可以选用 GBK 以节省存储空间。但 GBK 不支持繁体中文、日文、韩文等字符,跨语言场景下不推荐。选择字符集时,应遵循以下原则:优先与达梦数据库实例的字符集保持一致,避免客户端与服务器之间发生隐式转换。如果数据库实例字符集未知,可以通过disql查询SELECT * FROM V$INSTANCE或查看达梦初始化参数确认。在新建项目时,建议直接使用 UTF-8,以兼容 Qt 的 Unicode 字符串处理和未来可能的国际化需求。设置字符集后,建议插入一条中文测试数据并查询验证,确保读写均无乱码。6. 执行查询与事务处理连接建立后,可以通过QSqlQuery执行增删改查操作。以下示例演示了如何查询数据并遍历结果集:void queryData() { QSqlDatabase db = QSqlDatabase::database("dm_connection"); QSqlQuery query(db); if (!query.exec("SELECT ID, NAME FROM T_USER")) { qDebug() << "查询失败:" << query.lastError().text(); return; } while (query.next()) { int id = query.value(0).toInt(); QString name = query.value(1).toString(); qDebug() << "ID:" << id << "NAME:" << name; } }事务处理同样通过QSqlDatabase提供的方法完成:bool insertWithTransaction() { QSqlDatabase db = QSqlDatabase::database("dm_connection"); if (!db.transaction()) { qDebug() << "开启事务失败"; return false; } QSqlQuery query(db); query.prepare("INSERT INTO T_USER (ID, NAME) VALUES (?, ?)"); query.addBindValue(1001); query.addBindValue("张三"); if (!query.exec()) { db.rollback(); qDebug() << "插入失败,已回滚:" << query.lastError().text(); return false; } if (!db.commit()) { qDebug() << "提交事务失败"; return false; } return true; }7. 常见问题与排查在实际开发中,连接达梦数据库可能会遇到以下几类问题,这里给出对应的排查思路:问题现象可能原因解决方案提示驱动未加载Qt 驱动插件未编译或未放入插件目录重新编译达梦驱动,确认插件路径正确连接超时防火墙拦截或端口配置错误检查达梦端口 5236 是否开放,确认主机地址可达认证失败用户名或密码错误使用 disql 工具验证账号信息中文乱码字符集不匹配在连接参数中设置正确的字符集编码如果程序启动时提示QSqlDatabase: QDM driver not loaded,请优先检查驱动插件是否存在于 Qt 的sqldrivers目录中,并确认插件与 Qt 版本匹配。8. 总结本文从环境准备、驱动编译、项目配置到连接代码,完整梳理了 Linux 环境下 Qt 连接达梦数据库的流程。核心要点包括:正确编译达梦 Qt 驱动、在.pro文件中配置库路径、使用QSqlDatabase建立连接,以及通过QSqlQuery执行查询和事务。按照上述步骤操作,即可在本地快速搭建起 Qt 与达梦数据库的联调环境。