OCCI使用
文章目录
- OCCI概述
- OCCI介绍
- OCCI优势
- 特性
- 相关头文件
- OCCI库
- OCCI官方网站
- OCCI文档介绍和环境配置
- OCCI中连接Oracle数据库
- 连接Oracle数据库示例
- OCCI中执行SQL语句
- OCCI中事务处理
OCCI概述
OCCI介绍
Oracle C++调用接口 – OCCI 即 Oracle C++ Call Interface
OCCI 是Oracle 的C++ API, 允许你使用面向对象的特性、本地类、C++语言的方法来访问Oracle数据库
OCCI优势
OCCI提供其它访问ORACLE数据库所不具备的重要优势
基于标准C++和面向对象的设计
简单易用
与JDBC比较相近,容易学会
可以像操作C++实例一样操作用户定义的数据库对象
特性
- 完整支持SQL/PLSQL
- 为不断增长的用户和请求提供了弹性选项
- 为使用用户自定义类型,如C++中的类,提供了无缝接口
- 支持所有的Oracle数据类型以及LOB types(大对象)
- 可以访问数据库元数据
相关头文件
#include <occi.h> -- 程序中只需要包含这一个头文件//以下不需要添加
#include <occiCommon.h>
#include <occiControl.h>
#include <occiData.h>
#include <occiObjects.h>
OCCI库
- Windows平台
- oraocci11.lib/ oraocci11d.lib
- oraocci11.dll/ oraocci11d.dll
- Linux平台
- libnnz11.so
- libocci.so
- libclntsh.so
OCCI官方网站
oracle官方网站:https://www.oracle.com/index.html
OCCI编程指南
C++参考网址:https://www.oracle.com/database/technologies/appdev/oci.html
OCCI文档介绍和环境配置
Vs2017环境的配置:
第一步: 配置头文件和库目录
注意: 添加库的时候 先添加oraocci11.lib 然后添加oraocci11d.lib
OCCI中连接Oracle数据库
8.1 初始化 - Environment 类
OCCI通过创建一个Environment的对象完成初始化工作。
可以通过Environment创建数据库连接,从而进行其它的操作
要创建Environment,应该调用Environment类的静态方法createEnvironment()
// 环境初始化
Environment* env = Environment::createEnvironment();
// 关闭, 释放资源
Environment::terminateEnvironment(env);
8.2 连接数据库 - Connection 类
连接数据库通过Connection类的对象实例实现
调用Environment类的**createConnection()**方法可以创建一个Connection对象;
函数原型
Connection *Environment::createConnection( const string &userName,const string &password, const string &connectString );
函数调用
const string userName = "scott"; // 用户名
const string passwd = "密码"; // 密码
const string connstr = "192.168.247.1:1521/orcl"; // 数据库连接串
Connection* conn = env->createConnection(userName, passwd, connstr);
使用**Environment::terminateConnection()**断开连接
// 断开连接
env->terminateConnection(conn);
连接Oracle数据库示例
#include <iostream>
#include <occi.h>using namespace std;
using namespace oracle::occi; //命名空间int main(void)
{string name = "scott";string passwd = "11";string connectStr = "192.168.15.33:1521/orcl";//1. 创建OCCI的环境Environment *env = Environment::createEnvironment();if (NULL == env){cout << "createEnvironment failed...." << endl;return 1;}//2. 连接数据库Connection *connect = env->createConnection(name, passwd, connectStr);if (NULL == connect){cout << "CreateConnection failed..." << endl;return 1;}cout << "连接oracle服务端ok ..." << endl;//3. 关闭连接env->terminateConnection(connect);//4. 终止环境Environment::terminateEnvironment(env);return 0;
}
OCCI中执行SQL语句
执行SQL
Statement 类用于执行SQL语句,并获取返回结果。
ResultSet 类用于处理SELECT 查询的结果。
对于所有类型的数据的绑定或者获取,OCCI都提供了统一的方法
- setXXX 方法用于Statement
- getXXX 方法用于Statement & ResultSet
OCCI会自动处理类型之间的转换。
使用方法:
使用Connection:😗*createStatement()**创建Statement对象, 指定 SQL 命令(DDL/DML/query)作为参数
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>#include <occi.h>using namespace std;
using namespace oracle::occi;int main()
{string dbUser = "scott";string dbPwd = "11";string connStr = "192.168.16.47:1521/orcl";//1. 创建OCCI环境Environment *env = Environment::createEnvironment();if (NULL == env){cout << "createEnvironment failed.." << endl;return 1;}cout << "创建一个环境ok" << endl;{//2. 连接到数据库Connection *conn = env->createConnection(dbUser, dbPwd, connStr);if (NULL == env){cout << "createConnection failed.." << endl;return 1;}cout << "连接Oracle ok" << endl;//创建语句对象Statement *stmt = conn->createStatement();//执行select语句//stmt->executeUpdate("insert into dept values(9, '9name', '9loc')");//执行delete语句//stmt->executeUpdate("delete from dept where deptno = 9");//执行Update语句stmt->executeUpdate("update dept set dname = '8AAA', loc='8LOC' where deptno = 8");#if 0//使用预处理语句stmt->setSQL("insert into dept values(:1, :2, :3)");stmt->setInt(1, 9);stmt->setString(2, "9Name");stmt->setString(3, "9Loc");stmt->executeUpdate();
#endif//查询ResultSet *rs = stmt->executeQuery("select deptno, dname from dept");int id = -1;string name;//获取结果while (rs->next()){id = rs->getInt(1);name = rs->getString(2);cout << id << endl;}stmt->closeResultSet(rs);//终止语句对象conn->terminateStatement(stmt);//3. 终止连接env->terminateConnection(conn);}//4. 终止一个环境Environment::terminateEnvironment(env);cout << "hello itcast" << endl;system("pause");return 0;
}
OCCI中事务处理
#include <iostream>
#include <occi.h>
#include <string>
using namespace std;
using namespace oracle::occi;int main()
{// 1. 初始化连接环境Environment* env = Environment::createEnvironment();// 2. 创建连接string userName = "scott";string passwd = "tiger";string connstr = "192.168.247.129:1521/orcl";// conn是建立连接之后得到的对象Connection* conn = env->createConnection(userName, passwd, connstr);if (conn == NULL){cout << "连接失败..." << endl;return -1;}cout << "数据库连接成功..." << endl;// 3. 创建一个用户操作sql的对象// key给这个函数指定sql语句也可以不指定Statement* stat = conn->createStatement();// 如果没有指定执行的sql可以通过set方法指定string sql = "select * from dept";// stat->setSQL(sql);// 执行sql语句ResultSet* resSet = stat->executeQuery(sql);// 取出所有的记录while (resSet->next()){// 每循环一次读一条记录// 读出这条记录的三个字段int no = resSet->getInt(1); // 1 - 第一个字段string str1 = resSet->getString(2);string str2 = resSet->getString(3);cout << "no: " << no << endl;cout << "name" << str1 << endl;cout << "loc" << str2 << endl;}// 关闭结果集stat->closeResultSet(resSet);// 插入语句// 设置sql语句// occi dml 会自动打开一个事务sql = "insert into dept values(:1, :2, :3)";stat->setSQL(sql);stat->setInt(1, 66);stat->setString(2, "itcast");stat->setString(3, "china");// 执行sql语句
#if 0int ret = stat->executeUpdate();if (ret == 0){cout << "insert fail..." << endl;// 失败状态回滚conn->rollback();return -1;}conn->commit();
#else// 设置事务的自动处理stat->setAutoCommit(true);int ret = stat->executeUpdate();if (ret == 0){cout << "insert fail..." << endl;// 失败状态回滚return -1;}
#endifconn->terminateStatement(stat);env->terminateConnection(conn);// 释放资源Environment::terminateEnvironment(env);return 0;
}