VC使用OCCI开发的简介
VC++環境設置
?
1加include files項:%ORACLE_HOME%\oci\include??
?
? %ORACLE_HOME% = HKEY_LOCALMACHINE_SOFTWARE\SOFTWARE\ORACLE\KEY_OraDb10g_home 注冊表鍵
?
2、加library file
項:%ORACLE_HOME%\oci\lib\msvc\vc6? %ORACLE_HOME%\oci\lib
3、加lib文件oraocci10.lib (VS10的鏈表-強制依賴項)
4、在preprocessor definitions 下面去掉_DEBUG宏,加入WIN32COMMON _DLL
_MT? 3個宏;或在#include <occi.h>前面加以下代碼
?
#inndef WIN32COMMON
#define WIN32COMMON
#endif
#inndef _DLL
#define _DLL
#endif
#inndef _MT
#define _MT
#endif
?
5、在project options 里將MLd去掉d,去掉/GZ。
或者在build->set active configouration 打開set active project configouration對話
框,選擇win32 release。
?
使用方法:
#include <occi.h>
using namespace oracle::occi;
?
環境變量Environment
?
Environment *env;
Env=Environment::creatEnvironment(Enviroment::DEFAULT);
Environment::terminateEnvironment(env);
?
連接對象:Connection
Connection *conn;
Conn=env->createConnection(user,passwd,db);
Env->terminateConnection(conn);
?
普通連接池:
?
ConnectionPool *connPool;
connPool=env->creatConnectionPool(poolusername,poolpasswd,connectstring,minco
nn,maxconn,incrconn);
普通連接:
con=connPool->createConnection(username,password);
?
代理連接:
?
ConectionPool->createProxyConnection(
?Const string &username,
?Connetion::ProxyType proxtType=Connection::PROXY_DEFAULT);
?
或者
?
ConnectionPool->createProxyConnection(
?Const string &username,
?String roles[],
?Int numRoles,
?Connection::ProxyType proxyType=Connection::PROXY_DEFAULT);
?
無狀態連接池:(連接池用完后可自動增加)
?
StatlessConnectionPool *spool=
?
?Enviroment::CreatStatlessConnectionPool(username,passwd,connectstring,maxco
?
nn,minconn,incrconn,HOMOGENOUS);
Connection *conn=spool->getConnection();//獲取連接對象
spool->releaseConnection(conn,”CN”);//釋放連接,同時標記
env->terminateConnectionPool(spool); //銷毀連接池
?
?
statement對象:
?
1、標準
?
String sqlstmt = “SELECT author_id,author_name FROM author_tab order by
?
author_id;//occi數據類型
?
stmt=conn->createStatement(sqlstmt); //創建標準類型
?
ResultSet *rset=stmt->executeQuery(); //返回結果
?
Cout<<rset->getInt(1)<<rset->getSting(2); //第1、2列
?
Stmt->closeResultSet(rset);? //關閉
?
Conn->terminateStatement(stmt); //關閉
?
?執行SQL語句時可執行以下函數:
?
execute():一般SQL語句,create\insert
?
executeUpdate():執行DDL\DML語句
?
executeArrayUpdate():復雜的SQL語句
?
executeQuery():查詢
?
?setSQL()
?
?getSQL():獲取當前執行的SQL語句
?
?SQLException ex:捕捉發生錯誤的異常;ex.getErrorCode()? ex.getMessage()
?
2、帶參數
?
Void insertBind(int c1,string c2)
?
{
?
?String sqlStmt=”INSERT INTO author_tab VALUES(:x,:y);
?
?Stmt=conn->createStatement(sqlStmt);? try{
?
? stmt->setInt(1,c1); stmt->setString(2,c2);stmt->executeUpdate();
?
}catch(SQLException ex)
?
{cout<<ex.getErrorCode()<<ex.getMessage();}
?
Conn->terminateStatement;
?
}
?
3、帶存儲過程的
?
A:調用過程:
?
Statement *stmt=con->createStatement(“BEGIN demo_proc(:v1,:v2,:v3)
?
END;”);//3參數
?
Cout<<stmt->getSQL();
?
stmt->setInt(1,10); stmt->setMaxParamSize(2,30); stmt->String(2,”IN”);
?
stmt->registerOutParam(3,OCCISTRING,30,””);
?
int updateCount= stmt->executeUpdate();
?
B:調用函數:
?
Statement *stmt=con->createStatement(“BEGIN:a:=demo_proc(:v1,:v2,:v3)
?
END;”);//4參數
?
Cout<<stmt->getSQL();
?
stmt->setInt(2,10); stmt->setMaxParamSize(3,30); stmt->String(2,”IN”);
?
stmt->registerOutParam(1,OCCISTRING,30,””);
?
stmt->registerOutParam(4,OCCISTRING,30,””);
?
int updateCount= stmt->executeUpdate();
?
?
?
批量編輯數據
?
Statement *stmt=conn->createStatement(“INSERT INTO emp(empno,ename) VALUES(:1,:2)”);
?
stmt->setMaxIteration(10); //指定最多有多少個記錄時執行executeUpdate
stmt->setMaxParamSize(2,100);? //指定最大的數據緩沖區
stmt->setInt(1,10001); stmt->setString(2,”john”); stmt->setIteartion();//加入緩沖區
stmt->executeUpdate();
?
?
?
操作流數據(getStream(),writeBuffer(),writeLastBuffer(),readBuffer(),
readLastBuffer())
數據類型BLOB、CLOB、LONG、LONG RAW 、RAW 、VARCHAR2的數據
為流數據
?
Statement *stmt=conn->creatStatement(“INSERT INTO testtab(longeo1) VALUES(:1)”);
?
stmt->setCharacterStreamMode(1,10000); stmt->executeUpdate();
?
Stream *instream= stmt->getStream(1); char buffer[10000];
?
instream->writeBuffer(buffer,len);instream->writeLastBuffer(buffer,len);
?
stmt->closeStream(instream);
?
?
?
事務的提交與回滾 Connection::commit();Connection::rollback()
自動提交Statement::setAutoCommit(TRUE/FALSE);
?
Statement對象的緩沖區:
?
1、連接對象的緩沖區:
?
conn->setStmtCacheSize(10);? int csize=conn->getStmtSize();
conn->terminateStatemen(stme); stmt->disableCaching();
?
2、連接池緩沖區:
?
conPool->setStmtCacheSize();
Metadata對象:查看數據庫對象的屬性與元數據
MetaData md=conn->getMetadata(“emp”,PTYPE_UNK);//建立對象
int objectType=md.getInt(Metadata::ATTY_OBJ_PTYPE);//對象類型
int columnCount=md.getInt(Metadata:ATTR_OBJ_NUM_COLS);//對象的字段數
Timestamp objts=md.getTimestamp(Metedata::ATTR_OBJ_TIMESTAMP);//時區
vector<MetaData>cols=md.getVector(Metadata::ATTR_LIST_COLUMS);//返回集
?
合對象
?
cols[0].getString(Metedata::ATTR_NAME);//第一個字段名
cols[0].getInt(Metedata::ATTR_DATA_TYPE);//第一個字段類型
Statement *stmt =conn->creatStatement(“select * from emo”);
ResultSet *rs=stmt->executeQuery();
Vector(MeteData) selectcols=rs->getColumnListMetaData();
int columnCount=selectcols.size();
for(int i=0;i<columnCount;i==)
{
cout<<selectcols[i].getString(MetaData::ATTR_NAME);
cout<<selectcols[i].getInt(MetaData::ATTR_DATA_TYPE);
}
總結
以上是生活随笔為你收集整理的VC使用OCCI开发的简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WLAN直连总体结构和相关流程概览(一)
- 下一篇: CAN总线通信硬件原理图(采用TJA10