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

访问www.tomcoding.com网站,学习Oracle内部数据结构,详细文档说明,下载Oracle的exp/imp,DUL,logminer,ASM工具的源代码,学习高技术含量的内容。

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

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);
}
posted @ 2025-08-13 20:57  汤姆花花  阅读(24)  评论(0)    收藏  举报