使用OCI连接数据库
获取OCI连接
在使用OCIEnvCreate接口(或者OCIEnvInit,OCIInitialize)分配环境句柄,以及OCIHandleAlloc接口分配错误句柄后,获取OCI数据库连接用OCILogon接口。如果使用OCIInitilize接口创建环境,则需要搭配OCITerminate接口使用来结束程序。
OCIEnv *envhp; // 环境句柄
OCIServer *srvhp; // 服务句柄
OCIError *errhp; // 错误句柄
OCISvcCtx *svchp; //服务上下文句柄
/* 1.分配环境和错误句柄 */
if(OCIEnvCreate((OCIEnv **) &envhp, (ub4) OCI_DEFAULT,
(dvoid *) 0, (dvoid * (*)(dvoid *,size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t)) 0,
(void (*)(dvoid *, dvoid *)) 0, (size_t) 0, (dvoid **) 0))
{
printf("FAILED: OCIEnvCreate()\n");
return OCI_ERROR;
}
If(OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &errhp, (ub4) OCI_HTYPE_ERROR,
(size_t)0, (dvoid **) 0))
{
printf("FAILED: OCIHandleAlloc()\n");
return OCI_ERROR;
}
/* 2.建立连接并创建简单会话*/
if(OCILogon(envhp, errhp, &svchp, username, strlen (username),
password, strlen (password), "", 0))
{
printf("FAILED: OCILogon()\n");
return OCI_ERROR;
}
关闭OCI连接
关闭连接时调用OCILogoff()函数关闭数据库连接,程序结束前调用OCIHandleFree释放分配的句柄:
if(OCILogoff(svchp, errhp))
{
printf("FAILED: OCILogoff()\n");
return OCI_ERROR;
}
if(svchp)
OCIHandleFree((dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX);
if(errhp)
OCIHandleFree((dvoid *)errhp, (ub4)OCI_HTYPE_ERROR);
if(envhp)
OCIHandleFree((dvoid *)envhp, (ub4)OCI_HTYPE_ENV);