一、环境说明
windows11 + VMware Workstation 17 Pro + ubuntu22.04 + docker
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.3 LTS
Release: 22.04
Codename: jammy
因docker版本的dm8中,没有odbc相关的驱动以及头文件,因此在Ubuntu22.04上安装一个完整的dm8
二、Ubuntu22.04安装dm8
参考:https://eco.dameng.com/document/dm/zh-cn/start/install-dm-linux-prepare.html
2. 1 下载
这里下载redhat7即可
2.2 解压
t@t:~$ unzip dm8_20240116_x86_rh7_64.zip
Archive: dm8_20240116_x86_rh7_64.zip
inflating: dm8_20240116_x86_rh7_64.iso
extracting: dm8_20240116_x86_rh7_64.iso_SHA256.txt
inflating: dm8_20240116_x86_rh7_64.iso.README
2. 3 挂载镜像
t@t:~$ sudo mkdir /mnt/dm8_iso
[sudo] password for t:
t@t:~$ sudo mount dm8_20240116_x86_rh7_64.iso -o loop /mnt/dm8_iso
mount: /mnt/dm8_iso: WARNING: source write-protected, mounted read-only.
2.4 创建安装用户
t@t:~$ su root
Password:
root@t:~# groupadd dinstall -g 2001
root@t:~# useradd -G dinstall -m -d /home/dmdba -s /bin/bash -u 2001 dmdba
root@t:~# passwd dmdba
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: password updated successfully
2.5 安装dm8
root@t:~# su - dmdba
dmdba@t:~$ cd /mnt/dm8_iso/
dmdba@t:/mnt/dm8_iso$ ls
'DM8 Install.pdf' DMInstall.bin
dmdba@t:/mnt/dm8_iso$ ./DMInstall.bin -i
Installer Language:
[1]: 简体中文
[2]: English
Please select the installer's language [2]:1
解压安装程序.........
本系统已存在其他版本达梦数据库,请您卸载。如继续安装,可能影响其他版本达梦数据库正常使用。
是否继续? (Y/y:是 N/n:否) [Y/y]:y
欢迎使用达梦数据库安装程序
是否输入Key文件路径? (Y/y:是 N/n:否) [Y/y]:n
是否设置时区? (Y/y:是 N/n:否) [Y/y]:y
设置时区:
[ 1]: (GTM-12:00) 日界线西
[ 2]: (GTM-11:00) 萨摩亚群岛
[ 3]: (GTM-10:00) 夏威夷
[ 4]: (GTM-09:00) 阿拉斯加
[ 5]: (GTM-08:00) 太平洋时间(美国和加拿大)
[ 6]: (GTM-07:00) 亚利桑那
[ 7]: (GTM-06:00) 中部时间(美国和加拿大)
[ 8]: (GTM-05:00) 东部部时间(美国和加拿大)
[ 9]: (GTM-04:00) 大西洋时间(美国和加拿大)
[10]: (GTM-03:00) 巴西利亚
[11]: (GTM-02:00) 中大西洋
[12]: (GTM-01:00) 亚速尔群岛
[13]: (GTM) 格林威治标准时间
[14]: (GTM+01:00) 萨拉热窝
[15]: (GTM+02:00) 开罗
[16]: (GTM+03:00) 莫斯科
[17]: (GTM+04:00) 阿布扎比
[18]: (GTM+05:00) 伊斯兰堡
[19]: (GTM+06:00) 达卡
[20]: (GTM+07:00) 曼谷,河内
[21]: (GTM+08:00) 中国标准时间
[22]: (GTM+09:00) 首尔
[23]: (GTM+10:00) 关岛
[24]: (GTM+11:00) 所罗门群岛
[25]: (GTM+12:00) 斐济
[26]: (GTM+13:00) 努库阿勒法
[27]: (GTM+14:00) 基里巴斯
请选择时区 [21]:21
安装类型:
1 典型安装
2 服务器
3 客户端
4 自定义
请选择安装类型的数字序号 [1 典型安装]:1
所需空间: 1979M
请选择安装目录 [/home/dmdba/dmdbms]:
可用空间: 43G
是否确认安装路径(/home/dmdba/dmdbms)? (Y/y:是 N/n:否) [Y/y]:y
安装前小结
安装位置: /home/dmdba/dmdbms
所需空间: 1979M
可用空间: 43G
版本信息:
有效日期:
安装类型: 典型安装
是否确认安装? (Y/y:是 N/n:否):y
2024-04-13 09:08:21
[INFO] 安装 基础 模块...
2024-04-13 09:08:21
[INFO] 安装达梦数据库...
2024-04-13 09:08:30
[INFO] 安装 服务器 模块...
2024-04-13 09:08:31
[INFO] 安装 客户端 模块...
2024-04-13 09:08:32
[INFO] 安装 驱动 模块...
2024-04-13 09:08:34
[INFO] 安装 手册 模块...
2024-04-13 09:08:35
[INFO] 安装 服务 模块...
2024-04-13 09:08:35
[INFO] 移动日志文件。
2024-04-13 09:08:36
[INFO] 安装达梦数据库完成。
请以root系统用户执行命令:
/home/dmdba/dmdbms/script/root/root_installer.sh
安装结束
因只需要相关的驱动,因此并未执行root_installer.sh, 也并未启动dm服务器
,还是使用原先的docker镜像
dmdba@t:/mnt/dm8_iso$ cd ~
dmdba@t:~$ ls dmdbms/drivers/odbc/
libcrypto.so libdmdpi.so libdmfldr.so libdodbc.a libdodbc.so libssl.so
dmdba@t:~$ ls dmdbms/include/
asmapi2.h dpc_dll.h fldr.h libdmfldr_comm.a libdodbc.a OOPI.h
crypto_engine.h dpc_dll_with_oci_connect.h libdmasmapi.a libdmfldr_dll_java.a libdwmon.a sqlca_db2.h
DCI1.h dpc_ora_dll.h libdmdci.a libdmlogmnr.a logmnr_client.h sqlca.h
DCI.h DPIext.h libdmde.a libdmlogmnr_client.a logmnr_pub.h sqlca_ora.h
de_pub.h DPI.h libdmdpc.a libdmmsgparse.a msg_parse.h sqlda_db2.h
dmcpt_dll.h DPItypes.h libdmdpi.a libdmnci.a msgparse_pub.h sqlda.h
dmsbt_dll.h dwmon_dll.h libdmfldr.a libdmoopi.a nci.h sqlda_ora.h
三、 编写odbc代码
3.1 安装odbc开发库
dmdba@t:~$ exit
root@t:~# exit
t@t:~$ sudo apt install unixodbc-dev -y
3.2 配置odbc
t@t:~$ sudo vim /etc/odbcinst.ini
t@t:~$ cat /etc/odbcinst.ini
[DM8 ODBC DRIVER]
Description = ODBC DRIVER FOR DM8
Driver = /home/dmdba/dmdbms/drivers/odbc/libdodbc.so
t@t:~$ sudo vim /etc/odbc.ini
t@t:~$ cat /etc/odbc.ini
[dm]
Description = DM ODBC DSN
Driver = DM8 ODBC DRIVER
SERVER = 192.168.15.128
UID = SYSDBA
PWD = SYSDBA001
TCP_PORT = 30236
3.3 编写程序
参考 https://eco.dameng.com/document/dm/zh-cn/pm/odbc-rogramming-guide.html
#include <stdio.h>
#include <sql.h>
#include <sqltypes.h>
#include <sqlext.h>
//检测返回代码是否为成功标志,当为成功标志返回 TRUE,否则返回 FALSE
#define RC_SUCCESSFUL(rc) ((rc) == SQL_SUCCESS || (rc) == SQL_SUCCESS_WITH_INFO)
//检测返回代码是否为失败标志,当为失败标志返回 TRUE,否则返回 FALSE
#define RC_NOTSUCCESSFUL(rc) (!(RC_SUCCESSFUL(rc)))
HENV henv; //环境句柄
HDBC hdbc; //连接句柄
HSTMT hsmt; //语句句柄
SQLRETURN sret; //返回代码
char szpersonid[11]; //人员编号
SQLLEN cbpersonid=0;
char szname[51]; //人员姓名
SQLLEN cbname=0;
char szphone[26]; //联系电话
SQLLEN cbphone=0;
void main(void)
{
//申请一个环境句柄
sret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
printf("%d\n", sret);
//设置环境句柄的 ODBC 版本
sret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
printf("%d\n", sret);
//申请一个连接句柄
sret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
printf("%d\n", sret);
sret = SQLConnect(hdbc, (SQLCHAR *)"dm", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS, (SQLCHAR *)"SYSDBA001", SQL_NTS);
printf("%d\n", sret);
//申请一个语句句柄
sret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hsmt);
printf("%d\n", sret);
//立即执行查询人员信息表的语句
sret = SQLExecDirect(hsmt, (SQLCHAR *)"SELECT personid, name, phone FROM person.person;", SQL_NTS);
printf("%d\n", sret);
//绑定数据缓冲区
sret = SQLBindCol(hsmt, 1, SQL_C_CHAR, szpersonid, sizeof(szpersonid), &cbpersonid);
sret = SQLBindCol(hsmt, 2, SQL_C_CHAR, szname, sizeof(szname), &cbname);
sret = SQLBindCol(hsmt, 3, SQL_C_CHAR, szphone, sizeof(szphone), &cbphone);
//取得数据并且打印数据
printf("人员编号 人员姓名 联系电话\n");
for (;;) {
sret = SQLFetchScroll(hsmt, SQL_FETCH_NEXT, 0);
if (sret == SQL_NO_DATA_FOUND)
break;
printf("%s%s %s\n", szpersonid, szname, szphone);
}
//关闭游标,终止语句执行
SQLCloseCursor(hsmt);
//释放语句句柄
SQLFreeHandle(SQL_HANDLE_STMT, hsmt);
//断开与数据源之间的连接
SQLDisconnect(hdbc);
//释放连接句柄
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
//释放环境句柄
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
dmdba@t:~$ gcc dm8_odbc.c -o dm8_odbc -lodbc
dmdba@t:~$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dmdba/dmdbms/drivers/odbc ./dm8_odbc
0
0
0
0
0
0
人员编号 人员姓名 联系电话
1李丽 02788548562
2王刚 02787584562
3李勇 02782585462
4郭艳 02787785462
5孙丽 13055173012
6黄非 13355173012
7王菲 13255173012
8张平 13455173012
9张红 13555173012
10刘佳 13955173012
11王南 15955173012
12李飞 15954173012
13张大海 15955673012
14王宇轩 15955175012
15桑泽恩 15955173024
16刘青 15955173055
17杨凤兰 02785584662
note:
- 因/home/dmdba/dmdbms/drivers/odbc/libdodbc.so驱动文件在dmdba用户目录下,因此需要dmdba用户或者root用户,否则无法访问此驱动文件
- 因libdodbc.so会依赖libdmdpi.so, 因此需要增加搜索路径,这里临时使用LD_LIBRARY_PATH