这里搭建的思路是从搭建好达梦库的机器中将达梦DPI的so和对应的include导出来,到新机器上,就是DPI的开发环境了。
其中so为:libdmdpi.so
但这里要保证几点:
①搭建好达梦库的机器操作系统与新机器要一致。
②最后CPU的架构都是一致的,比如X86_64架构。
编译时,就把include包含上,再把libdmdpi.so链接上。就好了。
程序运行时,可能会libdmdpi.so找不到。
需要做如下修改:
vim /etc/ld.so.conf
在最后面添加好libdmdpi.so的路径。即可,如:
/root/DPI
再重新加载下即可:
ldconfig
具体源码可参考如下:
Qt.pro文件:
QT -= gui
CONFIG += c++11 console
CONFIG -= app_bundle
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp
INCLUDEPATH += D:/DM/DM/source/drivers/dpi/include
LIBS += -LD:/DM/DM/source/drivers/dpi -ldmdpi
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
main.cpp
#include <QCoreApplication>
#include <QDebug>
#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"
dhenv henv; /* 环境句柄 */
dhcon hcon; /* 连接句柄 */
dhstmt hstmt; /* 语句句柄 */
dhdesc hdesc; /* 描述符句柄 */
DPIRETURN rt; /* 函数返回值 */
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[])
{
QCoreApplication a(argc, argv);
sdint4 out_c1 = 0;
sdbyte out_c2[20]= { 0 };
slength out_c1_ind = 0;
slength out_c2_ind = 0;
ulength row_num;
//连接数据库
/* 申请环境句柄 */
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_alloc_stmt(hcon, &hstmt);
//select * from CLCC.CLCC_REGION
qDebug() << dpi_exec_direct(hstmt, (sdbyte*) "select * from CLCC.CLCC_REGION");
dpi_bind_col(hstmt, 1, DSQL_C_SLONG, &out_c1, sizeof(out_c1), &out_c1_ind);
dpi_bind_col(hstmt, 2, DSQL_C_NCHAR, &out_c2, sizeof(out_c2), &out_c2_ind);
printf("dpi: select * from table...\n");
while(dpi_fetch(hstmt, &row_num) != DSQL_NO_DATA)
{
printf("c1 = %d, c2 = %s ,\n", out_c1, out_c2);
}
printf("dpi: select 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;
return a.exec();
}
最简单的实例代码已经上来了,源码打包下载如下:
Qt/DPIWindows at master · fengfanchen/Qt · GitHub
剩下的就是大家自己去封装把,这里我封装的代码不能开源。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://it1995.blog.csdn.net/article/details/125756581
内容来源于网络,如有侵权,请联系作者删除!