OCI编程基础篇(四) 连接数据库的示例代码

先来总结一下连接数据库的顺序和步骤。

1. 创建OCI环境句柄,OCIEnvCreate()。

2. 分配错误句柄,OCIHandleAlloc()。

3. 分配服务器句柄,OCIHandleAlloc()。

4. 建立与数据库服务器的通信路径,OCIServerAttach()。

5. 分配服务上下文句柄,OCIHandleAlloc()。

6. 把服务器句柄放入服务上下文句柄中,OCIAttrSet()。

7. 分配用户会话句柄,OCIHandleAlloc()。

8. 设置用户会话句柄的用户和密码属性,OCIAttrSet()。

9. 开启一个用户会话,OCISessionBegin()。

10. 把用户会话句柄放入服务上下文句柄中,OCIAttrSet()。

实际的代码示例

/* 定义全局变量 */
OCIEnv          *envhp = NULL;          /* 环境句柄指针 */
OCIError        *errhp = NULL;          /* 错误句柄指针 */
OCIServer       *svrhp = NULL;          /* 服务器句柄指针 */
OCISession      *usrhp = NULL;          /* 用户会话句柄指针 */
OCISvcCtx       *svchp = NULL;          /* 服务上下文句柄指针 */

/*
 * Oralce数据库ip地址为192.168.10.110,端口为1521,服务名为orcl
 * 数据库用户名为scott,密码为tigger
 * 以上面的信息为例,连接到数据库
 */
int connect_oracle(void)
{
    sword       rc;
    char        user[32];
    char        passwd[32];
    char        dblink[256];

    /* 创建环境句柄 */
    rc = OCIEnvCreate(
        &envhp,
        OCI_DEFAULT,
        (void *)NULL,
        NULL,
        NULL,
        NULL,
        (size_t)0,
        (void **)NULL
    );

    if (rc != OCI_SUCCESS) {
        fprintf(stderr, "OCIEnvCreate() - allocate OCI env handle error !\n");
        return (-1);
    }

    /* 分配错误句柄 */
    rc = OCIHandleAlloc(
        (void *)envhp,
        (void **)&errhp,
        OCI_HTYPE_ERROR,
        0,
        (void **)NULL
    );

    if (rc != OCI_SUCCESS) {
        fprintf(stderr, "OCIHandleAlloc() - allocate OCI error handle error !\n");
        return (-1);
    }

    /* 分配服务器句柄 */
    rc = OCIHandleAlloc(
        (void *)envhp,
        (void **)&svrhp,
        OCI_HTYPE_SERVER,
        0,
        (void **)NULL
    );

    if (rc != OCI_SUCCESS) {
        fprintf(stderr, "OCIHandleAlloc() - allocate server handle error !\n");
        return (-1);
    }

    strcpy(dblink, "//192.168.10.110:1521/orcl");

    /* 建立到Oracle数据库的通信路径 */
    rc = OCIServerAttach(
        svrhp,
        errhp,
        (const OraText *)dblink,
        strlen(dblink),
        OCI_DEFAULT
    );

    if (rc != OCI_SUCCESS) {
        fprintf(stderr, "OCIServerAttach() - establish an access path error !\n");
        return (-1);
    }

    /* 分配服务上下文句柄 */
    rc = OCIHandleAlloc(
        (void *)envhp,
        (void **)&svchp,
        OCI_HTYPE_SVCCTX,
        0,
        (void **)NULL
    );

    if (rc != OCI_SUCCESS) {
        fprintf(stderr, "OCIHandleAlloc() - allocate service context error !\n");
        return (-1);
    }

    /* 把服务器句柄放入服务上下文句柄的属性中 */
    rc = OCIAttrSet(
        (void *)svchp,
        OCI_HTYPE_SVCCTX,
        (void *)svrhp,
        0,
        OCI_ATTR_SERVER,
        errhp
    );

    if (rc != OCI_SUCCESS) {
        fprintf(stderr, "Set server attribute error !\n");
        return (-1);
    }

    /* 分配用户会话句柄 */
    rc = OCIHandleAlloc(
        (void *)envhp,
        (void **)&usrhp,
        OCI_HTYPE_SESSION,
        0,
        (void **)NULL
    );

    if (rc != OCI_SUCCESS) {
        fprintf(stderr, "OCIHandleAlloc() - allocate session handle error !\n");
        return (-1);
    }

    strcpy(user, "scott");

    /* 设置认证用户属性 */
    rc = OCIAttrSet(
        (void *)usrhp,
        OCI_HTYPE_SESSION,
        (void *)user,
        strlen(user),
        OCI_ATTR_USERNAME,
        errhp
    );

    if (rc != OCI_SUCCESS) {
        fprintf(stderr, "Set user attribute error !\n");
        return (-1);
    }

    strcpy(passwd, "tigger");

    /* 设置认证密码属性 */
    rc = OCIAttrSet(
        (void *)usrhp,
        OCI_HTYPE_SESSION,
        (void *)passwd,
        strlen(passwd),
        OCI_ATTR_PASSWORD,
        errhp
    );

    if (rc != OCI_SUCCESS) {
        fprintf(stderr, "Set password attribute error !\n");
        return (-1);
    }

    /* 开启一个用户会话 */
    rc = OCISessionBegin(
        svchp,
        errhp,
        usrhp,
        OCI_CRED_RDBMS,
        OCI_DEFAULT
    );

    if (rc != OCI_SUCCESS) {
        fprintf(stderr, "OCISessionBegin() - establish user session error !\n");
        return (-1);
    }

    /* 把用户会话句柄放入服务上下文句柄属性中 */
    rc = OCIAttrSet(
        (void *)svchp,
        OCI_HTYPE_SVCCTX,
        (void *)usrhp,
        0,
        OCI_ATTR_SESSION,
        errhp
    );

    if (rc != OCI_SUCCESS) {
        fprintf(stderr, "Set user session attribute error !\n");
        return (-1);
    }

    return (0);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值