Linux 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() &lt;&lt; "查询失败:" &lt;&lt; query.lastError().text(); return; } while (query.next()) { int id = query.value(0).toInt(); QString name = query.value(1).toString(); qDebug() &lt;&lt; "ID:" &lt;&lt; id &lt;&lt; "NAME:" &lt;&lt; name; } }

事务处理同样通过QSqlDatabase提供的方法完成:

bool insertWithTransaction() { QSqlDatabase db = QSqlDatabase::database("dm_connection"); if (!db.transaction()) { qDebug() &lt;&lt; "开启事务失败"; 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() &lt;&lt; "插入失败,已回滚:" &lt;&lt; query.lastError().text(); return false; } if (!db.commit()) { qDebug() &lt;&lt; "提交事务失败"; return false; } return true; }

7. 常见问题与排查

在实际开发中,连接达梦数据库可能会遇到以下几类问题,这里给出对应的排查思路:

问题现象可能原因解决方案
提示驱动未加载Qt 驱动插件未编译或未放入插件目录重新编译达梦驱动,确认插件路径正确
连接超时防火墙拦截或端口配置错误检查达梦端口 5236 是否开放,确认主机地址可达
认证失败用户名或密码错误使用 disql 工具验证账号信息
中文乱码字符集不匹配在连接参数中设置正确的字符集编码

如果程序启动时提示QSqlDatabase: QDM driver not loaded,请优先检查驱动插件是否存在于 Qt 的sqldrivers目录中,并确认插件与 Qt 版本匹配。

8. 总结

本文从环境准备、驱动编译、项目配置到连接代码,完整梳理了 Linux 环境下 Qt 连接达梦数据库的流程。核心要点包括:正确编译达梦 Qt 驱动、在.pro文件中配置库路径、使用QSqlDatabase建立连接,以及通过QSqlQuery执行查询和事务。按照上述步骤操作,即可在本地快速搭建起 Qt 与达梦数据库的联调环境。

相关新闻

Bambu Studio 快速上手指南:免费开源 3D 打印切片,从模型到 GCode 一键完成

Bambu Studio 快速上手指南:免费开源 3D 打印切片,从模型到 GCode 一键完成

Bambu Studio 快速上手指南&#xff1a;免费开源 3D 打印切片&#xff0c;从模型到 GCode 一键完成 【免费下载链接】BambuStudio PC Software for BambuLab and other 3D printers 项目地址: https://gitcode.com/GitHub_Trending/ba/BambuStudio Bambu Studio 是一款免…

2026/10/20 1:14:48 阅读更多 →
Bloxstrap 的 4 个实用功能:Roblox 启动器改造指南

Bloxstrap 的 4 个实用功能:Roblox 启动器改造指南

Bloxstrap 的 4 个实用功能&#xff1a;Roblox 启动器改造指南 【免费下载链接】bloxstrap An alternative bootstrapper for Roblox with a bunch of extra features. 项目地址: https://gitcode.com/GitHub_Trending/bl/bloxstrap 打开 Roblox 的时候&#xff0c;你可…

2026/10/20 1:14:48 阅读更多 →
N步跑通CANNJudge算子竞赛提交流程:平台全流程实战指南

N步跑通CANNJudge算子竞赛提交流程:平台全流程实战指南

N步跑通CANNJudge算子竞赛提交流程&#xff1a;平台全流程实战指南 【免费下载链接】cann-learning-hub CANN 学习中心仓&#xff0c;支持在线互动运行、边学边练&#xff0c;提供教程、示例与优化方案&#xff0c;一站式助力昇腾开发者快速上手。 项目地址: https://gitcode…

2026/10/20 1:14:48 阅读更多 →

最新新闻

AI面试八股文-17_17-AI 编程工具与自主 Coding Agent 面试题

AI面试八股文-17_17-AI 编程工具与自主 Coding Agent 面试题

pdf版下载链&#xff1a;https://pan.quark.cn/s/9cc742e9c2a8 17 AI 编程工具与 Coding Agent&#xff1a;原理、评测与工程实践 更新&#xff1a; 2026-10-12 难度&#xff1a; ⭐⭐⭐⭐ 考点&#xff1a; Coding Agent、Harness、沙箱、权限、Skills、长任务、评测与工具选…

2026/10/20 5:05:58 阅读更多 →
Python vs Go:2026年到底该怎么选

Python vs Go:2026年到底该怎么选

早些年我写项目&#xff0c;常年泡在Python里。写接口、跑数据分析、捣鼓大模型原型&#xff0c;几行代码就能把想法跑通&#xff0c;爽感拉满。但随着服务流量涨上去&#xff0c;麻烦接踵而至&#xff1a;接口延迟忽高忽低、容器冷启动慢吞吞、并发一上来资源开销直接超标。那…

2026/10/20 5:05:58 阅读更多 →
详细描述一个完整RAG系统的详细工作流程?

详细描述一个完整RAG系统的详细工作流程?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 5:05:58 阅读更多 →
windows上安装docker步骤

windows上安装docker步骤

1. 检查是否已开启虚拟化 ctrlshiftesc快捷键&#xff1a; 2. 安装wsl 开启管理权限在cmd中输入以下命令&#xff1a; wsl -l -v查看版本: wsl -l -v输出会显示每个发行版的 NAME、STATE、VERSION&#xff0c;其中 VERSION 为 1 表示 WSL1&#xff0c;2 表示 WSL2 。如果…

2026/10/20 5:05:58 阅读更多 →
一亿数据找Top K,内存仅存k个元素(Top—K问题)

一亿数据找Top K,内存仅存k个元素(Top—K问题)

问题导入&#xff1a;假使有一亿个整数要去排序&#xff0c;从中找出k个最大值和k个最小值&#xff0c;当前的内存仅仅可以保留k个整数应当如何存储内容扩展&#xff1a;1GB1024MB1024*1024KB1024*1024*1024Byte≈10.7亿字节一个整形需要用到4个字节&#xff0c;一亿个整形要用…

2026/10/20 5:05:58 阅读更多 →
Agent稳定运行的工程基石:Harness设计与实践拆解

Agent稳定运行的工程基石:Harness设计与实践拆解

先交代一个背景。我们团队最早做某自动化运维 Agent 时&#xff0c;第一版代码就是一个while True循环里反复调用大模型、执行工具、再喂回模型。前三天跑得挺顺&#xff0c;第四天它突然开始疯狂调用同一个内部接口&#xff0c;把下游服务打到限流。查了半天才发现&#xff0c…

2026/10/20 5:04:57 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →