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