用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