目录
- 达梦数据库DM8 ODBC配置指南(Linux环境)
- ODBC
- 一、环境准备
- 二、核心配置步骤
- 1. 安装unixODBC
- 2. 配置ODBC驱动(odbcinst.ini)
- 3. 配置数据源(odbc.ini)
- 三、连接测试与验证
- 1. 使用isql工具测试
- 2. 执行基础SQL验证
- 四、常见问题排查
- 1. 驱动加载失败
- 2. 认证失败
- 3. 端口不通
- 五、配置优化建议
- 六、扩展应用场景
- 扩展:如何在C程序中调用 `SQLGetTypeInfo` 函数
- 一、函数功能
- 二、函数原型
- 三、完整调用示例(C语言)
- 四、关键参数说明
- 1. `DataType` 参数
- 2. 结果集列详解
- 五、编译与执行
- 六、常见问题
- 1. 如何过滤特定数据类型?
- 2. 如何处理达梦特有类型?
- 3. 性能优化建议
达梦数据库DM8 ODBC配置指南(Linux环境)
ODBC
ODBC 提供访问不同类型的数据库的途径。结构化查询语言 SQL 是一种用来访问数据库的语言。通过使用 ODBC,应用程序能够使用相同的源代码和各种各样的数据库交互。这使得开发者不需要以特殊的数据库管理系统 DBMS 为目标,或者了解不同支撑背景的数据库的详细细节,就能够开发和发布客户/服务器应用程序。
在 DM 客户端软件安装过程中,如果选择了安装 ODBC 驱动程序的相关选项,安装工具可完成将 DM ODBC 3.0 驱动程序复制到硬盘,并在 Windows 注册表中登记 DMODBC 驱动程序信息的工作
一、环境准备
- 操作系统:支持主流Linux发行版(如CentOS、Kylin V10等)
- 依赖组件:
- unixODBC 2.3.7或更高版本
- DM8数据库服务(已正确安装且服务已启动)
- 驱动文件:
DM8 ODBC驱动位于数据库安装目录/opt/dmdbms/bin/libdodbc.so
(实际路径需与安装位置一致)
二、核心配置步骤
1. 安装unixODBC
源码安装
yum 安装
# CentOS/RHEL
yum install unixODBC unixODBC-devel# 验证安装
odbcinst -j # 显示配置文件路径及版本信息
2. 配置ODBC驱动(odbcinst.ini)
vi /etc/odbcinst.ini
[DM8 ODBC DRIVER]
Description = ODBC DRIVER FOR DM8
Driver = /opt/dmdbms/bin/libdodbc.so # 必须与实际路径一致
关键参数说明:
[DM8 ODBC DRIVER]
:驱动标识名,需与数据源配置中的Driver字段对应Driver
:指定动态库文件绝对路径,权限需为755
3. 配置数据源(odbc.ini)
vi /home/dmdba/.odbc.ini # 用户级配置
# 或 /etc/odbc.ini # 系统级配置
[dm8]
Description = DM ODBC DSN
Driver = DM8 ODBC DRIVER # 必须与odbcinst.ini中的[]标识匹配
SERVER = localhost # 支持IP或域名
UID = SYSDBA # 数据库账号
PWD = d7mrdr5srrnqI@fW # 数据库密码
TCP_PORT = 5236 # DM8默认端口
高级配置建议:
- 多实例场景可配置
INSTANCE_NAME
参数- 网络超时可添加
LoginTimeout=30
三、连接测试与验证
1. 使用isql工具测试
su - dmdba
isql dm8 # 或 isql dm8 -v 显示详细连接过程
成功输出示例:
+---------------------------------------+| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
2. 执行基础SQL验证
SELECT * FROM V$VERSION; -- 查看数据库版本
SELECT NAME FROM V$DATABASE; -- 显示当前数据库名
四、常见问题排查
1. 驱动加载失败
- 现象:
[01000][unixODBC][Driver Manager]Can't open lib [...]
- 解决方案:
- 检查
libdodbc.so
路径是否正确 - 执行
ldd /opt/dmdbms/bin/libdodbc.so
验证依赖库完整性 - 设置LD_LIBRARY_PATH环境变量:
export LD_LIBRARY_PATH=/opt/dmdbms/bin:$LD_LIBRARY_PATH
- 检查
2. 认证失败
- 现象:
[28000][DM][ODBC]Invalid username or password
- 解决方案:
- 检查UID/PWD是否与数据库用户一致
- 确认是否启用密码策略(如特殊字符需转义)
- 使用
disql
工具直接连接数据库验证凭据
3. 端口不通
- 排查步骤:
telnet localhost 5236 # 测试端口连通性
netstat -tunlp | grep 5236 # 查看端口监听状态
五、配置优化建议
-
性能调优:
- 在
odbc.ini
中增加UseServerPrepStmts=1
启用服务端预处理 - 设置
PrefetchCount=1000
优化批量查询性能
- 在
-
安全增强:
- 将
.odbc.ini
文件权限设置为600 - 通过DM管理工具定期修改SYSDBA密码
- 将
六、扩展应用场景
-
编程接口调用:
- C/C++:使用
<sql.h>
头文件开发 - Python:通过pyodbc库连接
import pyodbc conn = pyodbc.connect('DSN=dm8;UID=SYSDBA;PWD=d7mrdr5srrnqI@fW')
- C/C++:使用
-
第三方工具集成:
- Zabbix:配置ODBC监控项
- Logstash:使用jdbc插件定时同步数据
文档参考:
- 达梦官方ODBC开发指南
- ODBC编程手册
扩展:如何在C程序中调用 SQLGetTypeInfo
函数
以下是如何在C程序中调用 SQLGetTypeInfo
函数获取达梦数据库(DM8)支持的数据类型信息的详细指南:
一、函数功能
SQLGetTypeInfo
是ODBC API函数,用于获取数据源支持的数据类型元数据。返回结果集包含如下关键信息:
- 类型名称(
TYPE_NAME
) - 数据类型(
DATA_TYPE
) - 列最大长度(
COLUMN_SIZE
) - 精度/小数位数(
DECIMAL_DIGITS
) - 是否可为NULL(
NULLABLE
)
二、函数原型
SQLRETURN SQLGetTypeInfo(SQLHSTMT StatementHandle, // 语句句柄SQLSMALLINT DataType // 数据类型标识符(SQL_ALL_TYPES表示获取全部)
);
三、完整调用示例(C语言)
#include <sql.h>
#include <sqlext.h>
#include <stdio.h>int main() {SQLHENV henv; // 环境句柄SQLHDBC hdbc; // 连接句柄SQLHSTMT hstmt; // 语句句柄SQLRETURN retcode;// 1. 初始化环境SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);// 2. 建立连接(替换DSN、UID、PWD为实际值)SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);SQLConnect(hdbc, (SQLCHAR*)"dm8", SQL_NTS, (SQLCHAR*)"SYSDBA", SQL_NTS, (SQLCHAR*)"d7mrdr5srrnqI@fW", SQL_NTS);// 3. 分配语句句柄SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);// 4. 调用SQLGetTypeInfo获取所有数据类型retcode = SQLGetTypeInfo(hstmt, SQL_ALL_TYPES);if (SQL_SUCCEEDED(retcode)) {SQLCHAR typeName[256];SQLSMALLINT dataType, nullable;SQLINTEGER columnSize;SQLSMALLINT decimalDigits;// 绑定结果集列SQLBindCol(hstmt, 1, SQL_C_CHAR, typeName, sizeof(typeName), NULL);SQLBindCol(hstmt, 2, SQL_C_SSHORT, &dataType, 0, NULL);SQLBindCol(hstmt, 3, SQL_C_SLONG, &columnSize, 0, NULL);SQLBindCol(hstmt, 4, SQL_C_SSHORT, &decimalDigits, 0, NULL);SQLBindCol(hstmt, 5, SQL_C_SSHORT, &nullable, 0, NULL);// 遍历结果集printf("Type Name\tData Type\tSize\tNullable\n");while (SQLFetch(hstmt) == SQL_SUCCESS) {printf("%-12s\t%-8d\t%-4d\t%s\n", typeName, dataType, columnSize,(nullable == SQL_NULLABLE) ? "YES" : "NO");}} else {// 错误处理SQLCHAR sqlstate[6], message[SQL_MAX_MESSAGE_LENGTH];SQLINTEGER native_error;SQLSMALLINT msg_len;SQLError(henv, hdbc, hstmt, sqlstate, &native_error, message, sizeof(message), &msg_len);printf("Error: %s\n", message);}// 5. 释放资源SQLFreeHandle(SQL_HANDLE_STMT, hstmt);SQLDisconnect(hdbc);SQLFreeHandle(SQL_HANDLE_DBC, hdbc);SQLFreeHandle(SQL_HANDLE_ENV, henv);return 0;
}
四、关键参数说明
1. DataType
参数
值 | 含义 |
---|---|
SQL_ALL_TYPES | 获取所有支持的数据类型 |
SQL_CHAR | 仅获取字符类型信息 |
SQL_INTEGER | 仅获取整数类型信息 |
… | 其他ODBC标准类型标识符 |
📌 达梦特有类型:DM8可能包含如
BIT
、BLOB
等特有类型,需参考其数据类型文档。
2. 结果集列详解
列索引 | 列名 | 数据类型 | 描述 |
---|---|---|---|
1 | TYPE_NAME | SQL_CHAR | 类型名称(如 VARCHAR) |
2 | DATA_TYPE | SQL_SMALLINT | ODBC数据类型标识符 |
3 | COLUMN_SIZE | SQL_INTEGER | 列最大长度 |
4 | DECIMAL_DIGITS | SQL_SMALLINT | 小数位数(数值类型专用) |
5 | NULLABLE | SQL_SMALLINT | 是否允许NULL值 |
五、编译与执行
gcc -o type_info type_info.c -lodbc
./type_info
输出示例:
Type Name Data Type Size Nullable
VARCHAR 12 255 YES
INTEGER 4 10 NO
DATE 9 10 YES
...
六、常见问题
1. 如何过滤特定数据类型?
// 获取数值类型信息
SQLGetTypeInfo(hstmt, SQL_NUMERIC);
2. 如何处理达梦特有类型?
- 结果集中的
TYPE_NAME
字段会返回DM8特有的类型名称(如BIT
、BINARY
) - 需要结合达梦文档确认类型的实际存储特性
3. 性能优化建议
- 缓存结果集:若程序频繁查询类型信息,建议将结果缓存到内存中
- 按需查询:避免使用
SQL_ALL_TYPES
获取不必要的数据
完整ODBC数据类型映射参考:达梦ODBC编程手册