青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Codejie's C++ Space

Using C++

OCI : do NOT debug on TWO different windows

    這兩天在使用Oracle,好久沒(méi)用了,生疏了很多。。。
    開(kāi)始使用occi訪問(wèn),可以是代碼很精簡(jiǎn),因?yàn)閛cci封裝的還是很好的,使用起來(lái)跟mysql++很類似,也不知道他們誰(shuí)參考誰(shuí)的,反正用起來(lái)就是很簡(jiǎn)單。
    聯(lián)調(diào)起來(lái)卻碰到了個(gè)大麻煩,本來(lái)說(shuō)好是Linux平臺(tái)的,等調(diào)試時(shí)卻要換到Windows上,問(wèn)題來(lái)了,occi11跟VC9似乎不合拍,Environment初始就出錯(cuò),折騰了很久,最終只有放棄了。測(cè)試下oci,嗯,可以用。。。
    于是,晚上一狠心,自己封裝oci,模仿occi做個(gè)ocipp來(lái),好用了。。。

    這里說(shuō)個(gè)調(diào)試過(guò)程中一件丟臉的事情--使用ocipp訪問(wèn)同時(shí),打開(kāi)SQLPlus窗口,進(jìn)行對(duì)比測(cè)試,select語(yǔ)句很好用,但到update/delete語(yǔ)句時(shí),程序卡死在execute調(diào)用中,想了很久,也嘗試了很久,到了凌晨1點(diǎn)半,一直卡死,人近瘋狂,突然想起,SQLPlus窗口下的語(yǔ)句默認(rèn)需要自己輸入commit語(yǔ)句提交的,而ocipp用的是Auto-commit方式,兩者應(yīng)該有沖突的。于是在SQLPlus輸入個(gè)commit,一切pass。。。
    所以,記得,調(diào)試oci接口時(shí),不要開(kāi)兩個(gè)窗口,會(huì)死人的。。。


    下面是ocipp代碼,僅供看熱鬧,不推薦使用,因?yàn)槌擞形kU(xiǎn)外,也很有限制,比如ocipp僅支持string類型的define和bind,因?yàn)椋业拇a僅需要這一種類型。。。

ocipp.h

#include 
<string>
#include 
<iostream>
#include 
<vector>

#include 
"oci.h"

namespace ocipp
{

class Exception
{
public:
    Exception(
int code, const std::string& msg);
    Exception(
int code, OCIError *err, const std::string& msg);

    
void show(std::ostream& os) const;
protected:
    
void getError(int code);
    
void getError(int code, OCIError *err);
protected:
    
int _code;
    std::
string _msg;
}
;

class Connection;

class Environment
{
public:
    Environment(unsigned 
int mode = OCI_DEFAULT);
    
virtual ~Environment();

    Connection
* makeConnection(const std::string& user, const std::string& passwd, const std::string& server = "");
    
void destroyConnection(Connection* conn);

    OCIEnv 
*getEnv() return _env; }
    OCIError 
*getError() return _err; }
private:
    
void makeEnvironment(unsigned int mode);
protected:
    OCIEnv 
*_env;
    OCIError 
*_err;
}
;

class Statement;

class Connection
{
    friend 
class Environment;
protected:
    Connection(Environment
* env);
    
virtual ~Connection() {}
public:
    Statement 
*makeStatement(const std::string& sql);
    
void destroyStatement(Statement* stmt);

    Environment 
*getEnvironment() return _env; }

    OCISvcCtx 
*getSvc() return _svc; }
private:
    Environment 
*_env;
protected:
    OCIServer 
*_srv;
    OCISvcCtx 
*_svc;
    OCISession 
*_auth;
}
;

class Statement
{
    friend 
class Connection;
protected:
    
static const size_t BUF_SIZE = 256;
    
struct TDefData
    
{
        TDefData(std::
string& val)
            : str(
&val), buf(NULL)
        
{
            buf 
= new char[BUF_SIZE];
        }


