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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值