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函数并进行简单的处理即可。当然,实际开发中需要考虑到许多复杂的问题,比如连接池、事务处理等,这些问题需要结合业务逻辑进行具体分析和处理。