先来总结一下连接数据库的顺序和步骤。
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);
}