用C语言连接Oracle数据库源码实现(c 链接oracle源码)

用C语言连接Oracle数据库源码实现

随着大数据时代的到来,数据库管理成为越来越重要的一环。Oracle数据库作为一种领先的数据库产品,具有强大的功能和高效的性能,受到了广泛的应用和推崇。本文将介绍如何用C语言连接Oracle数据库,实现简单的操作。

一、环境准备

1. 安装Oracle数据库

需要安装Oracle数据库,并记录其安装路径和SID等配置信息。安装后需要启动Oracle服务,可通过在命令行中输入“services.msc”查找Oracle服务并启动。

2. 配置Oracle客户端

在连接Oracle数据库之前,需要安装并配置Oracle客户端。可以从Oracle官方网站下载并安装对应的Oracle客户端版本。安装完成后需要配置环境变量,具体方法为在“我的电脑”右键->属性->高级系统设置->环境变量->系统变量中新建“TNS_ADMIN”变量,并将其值设置为包含tnsnames.ora文件路径的目录。

二、连接Oracle数据库

下面我们将利用C语言连接Oracle数据库,并实现一些基本的操作。

1. 需要添加oracle头文件和库文件路径。在工程属性中添加如下附加包含目录:

C:\oracle\product\11.2.0\client_1\oci\include

在附加库目录中添加如下路径:

C:\oracle\product\11.2.0\client_1\oci\lib\msvc

2. 在C语言中连接Oracle数据库需要用到OCI接口,我们需要在代码中添加相应的头文件:

#include

#include

#include

3. 接下来,需要添加一些连接Oracle数据库的基本配置,如数据库服务器名称、用户名、密码等。代码如下:

OCIEnv *envhp = NULL; //OCI环境句柄

OCIError *errhp = NULL; //OCI错误句柄

OCIServer *srvhp = NULL; //OCI服务器句柄

OCIAuthInfo *authp = NULL; //OCI授权信息指针

OCISession *usrhp = NULL; //OCI用户登录句柄

OCIStmt *stmt = NULL; //OCI皮肤句柄

char *userid = “SCOTT”;

char *password = “TIGER”;

char *db = “ORACLE_SID”; //ORACLE_SID为Oracle数据库实例名

// 初始化OCI环境

OCIEnvCreate(&envhp, OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t))0,

(dvoid * (*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *))0, 0, (dvoid **)0);

OCIHandleAlloc((dvoid *)envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);

// 初始化OCI服务器句柄

OCIHandleAlloc((dvoid *)envhp, (dvoid **)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (dvoid **)0);

// 创建授权信息

OCIHandleAlloc((dvoid *)envhp, (dvoid **)&authp, OCI_HTYPE_AUTHINFO, (size_t)0, (dvoid **)0);

OCIAttrSet((dvoid *)authp, OCI_HTYPE_AUTHINFO, (dvoid *)userid, strlen(userid), OCI_ATTR_USERNAME, errhp);

OCIAttrSet((dvoid *)authp, OCI_HTYPE_AUTHINFO, (dvoid *)password, strlen(password), OCI_ATTR_PASSWORD, errhp);

// 登录数据库

OCIServerAttach(srvhp, errhp, (text *)db, strlen(db), OCI_DEFAULT);

OCILogon2(envhp, errhp, &usrhp, authp, NULL, NULL, OCI_SESSION_DEFAULT);

// 创建OCI语句句柄

OCIHandleAlloc((dvoid *)envhp, (dvoid **)&stmt, OCI_HTYPE_STMT, 0, (dvoid **)0);

注:OCIEnv、OCIServer、OCIAuthInfo、OCISession、OCIStmt为OCI接口中的各种结构体。

4. 连接Oracle数据库成功后,我们可以进行一些基本的操作,如查询、插入等操作。以下为一个查询操作的代码实例:

