以前研究过一些数据库接口,比如OCI,今天又特意研究了OCCI,OCCI是在OCI的基础上封装的一层面向C++开发者的一套类库,采用面向对象的方法组织,而OCI是C语言接口,函数调用相当复杂,并且封装也不太容易。废话少说,先上代码吧。
#include <iostream> #include <occi.h> #include <assert.h> using namespace oracle::occi; using namespace std; int main () { Environment *env = NULL; Connection *conn = NULL; Statement *stmt = NULL; ResultSet *rs = NULL; string username = "scott"; //用户名 string password = "tiger"; //密码 string connstring = "//localhost:1521/ORCL"; //连接字符串 string sql,strname; int errNum = 0; string errMsg = ""; env = Environment::createEnvironment(); //创建一个环境变量 try { assert(env != NULL); conn = env->createConnection(username,password,connstring); //创建一个数据库连接对象 stmt = conn->createStatement(); //创建一个Statement对象 } catch (SQLException ex) { errNum = ex.getErrorCode(); errMsg = ex.getMessage(); cout << "Error Number : "<< errNum << endl; //取出异常代码 cout << errMsg << endl; //取出异常信息 } sql = "SELECT ID,NAME FROM STUDENT WHERE ID >= :1"; //拼接一个SQL语句 int id = 2; stmt->setSQL(sql); //设置SQL语句到Statement对象中 stmt->setInt(1,id); try { char buffer[4096]; //缓冲区 rs = stmt->executeQuery();//执行SQL语句 int recordCnt = rs->getNumArrayRows(); rs->setCharacterStreamMode(2,1000); while (rs->next()) { //一条一条的取数据 unsigned int length = 0; unsigned int size = 500; Stream *stream = rs->getStream(2); while (stream->status() == Stream::READY_FOR_READ) { length += stream->readBuffer(buffer +length, size); } cout << "Read " << length << " bytes into the buffer" << endl; } cout << "SELECT ―― SUCCESS" << endl; } catch (SQLException ex) { cout << "Error Number : "<< ex.getErrorCode() << endl; //取出异常代码 cout << ex.getMessage() << endl; //取出异常信息 } conn->terminateStatement(stmt); //终止Statement对象 env->terminateConnection(conn); //断开数据库连接 Environment::terminateEnvironment(env); //终止环境变量 return 1; }