环境准备

程序员开发手册内容如下:

dpi程序在编译的过程中需要用到的DM头文件、链接文件、动态库文件都在达梦安装目录的drivers\dpi\下,include中是头文件。如下:

使用64位的DPI接口时,需要添加DM64 的宏,即 Linux平台下编译程序添加“ DDM64 ”编译参数,Windows平台下则在相应工程的预处理器定义中添加DM64 。

在VS上新建C的项目

创建c++项目工程,添加源文件。

进行项目配置

头文件配置

1. 添加头文件路径

放到项目名称上,右键点击属性

左侧点击C/C++

  1. 将最上方的配置以及平台设置为所有,因为有release和Debug模式所以进行全局配置
  2. 附件包含目录选项设置 文件头文件目录D:\damba\dm8\drivers\dpi\include(设置成自己的dpi的include目录)
  3. 将SDL检查设置成

2. 引入所需的头文件

右键点击头文件–》添加–》现有项–将include下面的h文件引入到项目中

链接文件配置

1. 添加链接文件

放到项目名称上,右键点击属性

  1. 点击链接器==》修改附加库目录 (dll文件目录)D:\damba\dm8\drivers\dpi

2. 项目引入链接文件

资源文件右键添加现有项,添加dmdpi.lib。

添加动态库文件

右键项目==》生成解决方案==》将动态库文件都复制到生成的项目目录下:

在日志中可以看到生成的目录

添加编译参数DM64

放到项目名称上,右键点击属性

  1. C/C++》预处理器》修改预处理器定义添加如下内容 _CRT_SECURE_NO_WARNINGS;DM64;

运行项目

新建C文件

