0
点赞
收藏
分享

微信扫一扫

OCI编程基础篇(六) 断开数据库连接

 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);
}

举报

相关推荐

0 条评论