使用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…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...