用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*)¶meter, 0, OCI_ATTR_PARAM, errhp);
memset(buffer,0,buflen+1);
/* 获取每行的数据项 */
for (int x = 1;x
status = OCIParamGet(parameter, OCI_HTYPE_PARAM, errhp, (void**)¶meter, 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,