C语言实现快速访问Oracle数据库(c 快速访问oracle)

C语言实现快速访问Oracle数据库

在实际的开发中,经常需要使用数据库存储和管理数据。Oracle数据库是业界主流的数据库之一,具有高性能和稳定性等优点。本文将介绍如何使用C语言访问Oracle数据库,并提供相关的代码示例。

一、安装Oracle客户端

要使用C语言访问Oracle数据库,首先需要安装Oracle客户端。Oracle提供了Windows版和Linux版的客户端,开发人员可以根据自己的需要进行选择。

在Windows系统中,安装Oracle客户端是比较简单的,只需要下载对应版本的客户端安装程序,然后按照提示进行安装即可。在Linux系统中,需要下载对应版本的客户端安装包,并解压缩到指定目录中。

二、编写C程序连接Oracle数据库

安装好Oracle客户端后,我们就可以开始编写C程序连接Oracle数据库了。以下是一个简单的示例程序:

“`c

#include

#include

#include

#include

int mn(int argc, char *argv[])

{

OCIEnv *envhp;

OCIError *errhp;

OCIServer *srvhp;

OCISession *sesnhp;

char *username = “scott”;

char *password = “tiger”;

char *database = “ORCL”;

if (OCIEnvCreate(&envhp, OCI_THREADED | OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL) != OCI_SUCCESS)

{

printf(“创建OCI环境句柄失败\n”);

return -1;

}

OCIHandleAlloc(envhp, (void **)&errhp, OCI_HTYPE_ERROR, 0, NULL);

OCIHandleAlloc(envhp, (void **)&srvhp, OCI_HTYPE_SERVER, 0, NULL);

OCIHandleAlloc(envhp, (void **)&sesnhp, OCI_HTYPE_SESSION, 0, NULL);

if (OCIServerAttach(srvhp, errhp, (const OraText *)database, strlen(database), 0) != OCI_SUCCESS)

{

printf(“连接数据库失败\n”);

return -1;

}

if (OCIAttrSet(sesnhp, OCI_HTYPE_SESSION, username, strlen(username), OCI_ATTR_USERNAME, errhp) != OCI_SUCCESS

|| OCIAttrSet(sesnhp, OCI_HTYPE_SESSION, password, strlen(password), OCI_ATTR_PASSWORD, errhp) != OCI_SUCCESS)

{

printf(“设置用户名和密码失败\n”);

return -1;

}

if (OCISessionBegin(srvhp, errhp, sesnhp, OCI_CRED_RDBMS, OCI_DEFAULT) != OCI_SUCCESS)

{

printf(“登录数据库失败\n”);

return -1;

}

printf(“登录数据库成功\n”);

OCIHandleFree(srvhp, OCI_HTYPE_SERVER);

OCIHandleFree(sesnhp, OCI_HTYPE_SESSION);

OCIHandleFree(errhp, OCI_HTYPE_ERROR);

OCIHandleFree(envhp, OCI_HTYPE_ENV);

return 0;

}


在上述程序中,我们首先通过OCIEnvCreate函数创建了一个OCI环境句柄,然后使用OCIHandleAlloc函数分别创建了OCIError、OCIServer和OCISession句柄。

接着,我们调用OCIServerAttach函数连接Oracle数据库,如果连接失败,则程序返回错误信息。如果连接成功,我们就可以通过OCIAttrSet函数设置用户名和密码,并使用OCISessionBegin函数登录数据库。

我们通过OCIHandleFree函数释放了创建的OCI句柄,程序运行结束。

三、执行SQL语句

连接Oracle数据库后,我们就可以通过OCIStmtPrepare函数准备SQL语句,并使用OCIStmtExecute函数执行SQL语句。以下是一个简单的示例程序:

```c
#include
#include
#include
#include

