OCI程序在结束前需要先断开与数据库的连接,这个过程是程序开头连接到数据库的逆操作,也分为几个步骤。
1. 结束用户会话,用到函数OCISessionEnd()。
2. 断开服务器句柄与Oracle数据库的通信路径,用到函数OCIServerDetach()。
3. 释放用户会话句柄,用到函数OCIHandleFree()。后面所有释放句柄的操作都用到这个函数。
4. 释放服务器句柄。
5. 释放服务上下文句柄。
6. 释放错误句柄。
7. 释放OCI环境句柄。
下面分别看一下这些函数的原型和参数。
第一个是结束会话函数OCISessionEnd()。
sword OCISessionEnd ( OCISvcCtx *svchp,
OCIError *errhp,
OCISession *usrhp,
ub4 mode );
svchp是一个输入/输出参数,是包含用户会话句柄的服务上下文句柄。
errhp是一个输入/输出参数,错误句柄,用于返回出错码和出错信息文本。
usrhp是一个输入参数,用户会话句柄,用于解除数据库用户认证。
mode是一个输入参数,解除认证模式,只能是OCI_DEFAULT模式。
第二个是断开服务器通信路径函数OCIServerDetach()。
sword OCIServerDetach ( OCIServer *srvhp,
OCIError *errhp,
ub4 mode );
srvhp是一个输入参数,是连接数据库时创建的服务器句柄。
errhp是一个输入/输出参数,错误句柄,用于返回出错码和出错信息文本。
mode是一个输入参数,指定操作模式,只能是OCI_DEFAULT模式。
第三个是释放句柄函数OCIHandleFree()。
sword OCIHandleFree ( void *hndlp, ub4 type );
hndlp是一个输入参数,是用OCIHandleAlloc()函数分配的句柄。
type是一个输入参数,指定句柄类型。句柄分配时用什么类型,释放时就是什么类型。
下面展示一个断开数据库连接的真实示例,看看这些函数都是怎样调用的。
OCIEnv *envhp = NULL; /* OCI环境句柄 */
OCIError *errhp = NULL; /* 错误句柄 */
OCIServer *svrhp = NULL; /* 服务器句柄 */
OCISession *usrhp = NULL; /* 用户会话句柄 */
OCISvcCtx *svchp = NULL; /* 服务上下文句柄 */
int disconnect_oracle(void)
{
sword rc;
sb4 ec;
char errbuf[512];
rc = OCISessionEnd(
svchp,
errhp,
usrhp,
OCI_DEFAULT
);
if (rc != OCI_SUCCESS) {
OCIErrorGet(errhp, 1, NULL, &ec, errbuf, 512, OCI_HTYPE_ERROR);
fprintf(stderr, "OCISessionEnd() - [%d] %s\n", ec, errbuf);
return (-1);
}
rc = OCIServerDetach(
svrhp,
errhp,
OCI_DEFAULT
);
if (rc != OCI_SUCCESS) {
OCIErrorGet(errhp, 1, NULL, &ec, errbuf, 512, OCI_HTYPE_ERROR);
fprintf(stderr, "OCIServerDetach() - [%d] %s\n", ec, errbuf);
return (-1);
}
rc = OCIHandleFree(
usrhp,
OCI_HTYPE_SESSION
);
if (rc != OCI_SUCCESS) {
fprintf(stderr, "OCIHandeFree() - free session handle error !\n");
return (-1);
}
rc = OCIHandleFree(
svrhp,
OCI_HTYPE_SERVER
);
if (rc != OCI_SUCCESS) {
fprintf(stderr, "OCIHandleFree() - free server handle error !\n");
return (-1);
}
rc = OCIHandleFree(
svchp,
OCI_HTYPE_SVCCTX
);
if (rc != OCI_SUCCESS) {
fprintf(stderr, "OCIHandleFree() - free service context handle error !\n");
return (-1);
}
rc = OCIHandleFree(
errhp,
OCI_HTYPE_ERROR
);
if (rc != OCI_SUCCESS) {
fprintf(stderr, "OCIHandleFree() - free error handle error !\n");
return (-1);
}
rc = OCIHandleFree(
envhp,
OCI_HTYPE_ENV
);
if (rc != OCI_SUCCESS) {
fprintf(stderr, "OCIHandleFree() - free env handle error !\n");
return (-1);
}
return (0);
}