返回> 网站首页 

VC++ OCI操作Oracle数据库

yoours2017-03-13 15:47:02 阅读 2078

简介一边听听音乐,一边写写文章。

一、OCI动态库
  oci.dll
  ocijdbc11.dll
  ociw32.dll
  orannzsbb11.dll
  oraociei11.dll
  orasql11.dll

二、msvc版本库
        oraocci11.dll         Release模式库
        oraocci11.lib

        oraocci11d.dll        Debug模块库
        oraocci11d.lib

三、添加头文件
#include <occi.h>
using namespace oracle::occi;

三、连接数据库
Environment* env;
Connection* conn;

try{
env = Environment::createEnvironment("ZHS16GBK", "UTF8");
conn = env->createConnection(UserName, Password, strconn);//"登录名", "密码", "//192.168.0.31:1521/SA"
}catch(SQLException& sqlExcp){
}catch(exception& excp){
}

四、关闭数据库
    try
{
env->terminateConnection(conn);
Environment::terminateEnvironment(env);
}catch(SQLException& sqlExcp){
}catch(exception& excp){
}

五、执行一般SQL语句
1. 事务方式
try
{
// createStatement只需执行一次,因它会创建一个新游标,且游标是只有在数据库关闭后才会释放
                // 游标是有数量限制的,过多会导致SQL无法执行,且报604错误。
Statement* stmt= conn->createStatement();
stmt->setAutoCommit(false);
stmt->executeUpdate(strSql);
/*
有时候程序会停在执行的地方不动。
停住不动的原因是因为数据库没有提交事务,而又继续执行SQL代码导致的。
oracle数据库出现的这个问题后,在PLSQL点击F10提交一下事务代码就可以执行了,不然就卡在那里不动也不抛出异常。
*/
conn->commit();
conn->terminateStatement(stmt);
return true;
}catch(SQLException& sqlExcp){
if (iErr==3113 || iErr==3135 || iErr==28547 || iErr==107 || iErr==587 || iErr==1012 || iErr==1092 || iErr==12543)
{
// 这里是作为数据库连接断开后的重连操作。
}
}catch(exception& excp){
}

  2. 非事务方式
stmt->setAutoCommit(true);
stmt->execute(strSql);
conn->terminateStatement(stmt);

六、其他
1. 参数化的SQL语句
//:1,:2是参数占位符
stmt->setSQL("Insert INTO basket_tab VALUES(:1,:2)");
// 第一个参数
stmt->setString(1, "Bananas");
// 第二个参数
stmt->setInt(2, 5);
stmt->executeUpdate();
 
 2.一次修改多行数据
//最多允许的迭代次数,注意这个参数需要在setXXX系列函数之前执行
stmt->setMaxIterations(int maxIterations);
//指定某个参数的大小,string和byte需要
stmt->setMaxParamSize(int parameterIndex, int maxParamSize);
 
for(...)
{
    // 第一个参数
    stmt->setString(1, "Bananas");
    // 第二个参数
    stmt->setInt(2, 5);
 
    //増加一行记录,类似于ADO的AddNew
    pStmt->addIteration();
}
 
stmt->executeUpdate();
 
3.执行查询:获取结果集(记录集)
ResultSet *rs = stmt->executeQuery("Select * FROM basket_tab");
while (rs->next())
{
    string fruit = rs->getString(1); // get the first column as string
    int quantity = rs->getInt(2); // get the second column as int
}
 
//关闭结果集
stmt->closeResultSet(rs);
 
4.执行存储过程
//指定存储过程countFruit
stmt->setSQL("BEGIN countFruit(:1, :2); END:");
//设置第一个参数
stmt->setString(1, "Apples");
 
int quantity;
//注册输出参数
stmt->registerOutParam(2, Type::OCCIINT, sizeof(quantity));

//执行此存储过程
stmt->executeUpdate();

//释放SQL语句控制句柄
conn->terminateStatement(Statement *stmt);

5. 事务
所有的DDL默认开始并自动提交一个事务
所有的DML默认开始一个事务,且不会自动提交

//可以指定DML是否自动提交
stmt->setAutoCommit(TRUE/FALSE);

//也可以手动提交或回滚。
conn->commit();
conn->rollback();

6. 异常处理
try
{
    //OCCI程序
}catch (SQLException &sqlExcp){
    cerr <<sqlExcp.getErrorCode() << ": " << sqlExcp.getMessage() << endl;
}catch (exception &excp){
    cerr << excp.what() << endl;
}

微信小程序扫码登陆

文章评论

2078人参与,0条评论