int mn() {

OCIEnv *envhp = NULL; //OCI环境句柄

OCIError *errhp = NULL; //OCI错误句柄

OCIServer *srvhp = NULL; //OCI服务器句柄

OCIAuthInfo *authp = NULL; //OCI授权信息指针

OCISession *usrhp = NULL; //OCI用户登录句柄

OCIStmt *stmt = NULL; //OCI皮肤句柄

char *userid = “SCOTT”;

char *password = “TIGER”;

char *db = “ORACLE_SID”; //ORACLE_SID为Oracle数据库实例名

char sql[100];

// 初始化OCI环境、错误句柄等

OCIEnvCreate(&envhp, OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t))0,

(dvoid * (*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *))0, 0, (dvoid **)0);

OCIHandleAlloc((dvoid *)envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);

// 初始化OCI服务器句柄

OCIHandleAlloc((dvoid *)envhp, (dvoid **)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (dvoid **)0);

// 创建授权信息

OCIHandleAlloc((dvoid *)envhp, (dvoid **)&authp, OCI_HTYPE_AUTHINFO, (size_t)0, (dvoid **)0);

OCIAttrSet((dvoid *)authp, OCI_HTYPE_AUTHINFO, (dvoid *)userid, strlen(userid), OCI_ATTR_USERNAME, errhp);

OCIAttrSet((dvoid *)authp, OCI_HTYPE_AUTHINFO, (dvoid *)password, strlen(password), OCI_ATTR_PASSWORD, errhp);

// 登录数据库

OCIServerAttach(srvhp, errhp, (text *)db, strlen(db), OCI_DEFAULT);

OCILogon2(envhp, errhp, &usrhp, authp, NULL, NULL, OCI_SESSION_DEFAULT);

// 创建OCI语句句柄

OCIHandleAlloc((dvoid *)envhp, (dvoid **)&stmt, OCI_HTYPE_STMT, 0, (dvoid **)0);

// 发送SQL查询语句

sprintf(sql, “select * from emp”);

OCIStmtPrepare(stmt, errhp, (CONST text *)sql, (ub4)strlen(sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT);

OCIStmtExecute(usrhp, stmt, errhp, 0, 0, NULL, NULL, OCI_STMT_SCROLLABLE_READONLY);

// 获取结果

OCIParam * parameter;

text * buffer = “”;

ub4 buflen = 0;

sword status;

/* 确认结果集大小*/

status = OCIAttrGet((dvoid*)stmt, OCI_HTYPE_STMT , (dvoid*)&buflen, 0, OCI_ATTR_ROWS_FETCHED, errhp);

while ((status = OCIStmtFetch2(stmt, errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT)) == OCI_SUCCESS) {

status = OCIAttrGet((dvoid*)stmt, OCI_HTYPE_STMT , (dvoid*)&buflen, 0, OCI_ATTR_ROWS_FETCHED, errhp);

/* 获取查询结果 */

buffer = (text*)malloc(buflen+1);

OCIAttrGet((dvoid*)stmt, OCI_HTYPE_STMT, (dvoid*)&parameter, 0, OCI_ATTR_PARAM, errhp);

memset(buffer,0,buflen+1);

/* 获取每行的数据项 */

for (int x = 1;x

status = OCIParamGet(parameter, OCI_HTYPE_PARAM, errhp, (void**)&parameter, x);

/* 获取数据内容并保存到buffer中 */

status = OCIAttrGet ((dvoid*)parameter, OCI_DTYPE_PARAM_DATA, (dvoid**)&buffer, (ub4*)&buflen, OCI_ATTR_DATA_SIZE, errhp);

printf( “%s “, buffer);

}

printf(“\n”);

free(buffer);

}

// 释放内存并断开连接

OCIStmtRelease(stmt, errhp, NULL, 0, NULL);

OCISessionEnd(envhp, errhp, usrhp,


数据运维技术 » 用C语言连接Oracle数据库源码实现(c 链接oracle源码)