☰
达梦ODBC驱动32位与64位安装配置及位数匹配避坑指南
2026/10/14 14:12:48 网站建设 项目流程

简介:这份资源面向需要在32位或64位系统上接入达梦数据库的开发者与运维人员,提供达梦数据库ODBC驱动程序的完整安装包,用于解决应用程序通过统一ODBC接口连接国产数据库的适配问题,适合政务、国企等有国产化替代需求的场景。压缩包共610个文件,约58.52MB,以423个dll动态库和112个exe可执行程序为主,另含pem证书、keystore密钥库、lib与so库文件、bat批处理、reg注册表脚本及sql、ini配置等,覆盖驱动运行、注册与环境配置所需组件。资源内含32位与64位两套安装引导脚本,便于按系统架构选择部署。目前已有720人学习下载。通过该包可完成ODBC驱动安装、数据源配置与连通性验证,为后续在应用中建立DSN、连接达梦数据库提供基础支撑。

1. 达梦 ODBC 驱动装不对,你的 32 位程序连不上数据库

有个场景我猜你遇到过:服务器上达梦数据库跑得好好的,用管理工具连也没问题,但自己写的 C 程序、老版 Delphi 客户端、或者某个只认 32 位的报表工具,死活连不上,报错还特别含糊——不是“数据源未找到”,就是“驱动程序和应用程序位数不匹配”。折腾半天发现,数据库本身没问题,问题出在 ODBC 驱动这一层。达梦数据库的 ODBC 驱动分 32 位和 64 位两个独立安装包,它们不是一回事,装错了或者只装了一个,对应位数的程序就用不了。这篇笔记拆的就是 DMODBD32 和 64 位安装这件事:驱动从哪来、两个位数怎么共存、DSN 怎么配、连不上时先查什么。适合正在做达梦适配的开发和运维,尤其是被位数问题卡过的人。

2. 先搞清位数匹配:ODBC 驱动和应用程序的对应关系

2.1 为什么 64 位系统上还要装 32 位驱动

很多人有个直觉:我系统是 64 位的,那装 64 位驱动就够了。这个直觉在 ODBC 场景下会翻车。ODBC 的架构里,驱动管理器(Driver Manager)和驱动是分层的,应用程序调用哪一层,取决于应用程序自己编译成多少位。一个 32 位的 exe,它加载的是 32 位的驱动管理器,进而只能加载 32 位的 ODBC 驱动;64 位程序同理走 64 位链路。两者互不干扰,也互不替代。

达梦的 ODBC 驱动安装包因此分成两个:DMODBD32 对应 32 位,另一个对应 64 位。你在 64 位 Windows 或 Linux 上,如果同时有 32 位和 64 位的客户端程序要连达梦,那就得两个都装。只装一个,另一类程序必然连不上,而且报错往往不直接说“位数不对”,而是“找不到数据源”或者“驱动加载失败”,很容易被带偏。

判断自己的程序是几位,Windows 下最直接的办法是看任务管理器里进程有没有带“32 位”标注,或者用 dumpbin /headers 看 PE 头。Linux 下用 file 命令看 ELF 的 class。这一步别省,我见过太多人凭感觉认定自己是 64 位,结果装完还是连不上。

2.2 驱动、驱动管理器、DSN 三者的关系

把这三者理清楚,后面配 DSN 就不会晕。ODBC 驱动是达梦提供的动态库,负责真正和数据库通信;驱动管理器是操作系统或 unixODBC 提供的中间层,负责把应用程序的调用转发给对应驱动;DSN(数据源名称)是一组连接参数的命名集合,应用程序通过 DSN 名字找到驱动和连接信息。

关键点在于:DSN 是分位数的。32 位系统里配的 DSN,64 位程序看不到;64 位配的,32 位程序也看不到。Windows 下 32 位 DSN 要用C:\Windows\SysWOW64\odbcad32.exe打开,64 位用C:\Windows\System32\odbcad32.exe。这两个界面长得一模一样,但管的是两套独立的 DSN 列表。Linux 下则是通过 odbcinst.ini 和 odbc.ini 配置,位数由你链接的 unixODBC 库决定。

