在C++中使用Oracle数据库及其示例代码

2023年 8月 27日 80.2k 0

在C++中使用Oracle数据库及其示例代码

Oracle是一款强大的关系型数据库管理系统,在C++中使用Oracle数据库可以帮助我们更加高效地管理数据库。本文将介绍如何在C++中使用Oracle数据库以及相关示例代码。

一、安装和配置Oracle数据库驱动程序

在使用Oracle数据库之前,需要安装相应的Oracle驱动程序。Oracle官方提供了ODBC驱动程序,我们可以从官网上下载和安装。

安装完成后,进入控制面板 -> 管理工具 -> 数据源(ODBC)。在“驱动程序”中可以看到ODBC驱动程序。我们需要选择对应的驱动程序并进行配置。

在“数据源名称”中输入需要连接的Oracle数据库的别名,比如“orcl”。在“服务器名称”中输入连接数据库的主机名或IP地址。在“用户id”中输入连接数据库的用户名,密码中输入对应的密码。点击“测试连接”按钮,如果提示“连接成功”,则说明连接成功。

二、使用Oracle数据库

在C++中使用Oracle数据库需要引入oracle头文件并进行相关设置。

1.头文件包含

首先需要包含oci.h和oci.cpp的头文件,这两个头文件在Oracle安装目录下的OCI/include目录中。

2.链接Oracle库文件

需要链接Oracle的库文件,包括oci.lib、ociw32.lib和orannzsbb11.dll等。

3.创建OCI句柄

OCI句柄是Oracle提供的一种内存管理机制。OCI句柄用于管理OCILIB库与Oracle服务(SQL语句)之间的连接和交互。

OCI句柄在使用时需要先申请,再根据需要进行配置。常用的OCI句柄包括:(1)环境句柄:OCIEnv。(2)服务句柄:OCISvcCtx。(3)会话句柄:OCISession。(4)语句句柄:OCIStmt。(5)结果集句柄:OCIDefine,OCIParam。

下面是申请OCI环境句柄、服务句柄、会话句柄和语句句柄的代码:

OCIEnv* envhp;
OCIStmt* stmthp;
OCIServer* srvhp;
OCISession* sesshp;

//申请环境句柄
int err = OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, (dvoid*)0, (dvoid*(*)(dvoid*, size_t))0, (dvoid*(*)(dvoid*, dvoid*, size_t))0, (void(*)(dvoid*, dvoid*))0, (size_t)0, (dvoid**)0);

//申请服务句柄
err = OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (dvoid**)0);

//申请会话句柄
err = OCIHandleAlloc(envhp, (dvoid**)&sesshp, OCI_HTYPE_SESSION, (size_t)0, (dvoid**)0);

//申请语句句柄
err = OCIHandleAlloc(envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);

登录后复制

4.连接Oracle数据库

需要先设置OCIServer的服务名称,再调用OCILogon2函数连接到Oracle数据库。下面是连接Oracle数据库的代码:

//设置服务名称
const char* db_name = "orcl";
err = OCIAttrSet(srvhp, OCI_HTYPE_SERVER, (dvoid*)db_name, strlen(db_name), OCI_ATTR_SERVER_NAME, envhp);

//连接数据库
const char* user_name = "scott";//连接的用户名
const char* password = "tiger";//连接的密码
const char* dblink = 0;//连接方式
ub4 dblink_len = 0;
err = OCILogon2(envhp, errhp, &sesshp, (CONST OraText*)user_name, strlen(user_name), (CONST OraText*)password, strlen(password), (CONST OraText*)dblink, (ub4)dblink_len, (CONST OraText*)0, 0);

登录后复制

5.执行SQL语句

执行SQL语句需要使用OCIStmt句柄和OCIDefine句柄。OCIStmt句柄用于准备SQL语句,OCIDefine句柄用于定义输出变量。下面是执行SQL语句的代码:

//定义SQL语句
const char* sql = "select empno from emp where empno=:1";
err = OCIStmtPrepare(stmthp, errhp, (CONST OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);

//绑定输入参数
ub2 empno = 7900;
err = OCIBindByPos(stmthp, &bindhp, errhp, 1, &empno, sizeof(empno), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT);

//执行SQL语句
err = OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT);

//定义输出变量
ub2 out_empno;
ub2 ind;
sb2 out_len;
ERRCALL(OCIDefineByPos(stmthp, &dfnhp, errhp, 1, (dvoid*)&out_empno, sizeof(out_empno), SQLT_INT, &ind, &out_len, 0, OCI_DEFAULT));

//获取结果
err = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);

登录后复制

三、示例代码

下面是连接Oracle数据库和执行SQL语句的完整代码:

#include
#include
#include

using namespace std;
using namespace oracle::occi;

int main()
{
OCIEnv *envhp;
OCIStmt *stmthp;
OCIServer *srvhp;
OCISession *sesshp;

// 申请OCI环境句柄
int err = OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, (dvoid*)0, (dvoid*(*)(dvoid*, size_t))0, (dvoid*(*)(dvoid*, dvoid*, size_t))0, (void(*)(dvoid*, dvoid*))0, (size_t)0, (dvoid**)0);

// 申请服务句柄
err = OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (dvoid**)0);

// 申请会话句柄
err = OCIHandleAlloc(envhp, (dvoid**)&sesshp, OCI_HTYPE_SESSION, (size_t)0, (dvoid**)0);

// 申请语句句柄
err = OCIHandleAlloc(envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);

// 设置服务名称
const char* db_name = "orcl";
err = OCIAttrSet(srvhp, OCI_HTYPE_SERVER, (dvoid*)db_name, strlen(db_name), OCI_ATTR_SERVER_NAME, envhp);

// 连接数据库
const char* user_name = "scott";//连接的用户名
const char* password = "tiger";//连接的密码
const char* dblink = 0;//连接方式
ub4 dblink_len = 0;
err = OCILogon2(envhp, errhp, &sesshp, (CONST OraText*)user_name, strlen(user_name), (CONST OraText*)password, strlen(password), (CONST OraText*)dblink, (ub4)dblink_len, (CONST OraText*)0, 0);

// 执行SQL语句
const char* sql = "select empno from emp where empno=:1";
err = OCIStmtPrepare(stmthp, errhp, (CONST OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);

ub2 empno = 7900;// 输入的empno
OCIBind* bindhp;
err = OCIBindByPos(stmthp, &bindhp, errhp, 1, &empno, sizeof(empno), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT);

OCIDefine* dfnhp;
ub2 out_empno;
ub2 ind;
sb2 out_len;
ERRCALL(OCIDefineByPos(stmthp, &dfnhp, errhp, 1, (dvoid*)&out_empno, sizeof(out_empno), SQLT_INT, &ind, &out_len, 0, OCI_DEFAULT));

err = OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT);

err = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
while(err == OCI_SUCCESS)
{
cout

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论