名字为dm_crud_cpp文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "DPI.h"
#include "DPIext.h"
#include "DPItypes.h"
#define DM_SVR "127.0.0.1:5236"
#define DM_USER "SYSDBA"
#define DM_PWD "SYSDBA"
#define ROWS 1
dhenv henv; /* 环境句柄 */
dhcon hcon; /* 连接句柄 */
dhstmt hstmt; /* 语句句柄 */
dhdesc hdesc; /* 描述符句柄 */
DPIRETURN rt; /* 函数返回值 */
#define DPIRETURN_CHECK(rt, hndl_type, hndl) if(!DSQL_SUCCEEDED(rt)){dpi_err_msg_print(hndl_type,hndl); return rt;}
#define FUN_CH ECK(rt) if(!DS QL_SUCCEEDED(rt)){got o END;}
/******************************************************
Notes:
获取错误信息
*******************************************************/
void dpi_err_msg_print(sdint2 hndl_type, dhandle hndl)
{sdint4 err_code;sdint2 msg_len;sdbyte err_msg[SDBYTE_MAX];/* 获取错误信息集合 */dpi_get_diag_rec(hndl_type, hndl, 1, &err_code, err_msg, sizeof(err_msg), &msg_len);printf("err_msg = %s, err_code = %d\n", err_msg, err_code);
}/* 创建新连接*/
DPIRETURN dm_dpi_connect(sdbyte* server, sdbyte* uid, sdbyte* pwd)
{/* 申请环境句柄 */rt = dpi_alloc_env(&henv);DPIRETURN_CHECK(rt, DSQL_HANDLE_ENV, henv);/* 申请连接句柄 */rt = dpi_alloc_con(henv, &hcon);DPIRETURN_CHECK(rt, DSQL_HANDLE_DBC, hcon);/* 连接数据库服务器 */rt = dpi_login(hcon, server, uid, pwd);DPIRETURN_CHECK(rt, DSQL_HANDLE_DBC, hcon);if (!DSQL_SUCCEEDED(rt)){dpi_err_msg_print(DSQL_HANDLE_DBC, hcon);return rt;}return DSQL_SUCCESS;
}/* 初始化环境*/
DPIRETURN dm_init_env(){/* 分配语句句柄 */rt = dpi_alloc_stmt(hcon, &hstmt);//清空表,初始化测试环境DPIRETURN_CHECK(rt, DSQL_HANDLE_DBC, hcon);dpi_exec_direct(hstmt, (sdbyte*)"drop table dpi_demo");rt = dpi_exec_direct(hstmt, (sdbyte*)"create table dpi_demo(c1 int, c2 char(20), c3 varchar(50), c4 numeric(7,3), c5 timestamp(5), c6 clob, c7 blob)");DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);rt = dpi_free_stmt(hstmt);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);printf("dm init table success\r\n");}/* insert数据*/
DPIRETURN dm_insert_data(sdint4* c1) {//插入数据//sdint4 c1 = 0; /* 与字段匹配的变量 */sdbyte c2[10];sdbyte c3[10];ddouble c4;dpi_timestamp_t c5;sdbyte c6[18];sdbyte c7[18];slength c1_ind_ptr;slength c2_ind_ptr; /* 缓冲区长度 */slength c3_ind_ptr;slength c4_ind_ptr = 0;slength c5_ind_ptr = 0;slength c6_ind_ptr;slength c7_ind_ptr;/* 分配语句句柄 */rt = dpi_alloc_stmt(hcon, &hstmt);DPIRETURN_CHECK(rt, DSQL_HANDLE_DBC, hcon);/* 准备 sql */rt = dpi_prepare(hstmt, (sdbyte*)"insert into dpi_demo(c1,c2,c3,c4,c5,c6,c7 ) values(?,?,?,?,?,?,?)");DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);/* 字段变量赋值 *///c1 = 201410;memcpy(c2, "abcde", 5);memcpy(c3, "abcdefghi", 9);c4 = 0.009;c5.year = 2011;c5.month = 3;c5.day = 1;c5.hour = 11;c5.minute = 45;c5.second = 50;c5.fraction = 900;memcpy(c6, "adfadsfetre2345ert", 18);memcpy(c7, "1234567890abcdef12", 18);c1_ind_ptr = sizeof(c1);c2_ind_ptr = 5; /* 获取缓冲区长 度 */c3_ind_ptr = 9;c4_ind_ptr = sizeof(c4);c5_ind_ptr = sizeof(c5);c6_ind_ptr = 18;c7_ind_ptr = 18;/* 绑定参数 */rt = dpi_bind_param(hstmt, 1, DSQL_PARAM_INPUT, DSQL_C_SLONG, DSQL_INT, sizeof(c1), 0, &c1, sizeof(c1), &c1_ind_ptr);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);rt = dpi_bind_param(hstmt, 2, DSQL_PARAM_INPUT, DSQL_C_NCHAR, DSQL_CHAR, sizeof(c2), 0, c2, sizeof(c2), &c2_ind_ptr);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);rt = dpi_bind_param(hstmt, 3, DSQL_PARAM_INPUT, DSQL_C_NCHAR, DSQL_VARCHAR, sizeof(c3), 0, c3, sizeof(c3), &c3_ind_ptr);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);rt = dpi_bind_param(hstmt, 4, DSQL_PARAM_INPUT, DSQL_C_DOUBLE, DSQL_DOUBLE, sizeof(c4), 0, &c4, sizeof(c4), &c4_ind_ptr);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);rt = dpi_bind_param(hstmt, 5, DSQL_PARAM_INPUT, DSQL_C_TIMESTAMP, DSQL_TIMESTAMP, sizeof(c5), 0, &c5, sizeof(c5), &c5_ind_ptr);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);rt = dpi_bind_param(hstmt, 6, DSQL_PARAM_INPUT, DSQL_C_NCHAR, DSQL_CLOB, sizeof(c6), 0, c6, sizeof(c6), &c6_ind_ptr);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);rt = dpi_bind_param(hstmt, 7, DSQL_PARAM_INPUT, DSQL_C_NCHAR, DSQL_BLOB, sizeof(c7), 0, c7, sizeof(c7), &c7_ind_ptr);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);/* 执行 Dsql */rt = dpi_exec(hstmt);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);/* 释放语句句柄 */rt = dpi_free_stmt(hstmt);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);printf("dm insert with bind param success\r\n");}/* fetch 获取结果集*/
DPIRETURN dm_select_with_fetch()
{sdint4 c1 = 0; /* 与字段匹配的变量,用于获取字段值 */sdbyte c2[20];sdbyte c3[50];ddouble c4;dpi_timestamp_t c5;sdbyte c6[50];sdbyte c7[500];slength c1_ind = 0; /* 缓冲区 */slength c2_ind = 0;slength c3_ind = 0;slength c4_ind = 0;slength c5_ind = 0;slength c6_ind = 0;slength c7_ind = 0;ulength row_num; /* 行数 */sdint4 dataflag = 0;/* 分配语句句柄 */DPIRETURN_CHECK(dpi_alloc_stmt(hcon, &hstmt), DSQL_HANDLE_STMT, hstmt);/* 执行 sql 语句 */DPIRETURN_CHECK(dpi_exec_direct(hstmt,(sdbyte*)"select c1,c2,c3,c4,c5,c6,c7 from dpi_demo"), DSQL_HANDLE_STMT, hstmt);/* 绑定输出列 */DPIRETURN_CHECK(dpi_bind_col(hstmt, 1, DSQL_C_SLONG, &c1, sizeof(c1), &c1_ind), DSQL_HANDLE_STMT, hstmt);DPIRETURN_CHECK(dpi_bind_col(hstmt, 2, DSQL_C_NCHAR, &c2, sizeof(c2), &c2_ind), DSQL_HANDLE_STMT, hstmt);DPIRETURN_CHECK(dpi_bind_col(hstmt, 3, DSQL_C_NCHAR, &c3, sizeof(c3), &c3_ind), DSQL_HANDLE_STMT, hstmt);DPIRETURN_CHECK(dpi_bind_col(hstmt, 4, DSQL_C_DOUBLE, &c4, sizeof(c4), &c4_ind), DSQL_HANDLE_STMT, hstmt);DPIRETURN_CHECK(dpi_bind_col(hstmt, 5, DSQL_C_TIMESTAMP, &c5, sizeof(c5), &c5_ind), DSQL_HANDLE_STMT, hstmt);DPIRETURN_CHECK(dpi_bind_col(hstmt, 6, DSQL_C_NCHAR, &c6, sizeof(c6), &c6_ind), DSQL_HANDLE_STMT, hstmt);DPIRETURN_CHECK(dpi_bind_col(hstmt, 7, DSQL_C_NCHAR, &c7, sizeof(c7), &c7_ind), DSQL_HANDLE_STMT, hstmt);printf("dm_select_with_fetch......\n");printf("----------------------------------------------------------------------\n");while (dpi_fetch(hstmt, &row_num) != DSQL_NO_DATA){printf("c1 = %d, c2 = %s, c3 = %s, c4 = %f, ", c1, c2, c3, c4);printf("c5 = %d - %d - %d %d:%d : %d.%d\n", c5.year, c5.month, c5.day, c5.hour, c5.minute, c5.second, c5.fraction);printf("c6 = %s, c7 = %s\n", c6, c7);dataflag = 1;}printf("----------------------------------------------------------------------\n");if (!dataflag){printf("dm no data\n");}/* 释放语句句柄 */DPIRETURN_CHECK(dpi_free_stmt(hstmt), DSQL_HANDLE_STMT, hstmt);return DSQL_SUCCESS;
}/* update数据*/
DPIRETURN dm_update_data(sdint4* old_c1, sdint4* new_c1) {//插入数据//sdint4 old_c1 = 0; /* 与字段匹配的变量 *///sdbyte new_c1 = 0;slength old_c1_ind_ptr; /* 缓冲区长度 */slength new_c1_ind_ptr; /* 缓冲区长度 *//* 分配语句句柄 */rt = dpi_alloc_stmt(hcon, &hstmt);DPIRETURN_CHECK(rt, DSQL_HANDLE_DBC, hcon);/* 准备 sql */rt = dpi_prepare(hstmt, (sdbyte*)"update dpi_demo set C1 = ? where C1 = ?");DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);/* 字段变量赋值 */old_c1_ind_ptr = sizeof(old_c1);/* 获取缓冲区长 度 */new_c1_ind_ptr = sizeof(new_c1);/* 获取缓冲区长 度 *//* 绑定参数 */rt = dpi_bind_param(hstmt, 1, DSQL_PARAM_INPUT, DSQL_C_SLONG, DSQL_INT, sizeof(old_c1), 0, &old_c1, sizeof(old_c1), &old_c1_ind_ptr);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);rt = dpi_bind_param(hstmt, 2, DSQL_PARAM_INPUT, DSQL_C_SLONG, DSQL_INT, sizeof(new_c1), 0, &new_c1, sizeof(new_c1), &new_c1_ind_ptr);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);/* 执行 Dsql */rt = dpi_exec(hstmt);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);/* 释放语句句柄 */rt = dpi_free_stmt(hstmt);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);printf("dm update data with param success\r\n");}/* update数据*/
DPIRETURN dm_delete_data(sdint4* data_id) {//插入数据//sdint4 old_c1 = 0; /* 与字段匹配的变量 *///sdbyte new_c1 = 0;slength data_id_ind_ptr; /* 缓冲区长度 *//* 分配语句句柄 */rt = dpi_alloc_stmt(hcon, &hstmt);DPIRETURN_CHECK(rt, DSQL_HANDLE_DBC, hcon);/* 准备 sql */rt = dpi_prepare(hstmt, (sdbyte*)"delete from DPI_DEMO where c1 =?");DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);/* 字段变量赋值 */data_id_ind_ptr = sizeof(data_id);/* 获取缓冲区长 度 *//* 绑定参数 */rt = dpi_bind_param(hstmt, 1, DSQL_PARAM_INPUT, DSQL_C_SLONG, DSQL_INT, sizeof(data_id), 0, &data_id, sizeof(data_id), &data_id_ind_ptr);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);/* 执行 Dsql */rt = dpi_exec(hstmt);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);/* 释放语句句柄 */rt = dpi_free_stmt(hstmt);DPIRETURN_CHECK(rt, DSQL_HANDLE_STMT, hstmt);printf("dm delete data with id param success\r\n");}/* 断开数据库连接*/
DPIRETURN dm_dpi_disconnect()
{/* 断开连接 */rt = dpi_logout(hcon);DPIRETURN_CHECK(rt, DSQL_HANDLE_DBC, hcon);if (!DSQL_SUCCEEDED(rt)){dpi_err_msg_print(DSQL_HANDLE_DBC, hcon);return rt;}/* 释放连接句柄和环境句柄 */rt = dpi_free_con(hcon);DPIRETURN_CHECK(rt, DSQL_HANDLE_DBC, hcon);rt = dpi_free_env(henv);DPIRETURN_CHECK(rt, DSQL_HANDLE_ENV, henv);return DSQL_SUCCESS;
}void split(char str[], char delims[])
{char *result = NULL;result = strtok(str, delims);while (result != NULL) {printf("result is \"%s\"\n", result);result = strtok(NULL, delims);}
}
\/*
入口函数
*/
int main(int argc, char* argv[])
{sdint4  out_c1 = 0;sdbyte  out_c2[20] = { 0 };slength out_c1_ind = 0;slength out_c2_ind = 0;// 连接数据库rt = dm_dpi_connect((sdbyte*)DM_SVR, (sdbyte*)DM_USER, (sdbyte*)DM_PWD);// 初始化环境rt =  dm_init_env();// 插入数据rt = dm_insert_data((sdint4*)1);// 插入数据rt = dm_insert_data((sdint4*)2);// 插入数据rt = dm_insert_data((sdint4*)3);// 查询数据rt = dm_select_with_fetch();//修改数据rt = dm_update_data((sdint4*)555, (sdint4*)1);// 查询数据rt = dm_select_with_fetch();//删除数据rt = dm_delete_data((sdint4*)2);// 查询数据rt = dm_select_with_fetch();//断开数据库连接rt = dm_dpi_disconnect();system("pause");return 0;return rt;
}

运行结果

附录

添加运行参数

调试==》命令参数SYSDBA/SYSDBA@127.0.0.1:5236 1 3

配置属性里面没有c/c++

使用VS建过C#的工程,再打开C++工程,新建一个项目,空工程,找不到配置属性页(可能也经历过一些自动关键和断电之类的异常情形,但不确定是导致bug的原因)。

解决方案

随便编译一次新的工程就好了

int main(){int i = 0;return 0;
}

达梦支持

=======================================

有任何问题请到技术社区反馈。

24小时免费服务热线:400 991 6599

达梦技术社区:https://eco.dameng.com

Window下VS运行达梦DPI相关推荐

  1. Linux环境下如何安装达梦数据库

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Linux环境下如何安装达梦数据库 一.检查服务器防火墙 二.安装步骤 1.创建达梦用户 2.创建达梦目录 3.配置系统限制 4.镜像 ...

  2. VMWare WorkStation Pro 15下NeoKylin及达梦数据库安装过程及踩坑笔记

    NeoKylin安装过程(CentOS亦可,推荐中标麒麟,相信以后会有更多的中国智造投入商用,中国加油!) (安装过程截图) 此处容易踩坑,如果是新手,还是乖乖在配置里把GUI选上,否则安装完重启,看 ...

  3. window下怎么运行lua源文件

    最近在重新系统学习一下lua,从第一步开始,先运行一个Lua文件,我是做游戏开发的,Lua直接绑在VS上运行,在公司还好,在自己手提上就GG了...慢得不行,所以就直接运行呗,其实也很简单 1.首先检 ...

  4. 达梦数据库DSC集群安装文档

    达梦数据库DSC集群安装文档 一. DSC安装准备工作 1 1.1. 创建安装用户 2 1.2. 配置udev存储 2 二. DMDSC 搭建 8 三. 搭建DW容灾架构 39 修改dm.ini,数据 ...

  5. 达梦数据库删除用户_达梦数据库的操作手册.docx

    达梦数据库操作手册2013年12月15日达梦数据库安装服务器安装数据库安装注意问题数据库的安装路径不要直接放在操作系统的/目录相同的磁盘上,可以安装在/dmdb/dm,但是/dmdb要单独挂载在一块硬 ...

  6. 中标麒麟+QT+达梦数据库

    中标麒麟+QT+达梦数据库 环境版本说明 中标麒麟的安装 达梦数据库的安装和连接 一.创建安装用户.组(root下操作) 二.新建安装数据库的文件(root下操作) 三.挂载ISO文件(root下操作 ...

  7. 达梦数据库安装配置记录

    目录 1 确定软硬件环境 1.1 硬件环境需求 1.2 软件环境需求 1.3 本次部署的软硬件情况 2 软硬件准备 2.1 软件版本 2.2 软件获取 3 安装操作系统 4 软件包上传 4.1 服务器 ...

  8. 国产数据库达梦初学习

    前言:国产数据库的浪潮已经到来,作为计算机领域的一员有幸得参加了一款国产数据库的培训,对当前国产数据库得概况有了了解.而达梦作为国产数据库得代表之一,以完全自主开发为核心,以人性化易操作为主体.方便了 ...

  9. 达梦数据成功过会!信创浪潮中如何成就一家国产龙头?

    ‍ ‍数据智能产业创新服务媒体 --聚焦数智 · 改变商业 2022年12月22日,上海证券交易所科创板上市委员会发布<2022年第110次审议会议结果公告>,武汉达梦数据股份有限公司(首 ...

最新文章

  1. 微信小程序用户未授权bug解决方法,微信小程序获取用户信息失败解决方法
  2. 14 Java面试之 IO 流技术
  3. ASP.NET编程中的十大技巧【转载】
  4. [私]-optee的同步方法
  5. SAP的成本中心与利润中心的关系
  6. LTE Module User Documentation(翻译6)——物理误差模型、MIMO模型、天线模型
  7. 少样本文本分类 InductionNet
  8. 手机号码归属地查询接口大全
  9. ul阻燃标准有几个等级_UL94阻燃等级介绍及常见误区分析
  10. python是高级语言还是低级语言_高级编程语言和低级语言的比较
  11. uniapp处理tsconfig.json报错
  12. angularjs2大漠穷秋视频笔记整理
  13. Linux工作笔记01
  14. IndentationError: unindent does not match any outer indentation level问题
  15. 《Java从入门到项目实战(全程视频版)》(李兴华 著)【配套资源及赠送资源】
  16. 曲线救国的就业路线是否合理?
  17. 北京大学 李胜 计算机,rasterization-北京大学计算机系图形与交互技术室.pdf
  18. Android的multidex带来的性能问题-减慢app启动速度, from泡在网上的日子
  19. simcom工作记录
  20. python量化策略源码_【Python量化投资】趋向系统指标策略 ADX、DMI指标用于股票池(附源码)...

热门文章

  1. java短横线转驼峰_Java后端常备的开发规范
  2. html+form+multipartform-data,表单 – 如何处理node.js中的multipart / form-data
  3. linux字符设备移动硬盘,Red Hat Enterprise Linux 7.5挂载NTFS移动硬盘
  4. MVC模式 在Java Web应用程序中的实现
  5. 软件体系结构课后作业03
  6. JAVA中String的一些常用函数用法总结
  7. 洛谷P1396 营救 题解
  8. rails应用中各数据平台的对接
  9. java 如何把源码导出为jar包,以及如何使用导出的jar包
  10. RSA 公钥加密——私钥解密