所以完整的链路是:应用程序(某位数)→ 对应位数的驱动管理器 → 对应位数的达梦 ODBC 驱动 → 达梦数据库。任何一环位数对不上,链路就断。理解了这个,后面装驱动、配 DSN、排查问题都有了主线。

2.3 安装前的环境确认清单

动手之前,先把这几项确认掉,能省掉后面大量返工。

确认项检查方式期望结果
应用程序位数Windows 看进程标注 / Linux 用 file明确是 32 还是 64
已装驱动位数查安装目录或 odbcinst -j知道缺哪个
驱动管理器Windows 自带 / Linux 查 unixODBC位数与程序一致
数据库连通性用管理工具先连一次排除网络和账号问题
安装权限是否管理员 / root避免装到一半失败

这张表看着简单,但每一条我都见过有人跳过然后卡住。尤其是“数据库连通性”这条,先用达梦自带的管理工具确认库是通的,再去折腾 ODBC,否则你分不清是驱动问题还是网络问题。

提示:位数确认这一步,宁可多花两分钟实测,也不要凭印象。凭印象翻车的概率高得离谱。

3. 32 位与 64 位驱动安装实操:从安装包到 DSN 验证

3.1 Windows 下两个安装包的安装顺序与目录

Windows 下达梦 ODBC 驱动通常以安装包形式提供,DMODBD32 就是 32 位那个。安装过程本身不复杂,但有几个点要注意。

安装顺序上,我一般建议先装 64 位再装 32 位,或者反过来都行,两者不冲突,因为安装目录不同。64 位驱动默认装在C:\dmdbms\odbc之类的路径,32 位会装到带 32 位标识的目录。安装时如果提示选择组件,确认勾选的是 ODBC 驱动而不是别的客户端组件。

安装完成后,验证驱动是否注册成功。Windows 下可以打开对应位数的 odbcad32.exe,在“驱动程序”标签页里找达梦的驱动名。32 位驱动只在 32 位的 odbcad32 里出现,64 位只在 64 位里出现。如果装完在对应界面看不到,说明注册没成功,多半是安装时权限不够或者安装包位数拿错了。

# Windows 下确认驱动注册情况,用 PowerShell 查注册表 # 64 位驱动注册在: # HKLM:\SOFTWARE\ODBC\ODBCINST.INI # 32 位驱动注册在: # HKLM:\SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI Get-ItemProperty "HKLM:\SOFTWARE\ODBC\ODBCINST.INI\DM8 ODBC DRIVER" -ErrorAction SilentlyContinue Get-ItemProperty "HKLM:\SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI\DM8 ODBC DRIVER" -ErrorAction SilentlyContinue

这段命令的逻辑是分别查两个注册表位置,看达梦驱动有没有登记。参数说明:驱动名“DM8 ODBC DRIVER”以实际安装显示的名称为准,不同版本可能略有差异,用 odbcad32 界面里看到的那个名字。如果第一条有输出第二条没有,说明只装了 64 位;反之只装了 32 位。两条都空,那就是都没装成功。

3.2 Linux 下 unixODBC 与达梦驱动的对接

Linux 下没有 Windows 那种图形化安装,核心是让 unixODBC 认识达梦的驱动库。达梦会提供 .so 形式的驱动文件,32 位和 64 位各一份。你需要把它们的位置告诉 unixODBC。

先确认 unixODBC 本身装没装、是几位。odbcinst -j会打印出驱动配置、DSN 配置的路径,以及 unixODBC 的位数。这一步很关键,因为如果你的 unixODBC 是 64 位的,它加载不了 32 位驱动,反之亦然。有些环境需要同时装 32 位和 64 位的 unixODBC 库。

# 查看 unixODBC 配置路径和位数 odbcinst -j # 典型输出会包含: # unixODBC 2.3.x # DRIVERS............: /etc/odbcinst.ini # SYSTEM DATA SOURCES: /etc/odbc.ini # FILE DATA SOURCES..: /etc/ODBCDataSources # 以及 64-bit 或 32-bit 标识

