DCI支持通过服务名连接数据库解决了金仓数据库KingbaseES应用可实现通过服务名连接问题
关键字
DCI、服务名、数据库
问题描述
应用可以通过DCI通过服务名连接数据库。
问题分析
应用端缺少DCI接口支持通过服务名连接数据库的功能。
解决方案
在使用DCI操作Kes数据库时,可支持通过服务名连接数据库功能。 服务名对应配置文件形式如下:
sys_service.conf配置文件服务名对应主机、端口号等相关信息,中括号内容为服务名。
操作的示例代码:
sword test_some_connect1() {
sword ret = OCI_SUCCESS;
#define N_MAX 50
/*
int a = 0x12345678;
printf("a = %d\n", a);
printf("a = %#x\n", a);
int b = htonl(a);
printf("a = %#x\n", a);
return 0;*/
//OCIEnv *pEnv = NULL;
OCISvcCtx *pArray[N_MAX];
OCIEnvCreate((OCIEnv **)&pEnv, (ub4)OCI_DEFAULT,
(dvoid *)0, (dvoid * (*)(dvoid *, size_t))0,
(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *))0, (size_t)0, (dvoid **)0);
for (int i = 0; i < N_MAX; i++) {
OCISvcCtx *pTmp = NULL;
ret = OCIHandleAlloc((dvoid *)pEnv, (dvoid **)&pError, OCI_HTYPE_ERROR, 0, (dvoid **)0);
if (ret != OCI_SUCCESS) {
printf("OCIHandleAlloc failed : %d\n", i);
goto end;
} else {
printf("OCIHandleAlloc success : %d\n", i);
}
ret = OCILogon(pEnv, pError, &pTmp,
(const OraText *)"system", (ub4)strlen("system"),
(const OraText *)"123456", (ub4)strlen("123456"),
(const OraText *)"KingbaseES", (ub4)strlen("KingbaseES"));
if (ret != OCI_SUCCESS) {
printf("OCILogon failed : %d\n", i);
goto end;
} else {
printf("OCILogon success : %d\n", i);
}
pArray[i] = pTmp;
}
for (int i = 0; i < N_MAX; i++) {
ret = OCILogoff(pArray[i], pError);
if (ret != OCI_SUCCESS) {
printf("OCILogoff failed :%d\n", i);
} else {
printf("OCILogoff success : %d\n", i);
}
ret = OCIHandleFree((dvoid *)pArray[i], OCI_HTYPE_SVCCTX);
if (ret != OCI_SUCCESS) {
printf("OCIHandleFree failed :%d\n", i);
} else {
printf("OCIHandleFree success : %d\n", i);
}
}
end :
return ret;
}
服务名称是KingbaseES,KingbaseES对应sys_service.conf配置文件中的内容,服务名可映射到数据库的实际IP地址、端口号等连接数据库的必要信息。
这个示例展示了如何使用DCI通过服务名连数据库的功能,您可以根据自己的需求进行适当的调整和扩展。