c++通过DPI连接达梦数据库
通过ODBC连接上数据库后,同事让我换内网电脑开发,又换了数据库给我,结果怎么都连不上数据库,又尝试了DPI连接达梦数据库的方式,连接上了,记录如下。
连接代码
#include "StdAfx.h" #include <stdio.h> #include <stdlib.h> #include <string> #include "DPI.h" #include "DPIext.h" #include "DPItypes.h" #define DM_SVR "10.1.30.53:5236" #define DM_USER "SYSDBA" #define DM_PWD "123456789" dhenv henv; /* 环境句柄 */ dhcon hcon; /* 连接句柄 */ dhstmt hstmt; /* 语句句柄 */ dhdesc hdesc; /* 描述符句柄 */ DPIRETURN rt; /* 函数返回值 */ /****************************************************** 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); } /* 入口函数 */ int main(int argc, char *argv[]) { //连接数据库 /* 申请环境句柄 */ rt = dpi_alloc_env(&henv); /* 申请连接句柄 */ rt = dpi_alloc_con(henv, &hcon); /* 连接数据库服务器 */ rt = dpi_login(hcon, (sdbyte *)DM_SVR, (sdbyte *)DM_USER, (sdbyte *)DM_PWD); if(!DSQL_SUCCEEDED(rt)) { dpi_err_msg_print(DSQL_HANDLE_DBC, hcon); return rt; } printf("dpi: connect to server success!\n"); //断开数据库连接 /* 断开连接 */ rt = dpi_logout(hcon); if(!DSQL_SUCCEEDED(rt)) { dpi_err_msg_print(DSQL_HANDLE_DBC, hcon); return rt; } printf( "dpi: disconnect from server success!\n" ); /* 释放连接句柄和环境句柄 */ rt = dpi_free_con(hcon); rt = dpi_free_env(henv); return rt; }
安装达梦数据库后找到目录内的 drivers\dpi 文件夹
inlcude 文件夹里是头文件,附加到程序里,链接库里加上 dmdpi.lib 文件,把其他dll文件跟程序的exe放在一起
头文件
链接库
动态库
其他数据库使用看如下网址,官方文档
达梦数据库查看字符集
SELECT '字符集',DECODE(UNICODE,'0','GB18030','1','UTF-8','2','EUC-KR');
--或者
SELECT '字符集',DECODE(SF_GET_UNICODE_FLAG(),'0','GB18030','1','UTF-8','2','EUC-KR');
需要特别说明,达梦数据库字符集在初始化数据库实例之后,在整个实例生命周期都不能更改。