C语言实现数据插入Oracle数据库(c 数据插入oracle)
C语言实现数据插入Oracle数据库
Oracle是一种流行的关系型数据库管理系统,支持多用户、高可靠性和数据完整性。而C语言是一种强大的系统级编程语言,常被用于开发操作系统和系统软件。本文将介绍如何使用C语言实现数据插入Oracle数据库的功能。
1. 安装Oracle数据库和OCI库
在开始编写代码前,需要安装Oracle数据库和OCI库。OCI库是Oracle提供的C语言库,用于在C程序中访问Oracle数据库。安装Oracle数据库和OCI库的步骤可参考Oracle官方文档。
2. 创建数据库连接
在C程序中,需要先创建一个数据库连接,才能对数据库进行操作。下面是一个用于连接Oracle数据库的示例代码:
“`c
#include
#include
int mn() {
OCIEnv* envhp;
OCIError* errhp;
OCIServer* srvhp;
OCISvcCtx* svchp;
OCISession* sesionhp;
sword status;
// 初始化OCI环境
OCIEnvCreate(&envhp, OCI_DEFAULT, (void*) 0, (void* (*)(void*, size_t)) 0,
(void* (*)(void*, void*, size_t)) 0, (void (*)(void*, void*)) 0, 0,
(void**) 0);
// 分配错误句柄
OCIHandleAlloc((void*) envhp, (void**) &errhp, OCI_HTYPE_ERROR, 0, (void**) 0);
// 分配服务器句柄
OCIHandleAlloc((void*) envhp, (void**) &srvhp, OCI_HTYPE_SERVER, 0, (void**) 0);
// 创建服务器上下文
status = OCIServerAttach(srvhp, errhp, (text*) “localhost:1521/ORCL”, strlen(“localhost:1521/ORCL”), OCI_DEFAULT);
// 分配服务上下文句柄
OCIHandleAlloc((void*) envhp, (void**) &svchp, OCI_HTYPE_SVCCTX, 0, (void**) 0);
// 设置服务上下文服务器句柄
OCIAttrSet((void*) svchp, OCI_HTYPE_SVCCTX, (void*) srvhp, 0, OCI_ATTR_SERVER, errhp);
// 分配会话句柄
OCIHandleAlloc((void*) envhp, (void**) &sessionhp, OCI_HTYPE_SESSION, 0, (void**) 0);
// 设置会话上下文服务器和服务上下文
OCIAttrSet((void*) sessionhp, OCI_HTYPE_SESSION, (void*) svchp, 0, OCI_ATTR_SVCCTX, errhp);
// 确定用户名和密码,然后开始会话
OCIAttrSet((void*) sessionhp, OCI_HTYPE_SESSION, (void*) “username”, strlen(“username”), OCI_ATTR_USERNAME, errhp);
OCIAttrSet((void*) sessionhp, OCI_HTYPE_SESSION, (void*) “password”, strlen(“password”), OCI_ATTR_PASSWORD, errhp);
OCIHandleAlloc((void*) envhp, (void**) &sessionhp, OCI_HTYPE_SESSION, 0, (void**) 0);
OCISessionBegin(svchp, errhp, sessionhp, OCI_CRED_RDBMS, OCI_DEFAULT);
OCIAttrSet((void*) svchp, OCI_HTYPE_SVCCTX, (void*) sessionhp, 0, OCI_ATTR_SESSION, errhp);
// … 以下省略其他代码 …
return 0;
}
上述代码中,首先通过OCIEnvCreate函数来初始化OCI环境。然后使用OCIHandleAlloc函数分别分配错误句柄、服务器句柄、服务上下文句柄和会话句柄。接着通过OCIServerAttach函数连接到Oracle数据库。然后再使用OCIAttrSet函数设置服务上下文服务器句柄、会话上下文服务器和服务上下文,最终通过OCISessionBegin函数开始会话。
3. 插入数据
创建数据库连接后,就可以向Oracle数据库中插入数据了。下面是一个用于向Oracle数据库中插入数据的示例代码:
```c#include
#include
int mn() { OCIEnv* envhp;
OCIError* errhp; OCIServer* srvhp;
OCISvcCtx* svchp; OCISession* sesionhp;
sword status;
// ... 以上省略初始化OCI环境和创建数据库连接的代码 ...
// 分配语句句柄 OCIStmt* stmthp;
OCIHandleAlloc((void*) envhp, (void**) &stmthp, OCI_HTYPE_STMT, 0, (void**) 0); // 准备插入语句
char* sql = "INSERT INTO TABLE_NAME (COLUMN1, COLUMN2, COLUMN3) VALUES (:1, :2, :3)"; OCIStmtPrepare(stmthp, errhp, (text*) sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
// 绑定参数 int id = 1;
char* name = "张三"; int age = 25;
OCIParam* paramhp; OCIStmtGetPieceInfo(stmthp, errhp, ¶mhp, NULL, OCI_PARAM_INOUT, OCI_DEFAULT);
OCIDefineByPos(stmthp, ¶mhp, errhp, 1, (void*) &id, sizeof(int), SQLT_INT, NULL, NULL, NULL, OCI_DEFAULT); OCIStmtGetPieceInfo(stmthp, errhp, ¶mhp, NULL, OCI_PARAM_INOUT, OCI_DEFAULT);
OCIDefineByPos(stmthp, ¶mhp, errhp, 2, (void*) name, strlen(name), SQLT_STR, NULL, NULL, NULL, OCI_DEFAULT); OCIStmtGetPieceInfo(stmthp, errhp, ¶mhp, NULL, OCI_PARAM_INOUT, OCI_DEFAULT);
OCIDefineByPos(stmthp, ¶mhp, errhp, 3, (void*) &age, sizeof(int), SQLT_INT, NULL, NULL, NULL, OCI_DEFAULT); // 执行语句
OCIStmtExecute(svchp, stmthp, errhp, 1, 0, NULL, NULL, OCI_COMMIT_ON_SUCCESS); // 释放语句句柄
OCIHandleFree(stmthp, OCI_HTYPE_STMT);
// ... 以下省略其他代码 ...
return 0;}
上述代码中,首先使用OCIHandleAlloc函数分配了一个语句句柄。然后通过OCIStmtPrepare函数准备了一个插入语句。接着使用OCIDefineByPos函数将要插入的数据绑定到语句中的参数上。最后使用OCIStmtExecute函数执行插入语句。
4. 关闭数据库连接
使用完数据库后,需要关闭数据库连接以释放资源。下面是一个用于关闭Oracle数据库连接的示例代码:
“`c
#include
#include
int mn() {
OCIEnv* envhp;
OCIError* errhp;
OCIServer* srvhp;
OCISvcCtx* svchp;
OCISession* sesionhp;
sword status;
// … 以上省略初始化OCI环境和创建数据库连接的代码 …
// 断开会话
OCISessionEnd(svchp, errhp, sesionhp, OCI_DEFAULT);
// 释放会话句柄
OCIHandleFree(sesionhp, OCI_HTYPE_SESSION);
// 分配语句句柄
OCIHandleFree((void*) envhp, OCI_HTYPE_STMT);
// 断开服务器连接
OCIServerDetach(srvhp, errhp, OCI_DEFAULT);
// 释放服务器句柄
OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
// 释放服务上下文句柄
OCIHandleFree(svchp, OCI_HTYPE_SVCCTX);
// 释放错误句柄
OCIHandleFree(errhp, OCI_HTYPE_ERROR);
// 释放OCI环境
OCIHandleFree(envhp, OCI_HTYPE_ENV);
return 0;
}
上述代码中,首先使用OCISessionEnd函数断开会话。然后使用OCIHandleFree函数分别释放会话句柄、语句句柄、服务器句柄、服务上下文句柄和错误句柄。最后使用OCIHandleFree函数释放OCI环境。
总结
本文介绍