使用odbc链接dm8数据库

2024-04-14 07:36
文章标签 使用 数据库 链接 odbc dm8

本文主要是介绍使用odbc链接dm8数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、环境说明

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.zipinflating: dm8_20240116_x86_rh7_64.isoextracting: dm8_20240116_x86_rh7_64.iso_SHA256.txtinflating: 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.sodmdba@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.init@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.init@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

这篇关于使用odbc链接dm8数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/902450

相关文章

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.