远程访问Oracle数据库用C语言实现(c 远程访问oracle)
远程访问Oracle数据库——用C语言实现
随着互联网技术的迅猛发展,越来越多的应用需要访问远程数据库,而Oracle数据库是目前应用最广泛的关系型数据库之一。本文将介绍如何使用C语言实现远程访问Oracle数据库。
1. 准备工作
首先需要安装Oracle客户端软件,可以从Oracle官网下载。安装完成后,需要设置环境变量:
“`bash
export ORACLE_HOME=/usr/lib/oracle/11.2/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
其中,ORACLE_HOME是Oracle客户端软件的安装路径,LD_LIBRARY_PATH是动态库链接路径(若不设置,会报错“error while loading shared libraries: libclntsh.so.11.1”)。
2. 编写代码
我们使用oci(Oracle Call Interface)库来访问Oracle数据库。oci是Oracle提供的C语言接口库,可以使应用程序直接访问Oracle数据库。下面是一个示例代码:
```c#include
#include
#include
int mn() { OCIEnv *envhp; // 环境变量句柄
OCIError *errhp; // 错误句柄 OCISvcCtx *svchp; // 服务上下文句柄
OCISession *authp; // 会话句柄 OCIStmt *stmthp; // 语句句柄
int sts; // 初始化OCI环境
OCIInitialize((ub4) OCI_DEFAULT, (dvoid *) 0, (dvoid * (*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t)) 0, (void (*)(dvoid *, dvoid *)) 0 );
// 创建OCI环境句柄 OCIEnvInit(&envhp, OCI_DEFAULT, 0, 0);
// 创建错误句柄 OCIHandleAlloc((dvoid *)envhp, (dvoid **)&errhp,
OCI_HTYPE_ERROR, (size_t)0, (dvoid**)0); // 创建服务上下文句柄
OCIHandleAlloc((dvoid *)envhp, (dvoid **)&svchp, OCI_HTYPE_SVCCTX, (size_t)0, (dvoid**)0);
// 连接数据库 sts = OCILogon(envhp, errhp, &svchp,
(OraText *)"username", strlen("username"), (OraText *)"password", strlen("password"),
(OraText *)"database", strlen("database")); if (sts != OCI_SUCCESS) {
OCIErrorGet((dvoid *)errhp, (ub4)1, (OraText *)0, &sts, (OraText *)0, (ub4) 0, (ub4 *)0);
printf("OCILogon fled with error %d\n", sts); exit(1);
} // 分配会话句柄
OCIHandleAlloc((dvoid *)envhp, (dvoid **)&authp, OCI_HTYPE_SESSION, (size_t)0, (dvoid**)0);
// 设置会话属性 OCIAttrSet((dvoid *)authp, (ub4)OCI_HTYPE_SESSION,
(dvoid *)"username", (ub4)strlen("username"), OCI_ATTR_USERNAME, errhp);
OCIAttrSet((dvoid *)authp, (ub4)OCI_HTYPE_SESSION, (dvoid *)"password", (ub4)strlen("password"),
OCI_ATTR_PASSWORD, errhp); // 开始会话
sts = OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT);
if (sts != OCI_SUCCESS) { OCIErrorGet((dvoid *)errhp, (ub4)1, (OraText *)0,
&sts, (OraText *)0, (ub4) 0, (ub4 *)0); printf("OCISessionBegin fled with error %d\n", sts);
exit(1); }
// 设置服务属性 OCIAttrSet((dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX,
(dvoid *)authp, (ub4)0, OCI_ATTR_SESSION, errhp); // 分配语句句柄
OCIHandleAlloc((dvoid *)envhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);
// 执行查询语句 OCIStmtPrepare(stmthp, errhp, (OraText *) "SELECT * FROM table",
(ub4) strlen("SELECT * FROM table"), OCI_NTV_SYNTAX, OCI_DEFAULT);
sts = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (OCISnapshot *)0, (OCISnapshot *)0, OCI_DEFAULT);
if (sts != OCI_SUCCESS) { OCIErrorGet((dvoid *)errhp, (ub4)1, (OraText *)0,
&sts, (OraText *)0, (ub4) 0, (ub4 *)0); printf("OCIStmtExecute fled with error %d\n", sts);
exit(1); }
// 获取结果集 OCIDefine *defnp;
int id, val; OCIStmtFetch(stmthp, errhp, (ub4)1, OCI_FETCH_NEXT, OCI_DEFAULT);
OCIDefineByPos(stmthp, &defnp, errhp, 1, (dvoid *)&id, sizeof(id), SQLT_INT, (dvoid *)0,
(ub2 *)0, (ub2 *)0, OCI_DEFAULT); OCIDefineByPos(stmthp, &defnp, errhp, 2,
(dvoid *)&val, sizeof(val), SQLT_INT, (dvoid *)0, (ub2 *)0, (ub2 *)0, OCI_DEFAULT);
printf("%d %d\n", id, val); // 释放资源
OCIStmtRelease(stmthp, errhp, (OraText *)0, (ub4)0, OCI_DEFAULT);
OCISessionEnd(svchp, errhp, authp, OCI_DEFAULT); OCIHandleFree((dvoid *)authp, OCI_HTYPE_SESSION);
OCIHandleFree((dvoid *)svchp, OCI_HTYPE_SVCCTX); OCIHandleFree((dvoid *)envhp, OCI_HTYPE_ENV);
OCITerminate(OCI_DEFAULT); return 0;
}
代码解释:
· OCIEnv、OCISvcCtx、OCISession、OCIStmt是oci中的四个重要的句柄。
· OCIInitialize:初始化OCI环境。
· OCIEnvInit:创建OCI环境句柄。
· OCIHandleAlloc:创建错误、服务上下文、会话和语句等句柄。
· OCILogon:连接数据库。
· OCIAttrSet:设置句柄属性。
· OCISessionBegin:开始会话。
· OCIStmtPrepare:准备SQL语句。
· OCIStmtExecute:执行查询。
· OCIDefineByPos:设置结果集。
· OCIStmtFetch:获取结果集。
· OCIStmtRelease、OCISessionEnd、OCIHandleFree:释放资源。
3. 编译运行
将以上代码保存为oracle.c,使用gcc编译链接:
“`bash
gcc -o oracle -I/usr/include/oracle/11.2/client64 -L/usr/lib/oracle/11.2/client64/lib -lclntsh oracle.c
其中,-I指定Oracle头文件路径,-L指定Oracle库路径,-lclntsh指定链接的库。编译成功后,就可以运行了:
```bash./oracle
输出查询结果。
总结
以上就是使用C语言实现远程访问Oracle数据库的全部过程。需要注意的是,Oracle客户端软件的安装和配置是关键步骤,必须正确设置环境变量才能正常运行。此外,OCI接口使用稍微有些复杂,需要仔细研究文档。