用C语言连接远程Oracle数据库(c 连接远程oracle)

用C语言连接远程Oracle数据库

Oracle是一种流行的关系型数据库管理系统,常用于大型企业级应用中。本文将介绍如何使用C语言连接远程Oracle数据库,并实现数据的增删改查操作。

步骤一:安装Oracle客户端

连接远程Oracle数据库需要Oracle客户端程序的支持。Oracle官方提供了客户端程序的下载链接,下面以Windows系统为例进行安装。

1. 下载Oracle客户端程序,从官网下载与你的操作系统和Oracle数据库版本相对应的客户端程序(http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html)。

2. 解压下载的zip文件,将解压后的目录加入系统环境变量中。

3. 将Oracle客户端程序的DLL文件复制到C语言程序执行目录下,如下图所示。

![image](https://i.imgur.com/3dzevAL.png)

步骤二:连接数据库

C语言连接Oracle数据库需要使用OCI库(Oracle Call Interface),这是Oracle提供的一个C语言访问数据库接口库。在连接数据库之前,需要定义一个句柄类型为OCIEnv,该句柄是OCI库连接Oracle数据库的入口。

以下是连接远程Oracle数据库的代码:

#include 
#include
int mn(void)
{
OCIEnv *pEnv;
OCIError *pErr;
OCISvcCtx *pSvc;
OCISession *pSession;
OCIStmt *pStmt;
sword res;
// 初始化OCI环境
res = OCIEnvCreate(&pEnv, OCI_DEFAULT, 0, 0, 0, 0, 0, 0);
if(res != OCI_SUCCESS)
{
printf("OCIEnvInit fled: %d\n", res);
return res;
}

// 初始化OCI错误句柄
res = OCIHandleAlloc(pEnv, (void **)&pErr, OCI_HTYPE_ERROR, 0, 0);
if(res != OCI_SUCCESS)
{
printf("OCIHandleAlloc OCI_HTYPE_ERROR fled: %d\n", res);
return res;
}

// 初始化OCI服务上下文句柄
res = OCIHandleAlloc(pEnv, (void **)&pSvc, OCI_HTYPE_SVCCTX, 0, 0);
if(res != OCI_SUCCESS)
{
printf("OCIHandleAlloc OCI_HTYPE_SVCCTX fled: %d\n", res);
return res;
}

// 连接数据库
res = OCILogon2(pEnv, pErr, &pSvc, "username", strlen("username"), "password", strlen("password"), "tnsname", strlen("tnsname"), OCI_DEFAULT);
if(res != OCI_SUCCESS)
{
printf("OCILogon2 fled: %d\n", res);
return res;
}

// 结束会话
res = OCILogoff(pSvc, pErr);
if(res != OCI_SUCCESS)
{
printf("OCILogoff fled: %d\n", res);
return res;
}

// 释放内存
OCIHandleFree(pEnv, pErr, OCI_HTYPE_ERROR);
OCIHandleFree(pEnv, pSvc, OCI_HTYPE_SVCCTX);
OCIHandleFree(pEnv, pEnv, OCI_HTYPE_ENV);
return 0;
}

其中,OCILogon2函数用于连接数据库,它接受3个字符串参数,分别表示用户名、密码和TNS名称。TNS名称是在tnsnames.ora文件中配置的,它描述了如何连接到数据库实例。

步骤三:增删改查数据

Oracle数据库使用SQL语言进行数据操作,C程序可以通过OCI库的OCIStmtExecute函数执行SQL语句。下面是一个示例程序,实现一些基本的SQL操作:

#include 
#include
int mn(void)
{
OCIEnv *pEnv;
OCIError *pErr;
OCISvcCtx *pSvc;
OCISession *pSession;
OCIStmt *pStmt;
sword res;
// 初始化OCI环境
res = OCIEnvCreate(&pEnv, OCI_DEFAULT, 0, 0, 0, 0, 0, 0);
if(res != OCI_SUCCESS)
{
printf("OCIEnvInit fled: %d\n", res);
return res;
}

// 初始化OCI错误句柄
res = OCIHandleAlloc(pEnv, (void **)&pErr, OCI_HTYPE_ERROR, 0, 0);
if(res != OCI_SUCCESS)
{
printf("OCIHandleAlloc OCI_HTYPE_ERROR fled: %d\n", res);
return res;
}

// 初始化OCI服务上下文句柄
res = OCIHandleAlloc(pEnv, (void **)&pSvc, OCI_HTYPE_SVCCTX, 0, 0);
if(res != OCI_SUCCESS)
{
printf("OCIHandleAlloc OCI_HTYPE_SVCCTX fled: %d\n", res);
return res;
}

// 连接数据库
res = OCILogon2(pEnv, pErr, &pSvc, "username", strlen("username"), "password", strlen("password"), "tnsname", strlen("tnsname"), OCI_DEFAULT);
if(res != OCI_SUCCESS)
{
printf("OCILogon2 fled: %d\n", res);
return res;
}

// 创建执行SQL语句的句柄
res = OCIHandleAlloc(pEnv, (void **)&pStmt, OCI_HTYPE_STMT, 0, 0);
if(res != OCI_SUCCESS)
{
printf("OCIHandleAlloc OCI_HTYPE_STMT fled: %d\n", res);
return res;
}

// 插入数据
res = OCIStmtPrepare(pStmt, pErr, "insert into students values(1, 'Tom', 'male', 20)", strlen("insert into students values(1, 'Tom', 'male', 20)"), OCI_NTV_SYNTAX, OCI_DEFAULT);
if(res != OCI_SUCCESS)
{
printf("OCIStmtPrepare insert fled: %d\n", res);
return res;
}
res = OCIStmtExecute(pSvc, pStmt, pErr, 1, 0, NULL, NULL, OCI_DEFAULT);
if(res != OCI_SUCCESS)
{
printf("OCIStmtExecute insert fled: %d\n", res);
return res;
}

// 查询数据
res = OCIStmtPrepare(pStmt, pErr, "select * from students", strlen("select * from students"), OCI_NTV_SYNTAX, OCI_DEFAULT);
if(res != OCI_SUCCESS)
{
printf("OCIStmtPrepare select fled: %d\n", res);
return res;
}
res = OCIStmtExecute(pSvc, pStmt, pErr, 0, 0, NULL, NULL, OCI_DEFAULT);
if(res != OCI_SUCCESS)
{
printf("OCIStmtExecute select fled: %d\n", res);
return res;
}

// 处理查询结果
OCIParam *pParam;
OCIDefine *pDefine;
int id;
char name[20];
char gender[10];
int age;
while(OCIStmtFetch(pStmt, pErr, 1, OCI_FETCH_NEXT, OCI_DEFAULT) != OCI_NO_DATA)
{
res = OCIParamGet(pStmt, OCI_HTYPE_STMT, pErr, (void **)&pParam, OCI_ATTR_PARAM_COUNT);
if(res != OCI_SUCCESS)
{
printf("OCIParamGet fled: %d\n", res);
return res;
}
res = OCIParamGet(pParam, OCI_DTYPE_PARAM, pErr, (void **)&pParam, 1);
if(res != OCI_SUCCESS)
{
printf("OCIParamGet fled: %d\n", res);
return res;
}

res = OCIDefineByPos(pStmt, &pDefine, pErr, 1, &id, sizeof(id), SQLT_INT, NULL, NULL, NULL, OCI_DEFAULT);
if(res != OCI_SUCCESS)
{
printf("OCIDefineByPos id fled: %d\n", res);
return res;
}
res = OCIDefineByPos(pStmt, &pDefine, pErr, 2, name, sizeof(name), SQLT_STR, NULL, NULL, NULL, OCI_DEFAULT);
if(res != OCI_SUCCESS)
{
printf("OCIDefineByPos name fled: %d\n", res);
return res;
}
res = OCIDefineByPos(pStmt, &pDefine, pErr, 3, gender, sizeof(gender), SQLT_STR, NULL, NULL, NULL, OCI_DEFAULT);
if(res != OCI_SUCCESS)
{
printf("OCIDefineByPos gender fled: %d\n", res);
return res;
}
res = OCIDefineByPos(pStmt, &pDefine, p

数据运维技术 » 用C语言连接远程Oracle数据库(c 连接远程oracle)