使用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数据库
一、环境说明 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中,没有…...

开源项目one-api的k8s容器化部署(上)-- 制作镜像及部署准备
一、背景 最近需要对开源项目one-api进行k8s容器化部署,主要分以下几个步骤: 制作docker镜像申请mysql和redis数据库docker-compose部署方式k8s部署方式 整个的篇幅比较长,将会分成上下两篇来阐述。 二、制作docker镜像 开源项目one-api…...

面试-数据库基础以及MySql、ClickHost、Redis简介
面试-数据库基础以及MySql、ClickHost、Redis简介 0.数据完整性1.数据库并发控制1.1事物1.2 并发读写错误1.3 锁1.3.1 乐观锁与悲观锁1.3.2 共享锁和排他锁1.3.3 行锁与表锁1.3.4 意向锁 1.4 封锁协议与隔离级别1.5 MVCC1.5.1 概念1.5.2 当前读与快照读1.5.3 MVCC in InnoDB 2.…...

MySQL分库分表的方式有哪些
目录 一、为什么要分库分表 二、什么是分库分表 三、分库分表的几种方式 1.垂直拆分 2. 水平拆分 四、分库分表带来的问题 五、分库分表技术如何选型 一、为什么要分库分表 如果一个网站业务快速发展,那这个网站流量也会增加,数据的压力也会随之而…...
数据结构课程设计选做(一)---数字排序(哈希、排序)
2.1.1 题目内容 2.1.1-A [问题描述] 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。 2.1.1-B [基本要求] (1)输入格式: 输入的第一行包含一个整数n,表示给定数字的个数。 第二…...

Linux第90步_异步通知实验
“异步通知”的核心就是信号,由“驱动设备”主动报告给“应用程序”的。 1、添加“EXTI3.c” #include "EXTI3.h" #include <linux/gpio.h> //使能gpio_request(),gpio_free(),gpio_direction_input(), //使能gpio_direction_output(),gpio_get_v…...
elasticdump之python脚本
参考文章目录 elasticdump之shell备份脚本 前言 在企业实际生产环境中,避免不了要对es集群进行迁移、数据备份与恢复,以此来确保数据的可用性及完整性。因此,就涉及到了数据备份与恢复。本章主要以elasticdumppython为主,实现es集群索引备…...

Hystrix应用:如何在Spring Boot中使用Hystrix?
Hystrix应用:如何在Spring Boot中使用Hystrix? 引言 在微服务架构的发展过程中,面对复杂的服务依赖和不可预见的系统故障,如何提升系统的容错能力成为了一个非常急迫且重要的能力。 由 Netflix(网飞)公司…...
js的常用方法
js的常用方法已经使用过的实例 JavaScript有许多基本方法,这些方法可用于执行各种操作,包括字符串操作、数组操作、数学运算等。以下是一些常用的JavaScript基本方法及简单示例: 一、字符串方法 1、toUpperCase():将字符串转换为…...

基于SpringBoot实现的在线拍卖系统
系统开发环境 编程语言:Java数据库:MySQL容器:Tomcat工具:IDEA/Ecilpse、Navicat、Maven 系统实现 管理员功能模块 首页 修改密码 用户管理 商品类型管理 拍卖商品 竞拍公告 轮播图 历史竞拍管理 竞拍订单管理 留言板管理 用户…...

React 组件生命周期对比:Class vs. 函数式
在 React 中,Class 组件和函数式组件的生命周期存在一些差异。通过对 React 中 Class 组件和函数式组件的生命周期进行对比,详细探讨了它们在设计哲学、生命周期管理和开发技巧上的异同。全面了解 React 中两种组件类型的生命周期特点,以及如…...

Ubuntu去除烦人的顶部【活动】按钮
文章目录 一、需求说明二、打开 extensions 网站三、安装 GNOME Shell 插件四、安装本地连接器五、安装 Hide Activities Button 插件六、最终效果七、卸载本地连接器命令参考 本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 一、需求说明 使用 Ubuntu 的过程中,屏…...

Vue2(十五):replace属性、编程式路由导航、缓存路由组件、路由组件独有钩子、路由守卫、history与hash
一、router-link的replace属性 1、作用:控制路由跳转时操作浏览器历史记录的模式 2、浏览器的历史记录有两种写入方式:分别为push和replace,push是追加历史记录,replace是替换当前记录。路由跳转时候默认为push 3、如何开启repla…...

智慧污水井物联网远程监控案例
智慧污水井物联网远程监控案例 在当今数字化转型的浪潮中,智慧水务已成为城市基础设施建设的重要组成部分。其中,基于物联网技术的智慧污水井远程监控系统以其高效、精准、实时的特性,在提升污水处理效能、保障城市水环境安全、实现精细化管…...

程序员Java.vue,python前端后端爬虫开发资源分享
bat面试资料 bat面试题汇总 提取码:724z 更多资料...
PCL:基于法线微分分割
1.介绍 在三维点云处理中,法线微分分割(Difference of Normals,简称DoN)是一种常用的分割方法,用于将点云中的物体或者场景进行分割成不同的部分或者簇。通过计算点云中每个点的法线向量,以及法线向量的变化率(差异),可以有效地分割出具有明显形状差异的部分,从而实现…...

生产事故:线程管理不善诱发P0故障
背景 处于业务诉求,需要建立一个统一的调度平台,最终是基于 Dolphinscheduler 的 V1.3.6 版本去做二次开发。在平台调研建立时,这个版本是最新的版本 命运之轮开始转动 事故 表象 上班后业务部门反馈工作流阻塞,登录系统发现大…...
WPF —— GDI画板
定义绘制对象 Graphics g; 起始点坐标 Point start; 画笔颜色 Color c1 Color.Black; 是否开始绘制 当flagtrue开始绘制,结束绘 private void Form1_MouseDown(object sender, MouseEventArgs e) {if (e.Button MouseButtons.Left) //点击了鼠标左键{start …...
C++:基于范围的for循环
使用迭代器遍历容器在遍历的过程中需要给出容器的两端:开头(begin)和结尾(end),因为这种遍历方式不是基于范围来设计的。在基于范围的for循环中,不需要再传递容器的两端,循环会自动以…...

引领智能互联时代,紫光展锐赋能百业创新发展
随着5G技术的快速发展,各行各业对通信技术的需求也在不断升级。紫光展锐持续深耕5G垂直行业,不断推进5G标准演进,从R15到R16,再到R17,展锐携手生态合作伙伴,不断推出创新性解决方案,在5G RedCap…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...