        std::
string* str;
        
char* buf;
    }
;
    typedef std::vector
<TDefData> TDefVector;
protected:
    Statement(Connection
* conn);
    
virtual ~Statement() {}

    
void syncDefVector();
    
void freeDefVector();
public:
    
int bindString(unsigned int pos, const std::string& val);
    
int defineString(unsigned int pos, std::string& val);

    
int execute();
    
int getNext();
private:
    Connection 
*_conn;
protected:
    O CIStmt 
*_stmt;

    TDefVector _vctDef;
}
;

}


std::ostream
& operator << (std::ostream& os, const ocipp::Exception& e);



ocipp.cpp


#include 
"ocipp.h"

namespace ocipp
{

Exception::Exception(
int code, const std::string &msg)
: _code(code)
, _msg(msg)
{
    getError(code);
}


Exception::Exception(
int code, OCIError* err, const std::string &msg)
: _code(code)
, _msg(msg)
{
    getError(code, err);
}


void Exception::getError(int code)
{
    
switch(code)
    
{
    
case OCI_SUCCESS:
        _msg 
= "(OCI_SUCCESS) - " + _msg;
        
break;
    
case OCI_SUCCESS_WITH_INFO:
        _msg 
= "(OCI_SUCCESS_WITH_INFO) - " + _msg;
        
break;
    
case OCI_NEED_DATA:
        _msg 
= "(OCI_NEED_DATA) - " + _msg;
        
break;
    
case OCI_NO_DATA:
        _msg 
= "(OCI_NODATA) - " + _msg;
        
break;
    
case OCI_ERROR:
        _msg 
= "(OCI_ERROR) - " + _msg;
        
break;
    
case OCI_INVALID_HANDLE:
        _msg 
= "(OCI_INVALID_HANDLE) - " + _msg;
        
break;
    
case OCI_STILL_EXECUTING:
        _msg 
= "(OCI_STILL_EXECUTE) - " + _msg;
        
break;
    
case OCI_CONTINUE:
        _msg 
= "(OCI_CONTINUE) - " + _msg;
        
break;
    
default:
        _msg 
= "(UNKNOWN) - " + _msg;
    }

}


void Exception::getError(int code, OCIError *err)
{
    getError(code);
    
//if(code == OCI_ERROR)
    {
        
char buf[512];
        OCIErrorGet((
void*)err, 1, NULL, &code, (OraText*)buf, sizeof(buf), OCI_HTYPE_ERROR);
        _msg 
+= "::";
        _msg 
+=  buf;
    }

}


void Exception::show(std::ostream &os) const
{
    os 
<< "[" << _code << "]" << _msg;
}


////

Environment::Environment(unsigned 
int mode)
: _env(NULL)
, _err(NULL)
{
    makeEnvironment(mode);    
}


Environment::
~Environment()
{
    
if(_err != NULL)
    
{
        OCIHandleFree((
void*)_err, OCI_HTYPE_ERROR);
        _err 
= NULL;
    }

    
if(_env != NULL)
    
{
        OCIHandleFree((
void*)_env, OCI_HTYPE_ENV);
        _env 
= NULL;
    }

}


void Environment::makeEnvironment(unsigned int mode)
{
    
int ret = OCIEnvCreate(&_env, mode, NULL, NULL, NULL, NULL, 0, NULL);
    
if(ret != OCI_SUCCESS || _env == NULL)
    
{
        
throw Exception(ret, "create Environment failed.");
    }

    
    ret 
= OCIHandleAlloc((const void*)_env, (void**)&_err, OCI_HTYPE_ERROR, 0, NULL);
    
if(ret != OCI_SUCCESS || _env == NULL)
    
{
        
throw Exception(ret, _err, "create Error failed.");
    }

}


Connection
* Environment::makeConnection(const std::string &user, const std::string &passwd, const std::string &server)
{
    Connection 
*conn = new Connection(this);

    
int ret = OCIHandleAlloc((const void*)_env, (void**)&(conn->_srv), OCI_HTYPE_SERVER, 0, NULL);
    
if((ret != OCI_SUCCESS && ret != OCI_SUCCESS_WITH_INFO) || conn->_srv == NULL)
    
{
        
throw Exception(ret, "create Server failed.");
    }


    ret 
= OCIHandleAlloc((const void*)_env, (void**)&(conn->_svc), OCI_HTYPE_SVCCTX, 0, NULL);
    
if(ret != OCI_SUCCESS || conn->_svc == NULL)
    
{
        
throw Exception(ret, "create ScvCtx failed.");
    }


    ret 
= OCIServerAttach(conn->_srv, _err, (const OraText*)server.c_str(), server.size(), 0);
    
if(ret != OCI_SUCCESS)
    
{
        
throw Exception(ret, _err, "attach Server failed.");
    }


    ret 
= OCIAttrSet((void*)conn->_svc, OCI_HTYPE_SVCCTX, (void*)conn->_srv, 0, OCI_ATTR_SERVER, _err);
    
if(ret != OCI_SUCCESS)
    
{
        
throw Exception(ret, _err, "set SVCCTX attrib failed.");
    }


    ret 
= OCIHandleAlloc((const void*)_env, (void**)&conn->_auth, OCI_HTYPE_SESSION, 0, NULL);
    
if(ret != OCI_SUCCESS || conn->_auth == NULL)
    
{
        
throw Exception(ret, "create Auth Session failed.");
    }


    ret 
= OCIAttrSet((void*)conn->_auth, OCI_HTYPE_SESSION, (void*)user.c_str(), user.size(), OCI_ATTR_USERNAME, _err);
    
if(ret != OCI_SUCCESS)
    
{
        
throw Exception(ret, _err, "set Username attrib failed.");
    }


    ret 
= OCIAttrSet((void*)conn->_auth, OCI_HTYPE_SESSION, (void*)passwd.c_str(), passwd.size(), OCI_ATTR_PASSWORD, _err);
    
if(ret != OCI_SUCCESS)
    
{
        
throw Exception(ret, _err, "set Password attrib failed.");
    }

    
    ret 
= OCISessionBegin(conn->_svc, _err, conn->_auth, OCI_CRED_RDBMS, OCI_DEFAULT);
    
if(ret != OCI_SUCCESS)
    
{
        
throw Exception(ret, _err, "Start session failed.");
    }


    OCIAttrSet((
void*)conn->_svc, OCI_HTYPE_SVCCTX, (void*)conn->_auth, 0, OCI_ATTR_SESSION, _err);

    
return conn;
}


void Environment::destroyConnection(ocipp::Connection *conn)
{
    
if(conn == NULL)
        
return;

    OCISessionEnd(conn
->_svc, _err, conn->_auth, OCI_DEFAULT);
    OCIServerDetach(conn
->_srv, _err, 0);

    OCIHandleFree((
void*)conn->_auth, OCI_HTYPE_SESSION);
    OCIHandleFree((
void*)conn->_svc, OCI_HTYPE_SVCCTX);
    OCIHandleFree((
void*)conn->_srv, OCI_HTYPE_SERVER);

    delete conn, conn 
= NULL;
}


////
Connection::Connection(ocipp::Environment *env)
: _env(env)
, _srv(NULL)
, _svc(NULL)
, _auth(NULL)
{
}


Statement
* Connection::makeStatement(const std::string &sql)
{
    Statement 
*stmt = new Statement(this);

    
int ret = OCIHandleAlloc((const void*)_env->getEnv(), (void**)&(stmt->_stmt), OCI_HTYPE_STMT, 0, NULL);
    
if(ret != OCI_SUCCESS || stmt->_stmt == NULL)
    
{
        
throw Exception(ret, "create Stmt fail.");
    }


    ret 
= OCIStmtPrepare(stmt->_stmt, _env->getError(), (const OraText*)sql.c_str(), sql.size(), OCI_NTV_SYNTAX, OCI_DEFAULT);
    
if(ret != OCI_SUCCESS)
    
{
        
throw Exception(ret, _env->getError(), "prepare Stmt failed.");
    }


    
return stmt;
}


void Connection::destroyStatement(ocipp::Statement *stmt)
{
    stmt
->freeDefVector();
    OCIHandleFree(stmt
->_stmt, OCI_HTYPE_STMT);
    delete stmt, stmt 
= NULL;
}


////
Statement::Statement(ocipp::Connection *conn)
: _conn(conn)
, _stmt(NULL)
{
}


int Statement::bindString(unsigned int pos, const std::string &val)
{
    OCIBind
* bd = NULL;
    
int ret = OCIBindByPos(_stmt, &bd, _conn->getEnvironment()->getError(), pos, (void*)val.c_str(), val.size() + 1/* very dangerous */, SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
    
if(ret != OCI_SUCCESS)
    
{
        
throw Exception(ret, _conn->getEnvironment()->getError(), "bind String failed.");
    }


    
return 0;
}


int Statement::defineString(unsigned int pos, std::string& val)
{
    TDefData data(val);
    OCIDefine
* def = NULL;
    
int ret = OCIDefineByPos(_stmt, &def, _conn->getEnvironment()->getError(), pos, (void*)data.buf, BUF_SIZE, SQLT_STR, NULL, NULL, NULL, OCI_DEFAULT);
    
if(ret != OCI_SUCCESS)
    
{
        
throw Exception(ret, _conn->getEnvironment()->getError(), "define String failed.");
    }

    _vctDef.push_back(data);

    
return 0;
}


int Statement::execute()
{
    unsigned 
short type = 0;
    
int ret = OCIAttrGet((const void*)_stmt, OCI_HTYPE_STMT, (void*)&type, 0, OCI_ATTR_STMT_TYPE, _conn->getEnvironment()->getError());
    
if(ret != OCI_SUCCESS)
    
{
        
throw Exception(ret, _conn->getEnvironment()->getError(), "get Stmt type failed.");
    }


    ret 
= OCIStmtExecute(_conn->getSvc(), _stmt, _conn->getEnvironment()->getError(), (type != OCI_STMT_SELECT ? 1 : 0), 0, NULL, NULL, OCI_COMMIT_ON_SUCCESS/*OCI_DEFAULT*/);
    
if(ret != OCI_SUCCESS)
    
{
        
throw Exception(ret, _conn->getEnvironment()->getError(), "execute Stmt failed.");
    }


    
//unsigned int rc = 0;
    
//ret = OCIAttrGet((const void*)_stmt, OCI_HTYPE_STMT, &rc, (ub4*)sizeof(rc), OCI_ATTR_ROW_COUNT, _conn->getEnvironment()->getError());
 
//   if(ret != OCI_SUCCESS)
 
//   {
 
//       throw Exception(ret, _conn->getEnvironment()->getError(), "get Stmt row_count failed.");
 
//   }
    return 0;
}


int Statement::getNext()
{
    
int ret = OCIStmtFetch2(_stmt, _conn->getEnvironment()->getError(), 1, OCI_FETCH_NEXT, 1, OCI_DEFAULT);
    
if(ret == OCI_NO_DATA)
        
return -1;
    
if(ret != OCI_SUCCESS)
    
{
        
throw Exception(ret, _conn->getEnvironment()->getError(), "fetch Stmt failed.");
    }


    syncDefVector();

    
return 0;
}


void Statement::syncDefVector()
{
    
for(TDefVector::iterator it = _vctDef.begin(); it != _vctDef.end(); ++ it)
    
{
        it
->str->assign(it->buf, strlen(it->buf));
    }

}


void Statement::freeDefVector()
{
    
for(TDefVector::iterator it = _vctDef.begin(); it != _vctDef.end(); ++ it)
    
{
        delete [] it
->buf;
    }

    _vctDef.clear();
}



}


/////
std::ostream& operator << (std::ostream& os, const ocipp::Exception& e)
{
    e.show(os);
    
return os;
}



posted on 2011-07-08 11:23 codejie 閱讀(2125) 評(píng)論(2)  編輯 收藏 引用 所屬分類: C++輪子精神

評(píng)論

# re: OCI : do NOT debug on TWO different windows 2011-07-10 15:02 pansunyou

我也封裝過(guò)類似的東西,DB2的CLI庫(kù),也就自己爽,別人都不敢用。  回復(fù)  更多評(píng)論   

# re: OCI : do NOT debug on TWO different windows 2011-07-11 14:38 codejie

@pansunyou
是的,很爽。。。  回復(fù)  更多評(píng)論   

公告

Using C++

導(dǎo)航

統(tǒng)計(jì)

留言簿(73)

隨筆分類(513)

積分與排名

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美www视频在线观看| 亚洲国产高清一区| 欧美一区二区三区精品| 亚洲视频在线一区观看| 91久久在线视频| 性色av香蕉一区二区| 欧美一区二区在线| 欧美在线播放| 女女同性女同一区二区三区91| 麻豆精品视频| 亚洲国产精品久久久久秋霞影院| 91久久精品国产91性色tv| 亚洲精品久久久久久久久| 亚洲最快最全在线视频| 亚洲制服欧美中文字幕中文字幕| 欧美中文日韩| 欧美精选午夜久久久乱码6080| 欧美日韩精选| 国产亚洲福利| 日韩视频精品在线| 午夜精品成人在线视频| 免费观看成人| av不卡免费看| 久久免费视频网站| 国产精品国产亚洲精品看不卡15| 国语自产精品视频在线看| 日韩一区二区久久| 久久久久久久久久久久久9999| 亚洲成色777777女色窝| 亚洲欧美日韩成人高清在线一区| 久久中文字幕一区| 国产精品美女久久久浪潮软件 | 国产精品久久久久三级| 樱桃视频在线观看一区| 亚洲淫性视频| 亚洲国产精品一区二区三区| 亚洲欧美另类综合偷拍| 欧美激情一区三区| 尤物yw午夜国产精品视频明星| 亚洲一区二区三区高清| 亚洲国产成人av好男人在线观看| 午夜精品理论片| 欧美日韩伦理在线免费| 亚洲高清自拍| 久久综合国产精品| 欧美亚洲一级片| 国产精品久久久久婷婷| 亚洲视频在线一区观看| 亚洲精品国产精品国自产观看| 久久精品国产69国产精品亚洲| 欧美视频官网| 亚洲性线免费观看视频成熟| 亚洲精品国产视频| 蜜臀久久99精品久久久画质超高清| 国产欧美一区二区三区久久| 亚洲欧美日韩人成在线播放| 一区二区三区国产盗摄| 欧美三级乱人伦电影| 免费亚洲一区二区| 欧美精品在线极品| 亚洲国产第一页| 欧美成人日韩| 免费黄网站欧美| 亚洲人成网站777色婷婷| 欧美ab在线视频| 久久综合给合| 亚洲激情视频在线观看| 亚洲高清不卡av| 欧美精品在线观看播放| 中文久久精品| 午夜免费在线观看精品视频| 国产欧美一区二区色老头| 欧美专区一区二区三区| 欧美伊人久久久久久午夜久久久久 | 国内久久视频| 欧美成人亚洲成人| 欧美韩国日本一区| 亚洲少妇一区| 性色av一区二区三区| 在线观看一区二区精品视频| 亚洲大片在线| 国产精品久久77777| 久久久久免费观看| 欧美极品在线视频| 亚洲欧美一区二区视频| 久久精品成人| 一区二区三区欧美视频| 亚洲欧美色婷婷| 亚洲黄色免费电影| 一区二区三区黄色| 永久555www成人免费| 亚洲欧洲午夜| 国产一区视频观看| 亚洲美女免费视频| 黄色亚洲在线| 一本色道综合亚洲| 136国产福利精品导航网址| 亚洲日本中文字幕免费在线不卡| 国产精品免费在线| 亚洲第一页中文字幕| 国产精品一二三| 亚洲福利视频一区二区| 国产欧美日韩一区| 亚洲欧洲一区| 影音先锋亚洲一区| 亚洲一区免费在线观看| 亚洲欧洲日产国产网站| 欧美亚洲日本一区| 亚洲视频在线观看三级| 蜜臀av在线播放一区二区三区| 午夜精彩国产免费不卡不顿大片| 牛牛国产精品| 老牛嫩草一区二区三区日本| 国产精品久久久免费| 亚洲精品中文在线| 亚洲日本无吗高清不卡| 久久久999精品免费| 性做久久久久久免费观看欧美| 欧美日韩高清在线| 国产精品私房写真福利视频 | 国产精品毛片| 亚洲福利一区| 1024国产精品| 久久精品动漫| 久久久国产视频91| 国产精品私拍pans大尺度在线| 日韩午夜av| 一区二区欧美国产| 欧美精品aa| 亚洲国产视频一区二区| 亚洲国产视频直播| 猛男gaygay欧美视频| 欧美成人嫩草网站| 亚洲欧洲三级电影| 欧美激情一区在线| 亚洲精品一区二区三区婷婷月| 亚洲伦伦在线| 欧美日韩中国免费专区在线看| 亚洲精品国产欧美| 亚洲一区二区av电影| 欧美亚州韩日在线看免费版国语版| 亚洲免费观看在线视频| 中国av一区| 欧美日韩在线视频首页| 亚洲卡通欧美制服中文| 亚洲一区中文| 国产日韩欧美在线| 欧美在线不卡视频| 免费视频一区| 日韩天堂在线视频| 欧美亚州在线观看| 欧美在线视频观看| 免费高清在线一区| 亚洲激情在线视频| 欧美激情欧美激情在线五月| 亚洲国产精品一区| 亚洲线精品一区二区三区八戒| 欧美亚洲不卡| 久久精品噜噜噜成人av农村| 欧美激情精品久久久久久黑人| 亚洲免费高清| 国产精品亚洲综合天堂夜夜| 久久久精品欧美丰满| 亚洲国产裸拍裸体视频在线观看乱了 | 午夜日韩电影| 欧美国产一区二区在线观看| 99精品视频免费| 国产精品久久久久久模特| 久久国产精品亚洲77777| 欧美激情2020午夜免费观看| 亚洲一区二区成人| 激情六月婷婷综合| 欧美日韩国产欧美日美国产精品| 亚洲永久免费观看| 欧美va亚洲va国产综合| 亚洲网站视频| 一区二区视频免费在线观看| 欧美日韩久久精品| 久久精品网址| 亚洲一级影院| 亚洲国产高清在线观看视频| 小嫩嫩精品导航| 亚洲精品一区在线| 国产一区二区剧情av在线| 欧美伦理a级免费电影| 欧美一级大片在线免费观看| 亚洲欧洲av一区二区| 久久人人九九| 亚洲香蕉在线观看| 亚洲黄色在线看| 国产一区二区三区在线观看网站| 蜜桃久久精品乱码一区二区| 欧美一区二区在线视频| 一本色道久久综合亚洲精品按摩| 欧美好骚综合网| 狂野欧美一区| 久久不射网站| 亚洲欧美另类久久久精品2019| 亚洲精选久久| 亚洲国产黄色片|