看到位数标识后,把达梦驱动写进 odbcinst.ini。下面是一个 64 位驱动的配置示例。

# /etc/odbcinst.ini 片段 [DM8 ODBC DRIVER] Description = DM ODBC Driver Driver = /opt/dmdbms/odbc/libdodbc.so UsageCount = 1

参数说明:[DM8 ODBC DRIVER]是驱动名,后面配 DSN 时要引用这个名字;Driver指向实际的 .so 文件路径,32 位就指向 32 位的 .so。如果同时要支持两个位数,通常需要两套 unixODBC 配置,或者用不同的配置文件路径区分,具体看你的 unixODBC 是怎么装的。

配完驱动,再配 DSN。DSN 可以配在 odbc.ini 里,也可以直接在连接串里写。用 DSN 的好处是连接参数集中管理。

# /etc/odbc.ini 片段 [DM_TEST] Description = DM Test DSN Driver = DM8 ODBC DRIVER Servername = 192.168.1.100 Port = 5236 Database = DAMENG UID = SYSDBA PWD = SYSDBA

参数说明:Driver必须和 odbcinst.ini 里的驱动名完全一致;Servername和Port是达梦数据库的地址和端口,默认端口 5236;Database是库名;UID/PWD是账号密码。配完后用isql -v DM_TEST测试,能进 SQL 提示符就说明链路通了。

3.3 用 isql 和程序双向验证连接

配完不验证等于没配。Linux 下最顺手的验证工具是 isql,它是 unixODBC 自带的。isql -v DM_TEST如果成功,会显示已连接并进入交互界面,你敲个select 1能返回就彻底确认了。

但 isql 验证通过不代表你的应用程序就能连上,因为 isql 的位数可能和你的程序不一样。所以最终验证一定要用目标程序本身跑一次。我一般会写一个最小测试程序,只做连接和简单查询,排除业务逻辑干扰。

// 最小 ODBC 连接测试,编译时注意 -lodbc 和位数 #include <stdio.h> #include <sql.h> #include <sqlext.h> int main() { SQLHENV env; SQLHDBC dbc; SQLRETURN ret; SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); // 使用 DSN 连接,也可以换成完整连接串 ret = SQLDriverConnect(dbc, NULL, (SQLCHAR*)"DSN=DM_TEST;UID=SYSDBA;PWD=SYSDBA;", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE); if (SQL_SUCCEEDED(ret)) { printf("connect ok\n"); } else { printf("connect failed, ret=%d\n", ret); } return 0; }

这段代码的逻辑是走标准 ODBC 三步:分配环境句柄、设置 ODBC 版本、分配连接句柄,然后 SQLDriverConnect 发起连接。参数说明:连接串里 DSN 名字要和 odbc.ini 里一致;编译时 32 位程序要链接 32 位的 libodbc,64 位链接 64 位的,用-lodbc时确保库路径对应。如果这个程序连不上而 isql 能连上,基本就是位数不匹配,回头查编译位数和驱动位数。

注意:编译测试程序时,-m32或-m64要和目标驱动位数一致,链接的 unixODBC 库也要对应。这一步错了,程序跑起来报的错和驱动没装很像。

4. 避坑实录:位数、路径、编码这几个高频翻车点

4.1 现象:32 位程序报“未找到数据源名称”

原因:最常见的就是 DSN 配在了 64 位那边,32 位程序看不到。Windows 下用 System32 的 odbcad32 配的 DSN,32 位程序读的是 SysWOW64 那套,自然找不到。Linux 下则是 unixODBC 位数和程序位数不一致,程序链接的驱动管理器读的是另一套配置。

解决:Windows 下用C:\Windows\SysWOW64\odbcad32.exe重新配一遍 32 位 DSN;Linux 下确认程序链接的 unixODBC 位数,必要时装对应位数的 unixODBC 并指向正确的 odbc.ini。配完用目标位数的 isql 再验一次。

