C结合Oracle数据库实现案例(c# oracle 例子)

C结合Oracle数据库实现案例

C语言是一门功能强大的编程语言,可以用来编写各种类型的应用程序,包括与数据库交互的应用程序。本篇文章将介绍如何在C语言中使用Oracle数据库,并实现一个简单的案例。

1. 准备工作

在开始之前,需要安装以下软件:

– Oracle Instant Client:关于如何安装Oracle Instant Client,可以参考官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/19/lnoci/index.html

– Oracle OCI库:OCI(Oracle Call Interface)是一个C语言库,用于与Oracle数据库交互。OCI库的使用需要链接oci.h以及oci.lib。

2. 连接到Oracle数据库

需要创建一个OCI环境,然后使用OCI库中的OCI函数OCIInitialize()来初始化这个环境。示例代码如下:

#include 
#include
#include
int mn(int argc, char *argv[]) {

OCIEnv *p_env;
OCIError *p_err;
if (OCIInitialize(OCI_DEFAULT, NULL, NULL, NULL, NULL) != OCI_SUCCESS) {
printf("OCIInitialize fled\n");
return 1;
}
if (OCIEnvCreate(&p_env, OCI_THREADED | OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL) != OCI_SUCCESS) {
printf("OCIEnvCreate fled\n");
return 1;
}
if (OCIHandleAlloc(p_env, (void**)&p_err, OCI_HTYPE_ERROR, 0, NULL) != OCI_SUCCESS) {
printf("OCIHandleAlloc fled\n");
OCIHandleFree(p_env, p_err, OCI_HTYPE_ERROR);
OCIHandleFree(p_env, p_env, OCI_HTYPE_ENV);
return 1;
}
OCIHandleFree(p_env, p_err, OCI_HTYPE_ERROR);
OCIHandleFree(p_env, p_env, OCI_HTYPE_ENV);
return 0;
}

在以上代码中,我们首先进行了OCIInitialize()的初始化,然后使用OCIEnvCreate()创建了一个OCI环境,并使用OCIHandleAlloc()分配了一个错误句柄。使用OCIHandleFree()释放掉这些句柄。

3. 数据库查询

接下来我们将介绍如何使用OCI函数来实现数据库查询操作。在本示例中,我们将查询一个学生表格,并将结果打印出来。

我们首先需要连接到数据库,连接的详细信息包括用户名、密码、服务器地址以及服务名称等。在此,我们假定连接的用户名为system,密码为oracle,服务器地址为localhost,服务名称为orcl。

#include 
#include
#include
#include
int mn(int argc, char *argv[]) {

OCIEnv *p_env;
OCIError *p_err;
OCISvcCtx *p_svc;
OCIServer *p_server;
OCISession *p_session;
OCIDefine *p_def;

const char *p_username = "system";
const char *p_password = "oracle";
const char *p_server_name = "localhost/orcl";
char sql[1024];
sprintf(sql, "SELECT * FROM students");
// 初始化OCI环境
if (OCIInitialize(OCI_DEFAULT, NULL, NULL, NULL, NULL) != OCI_SUCCESS) {
printf("OCIInitialize fled\n");
return 1;
}

// 创建OCI环境
if (OCIEnvCreate(&p_env, OCI_THREADED | OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL) != OCI_SUCCESS) {
printf("OCIEnvCreate fled\n");
return 1;
}

// 分配错误句柄
if (OCIHandleAlloc(p_env, (void**)&p_err, OCI_HTYPE_ERROR, 0, NULL) != OCI_SUCCESS) {
printf("OCIHandleAlloc fled\n");
OCIHandleFree(p_env, p_err, OCI_HTYPE_ERROR);
OCIHandleFree(p_env, p_env, OCI_HTYPE_ENV);
return 1;
}

// 分配服务器句柄
if (OCIHandleAlloc(p_env, (void**)&p_server, OCI_HTYPE_SERVER, 0, NULL) != OCI_SUCCESS) {
printf("OCIHandleAlloc fled\n");
OCIHandleFree(p_env, p_err, OCI_HTYPE_ERROR);
OCIHandleFree(p_env, p_env, OCI_HTYPE_ENV);
return 1;
}

// 创建服务器
if (OCIServerAttach(p_server, p_err, (text*)p_server_name, strlen(p_server_name), OCI_DEFAULT) != OCI_SUCCESS) {
printf("OCIServerAttach fled\n");
OCIHandleFree(p_env, p_server, OCI_HTYPE_SERVER);
OCIHandleFree(p_env, p_err, OCI_HTYPE_ERROR);
OCIHandleFree(p_env, p_env, OCI_HTYPE_ENV);
return 1;
}
// 分配服务上下文句柄
if (OCIHandleAlloc(p_env, (void**)&p_svc, OCI_HTYPE_SVCCTX, 0, NULL) != OCI_SUCCESS) {
printf("OCIHandleAlloc fled\n");
OCIHandleFree(p_env, p_server, OCI_HTYPE_SERVER);
OCIHandleFree(p_env, p_err, OCI_HTYPE_ERROR);
OCIHandleFree(p_env, p_env, OCI_HTYPE_ENV);
return 1;
}
// 设置服务上下文句柄的服务器
if (OCIAttrSet(p_svc, OCI_HTYPE_SVCCTX, p_server, 0, OCI_ATTR_SERVER, p_err) != OCI_SUCCESS) {
printf("OCIAttrSet fled\n");
OCIServerDetach(p_server, p_err, OCI_DEFAULT);
OCIHandleFree(p_env, p_svc, OCI_HTYPE_SVCCTX);
OCIHandleFree(p_env, p_server, OCI_HTYPE_SERVER);
OCIHandleFree(p_env, p_err, OCI_HTYPE_ERROR);
OCIHandleFree(p_env, p_env, OCI_HTYPE_ENV);
return 1;
}
// 分配会话句柄
if (OCIHandleAlloc(p_env, (void**)&p_session, OCI_HTYPE_SESSION, 0, NULL) != OCI_SUCCESS) {
printf("OCIHandleAlloc fled\n");
OCIServerDetach(p_server, p_err, OCI_DEFAULT);
OCIHandleFree(p_env, p_svc, OCI_HTYPE_SVCCTX);
OCIHandleFree(p_env, p_server, OCI_HTYPE_SERVER);
OCIHandleFree(p_env, p_err, OCI_HTYPE_ERROR);
OCIHandleFree(p_env, p_env, OCI_HTYPE_ENV);
return 1;
}
// 设置会话句柄的用户名和密码
if (OCIAttrSet(p_session, OCI_HTYPE_SESSION, (void*)p_username, strlen(p_username), OCI_ATTR_USERNAME, p_err) != OCI_SUCCESS ||
OCIAttrSet(p_session, OCI_HTYPE_SESSION, (void*)p_password, strlen(p_password), OCI_ATTR_PASSWORD, p_err) != OCI_SUCCESS) {
printf("OCIAttrSet fled\n");
OCISessionEnd(p_svc, p_err, p_session, OCI_DEFAULT);
OCIHandleFree(p_env, p_session, OCI_HTYPE_SESSION);
OCIServerDetach(p_server, p_err, OCI_DEFAULT);
OCIHandleFree(p_env, p_svc, OCI_HTYPE_SVCCTX);
OCIHandleFree(p_env, p_server, OCI_HTYPE_SERVER);
OCIHandleFree(p_env, p_err, OCI_HTYPE_ERROR);
OCIHandleFree(p_env, p_env, OCI_HTYPE_ENV);
return 1;
}

// 开始会话
if (OCISessionBegin(p_svc, p_err, p_session, OCI_CRED_RDBMS, OCI_DEFAULT) != OCI_SUCCESS) {
printf("OCISessionBegin fled\n");
OCISessionEnd(p_svc, p_err, p_session, OCI_DEFAULT);
OCIHandleFree(p_env, p_session, OCI_HTYPE_SESSION);
OCIServerDetach(p_server, p_err, OCI_DEFAULT);
OCIHandleFree(p_env, p_svc, OCI_HTYPE_SVCCTX);
OCIHandleFree(p_env, p_server, OCI_HTYPE_SERVER);
OCIHandleFree(p_env, p_err, OCI_HTYPE_ERROR);
OCIHandleFree(p_env, p_env, OCI_HTYPE_ENV);
return 1;
}
// 设置默认服务句柄
if (OCIAttrSet(p_svc, OCI_HTYPE_SVCCTX, p_session, 0, OCI_ATTR_SESSION, p_err) != OCI_SUCCESS) {
printf("OCIAttrSet fled\n");
OCISessionEnd(p_svc, p_err, p_session, OCI_DEFAULT);
OCIHandleFree(p_env, p_session, OCI_HTYPE_SESSION);
OCIServerDetach(p_server, p_err, OCI_DEFAULT);
OCIHandleFree(p_env, p_svc, OCI_HTYPE_SVCCTX);
OCIHandleFree(p_env, p_server, OCI_HTYPE_SERVER);
OCIHandleFree(p_env, p_err, OCI

数据运维技术 » C结合Oracle数据库实现案例(c# oracle 例子)