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); }
学习Oracle高级知识,编写高质量代码,尽在www.tomcoding.com

浙公网安备 33010602011771号