4.2 现象:驱动装了但 odbcad32 里看不到

原因:安装时权限不足,驱动注册表项没写进去;或者安装包拿错了位数,装的是 64 位却去 32 位界面找。还有一种情况是安装程序静默失败,日志里才有线索。

解决:用管理员权限重装;确认安装包文件名和位数;装完用前面给的 PowerShell 命令查注册表两个位置,看驱动到底注册到哪了。如果注册表有但界面没有,重启一下 odbcad32 或者注销重登。

4.3 现象:连接串里中文库名或密码乱码

原因:ODBC 连接串的编码和数据库端不一致。达梦对字符集有要求,客户端连接串如果编码不对,中文参数会传错。Windows 下 ANSI 和 UTF-8 的差异尤其容易出问题。

解决:统一连接串编码,尽量用 UTF-8;或者在 DSN 配置里明确字符集相关参数。测试时先用纯英文库名和密码排除编码干扰,确认链路通了再换中文参数定位问题。

4.4 现象:isql 能连,自己的程序连不上

原因:位数不匹配是头号嫌疑。isql 是系统装的,位数固定;你的程序可能是另一位。其次是程序链接的 ODBC 库路径不对,加载了错误的驱动管理器。

解决:用ldd(Linux)或依赖查看工具确认程序实际加载的 ODBC 库路径和位数;对比 isql 的位数。Windows 下用 dumpbin 看程序位数,和驱动位数对齐。链接时显式指定库路径,避免加载到系统里另一个位数的库。

4.5 现象:装完 32 位驱动后 64 位程序反而连不上

原因:安装 32 位驱动时,某些安装脚本可能覆盖了公共配置,比如 odbcinst.ini 被改写,导致 64 位驱动指向被改掉。这种情况在 Linux 下手动配置时更容易发生。

解决:两个位数的配置尽量隔离,用不同的配置文件或在同一文件里用不同驱动名区分。装完一个位数后,回头验证另一个位数是否还正常。养成装完就验的习惯,别等出问题再回头找。

5. 多位数共存的配置管理与快速自检习惯

多位数共存这件事,配一次不难,难的是环境多了以后不乱。我现在的做法是:把 32 位和 64 位的驱动路径、DSN 配置分别记录,Linux 下用不同的 odbc.ini 文件,通过环境变量 ODBCINI 切换;Windows 下就靠两套 odbcad32 天然隔离,但装完必须两边都验。

一个具体的自检技巧:写一个脚本,一次性检查两个位数的驱动注册和 DSN 可见性。Linux 下可以分别用 32 位和 64 位的 isql 去连同一个 DSN 名,看哪个能通。Windows 下用 PowerShell 查两个注册表位置,再分别调 odbcad32 确认。

# Linux 下快速自检两个位数的 ODBC 环境 # 假设系统里同时有 32 位和 64 位的 isql echo "=== 64-bit check ===" /usr/bin/isql -v DM_TEST <<< "select 1; quit" 2>&1 | head -5 echo "=== 32-bit check ===" /usr/bin/isql32 -v DM_TEST <<< "select 1; quit" 2>&1 | head -5

这段脚本的逻辑是分别用两个位数的 isql 去连同一个 DSN,输出前几行看结果。参数说明:isql32 是假设的 32 位 isql 路径,实际以你系统里为准,可能是/usr/bin/isql加-m32编译的版本,或者独立命名的二进制。如果 64 位通、32 位报“data source not found”,那就是 32 位 DSN 没配或驱动没装。

还有一个习惯:每次装完驱动或改完 DSN,立刻用目标程序跑一次最小连接测试,不要等业务代码跑起来才发现连不上。最小测试程序就前面那段 C 代码,编译两个位数各留一份,随时能用。这个习惯帮我省过很多次“以为是业务 bug 结果是环境问题”的排查时间。

从那以后我每次碰 ODBC 环境,不管多急,都强制走一遍“确认位数 → 装对应驱动 → 配对应 DSN → 目标程序实测”这四步,一步不跳。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询