int mn(int argc, char *argv[])
{
OCIEnv *envhp;
OCIError *errhp;
OCIServer *srvhp;
OCISession *sesnhp;
OCIStmt *stmthp;
OCIParam *paramhp;

char *username = "scott";
char *password = "tiger";
char *database = "ORCL";

if (OCIEnvCreate(&envhp, OCI_THREADED | OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL) != OCI_SUCCESS)
{
printf("创建OCI环境句柄失败\n");
return -1;
}

OCIHandleAlloc(envhp, (void **)&errhp, OCI_HTYPE_ERROR, 0, NULL);
OCIHandleAlloc(envhp, (void **)&srvhp, OCI_HTYPE_SERVER, 0, NULL);
OCIHandleAlloc(envhp, (void **)&sesnhp, OCI_HTYPE_SESSION, 0, NULL);

if (OCIServerAttach(srvhp, errhp, (const OraText *)database, strlen(database), 0) != OCI_SUCCESS)
{
printf("连接数据库失败\n");
return -1;
}

if (OCIAttrSet(sesnhp, OCI_HTYPE_SESSION, username, strlen(username), OCI_ATTR_USERNAME, errhp) != OCI_SUCCESS
|| OCIAttrSet(sesnhp, OCI_HTYPE_SESSION, password, strlen(password), OCI_ATTR_PASSWORD, errhp) != OCI_SUCCESS)
{
printf("设置用户名和密码失败\n");
return -1;
}

if (OCISessionBegin(srvhp, errhp, sesnhp, OCI_CRED_RDBMS, OCI_DEFAULT) != OCI_SUCCESS)
{
printf("登录数据库失败\n");
return -1;
}

printf("登录数据库成功\n");

//执行SQL语句
char *sql = "SELECT * FROM emp WHERE deptno=10";
int rc;

OCIHandleAlloc(envhp, (void **)&stmthp, OCI_HTYPE_STMT, 0, NULL);

if (OCIStmtPrepare(stmthp, errhp, (OraText *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT) != OCI_SUCCESS)
{
printf("准备SQL语句失败\n");
return -1;
}

if (OCIStmtExecute(srvhp, stmthp, errhp, 0, 0, NULL, NULL, OCI_DEFAULT) != OCI_SUCCESS)
{
printf("执行SQL语句失败\n");
return -1;
}

//获取查询结果
rc = OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);

while (rc == OCI_SUCCESS || rc == OCI_SUCCESS_WITH_INFO)
{
printf("empno=%d,ename=%s,sal=%f\n", *(int *)paramhp, (char *)paramhp + 4, *(float *)((char *)paramhp + 20));
rc = OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
}

//释放句柄
OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
OCIHandleFree(sesnhp, OCI_HTYPE_SESSION);
OCIHandleFree(stmthp, OCI_HTYPE_STMT);
OCIHandleFree(errhp, OCI_HTYPE_ERROR);
OCIHandleFree(envhp, OCI_HTYPE_ENV);

return 0;
}

在上述程序中,我们使用OCIHandleAlloc函数创建了OCIStmt句柄,然后使用OCIStmtPrepare函数准备SQL语句。如果准备失败,则程序返回错误信息。

如果准备成功,我们使用OCIStmtExecute函数执行SQL语句,如果执行失败,则程序返回错误信息。

在获取查询结果时,我们使用OCIStmtFetch2函数读取数据,该函数的第一个参数是一个OCIDefine句柄,可以用来存储查询结果的值。但为了简化程序,我们只获取了几个字段的查询结果,并直接打印到控制台。

我们通过OCIHandleFree函数释放了创建的OCI句柄,程序运行结束。

通过以上两个示例程序,我们可以看到,使用C语言访问Oracle数据库并不困难,只需要熟悉相关的API函数并进行简单的处理即可。当然,实际开发中需要考虑到许多复杂的问题,比如连接池、事务处理等,这些问题需要结合业务逻辑进行具体分析和处理。


数据运维技术 » C语言实现快速访问Oracle数据库(c 快速访问oracle)