OLEDB ATL模板类调用带返回值跟游标的oracle存储过程
OLEDB ATL模板类调用带返回值和游标的oracle存储过程
关于OLEDB ATL模板类调用带返回值和游标的oracle存储过程,哪位大神能给个完整的DEMO,谢谢
------解决思路----------------------
关于OLEDB ATL模板类调用带返回值和游标的oracle存储过程,哪位大神能给个完整的DEMO,谢谢
------解决思路----------------------
#include <sstream>
#include <ace/Auto_Ptr.h>
#include <DBOracle.h>
#include "AppDBAccess.h"
extern string g_db;
extern string g_host;
extern string g_user;
extern string g_passwd;
extern string g_connection_mode;
extern DBManager<DBOracle> *g_p_db_manager;
using namespace std;
using namespace oracle;
int DBAccessHelper::connectionKeepAlive() {
// if (g_connection_mode=="short") {
DBManager<DBOracle> m_db_manager(g_db, g_user, g_passwd, g_host, 1, 6);
Connection_Guard<DBOracle> dd(&m_db_manager);
// } else {//(g_connection_mode=="long")
// Connection_Guard<DBOracle> dd(g_p_db_manager);
// }
oracle::Connection* p_conn = dd.getConnection();
if ( !p_conn ) {
return -1;
}
auto_ptr<oracle::Statement> pStmt;
try {
pStmt.reset(p_conn->createStatement("begin :cursor := sp_test( :n1, :s2 ); end;"));
pStmt->setCursor(1);
int n1=1;
pStmt->setInt(2,&n1);
pStmt->setString(3,"HaHa!",5+1);
// pStmt.reset(p_conn->createStatement("select * from DUAL"));
auto_ptr<oracle::Resultset> pRs;
pRs.reset(pStmt->executeQuery());
int recnum=0;
while (1) {
if ( pRs->next() ) {
int rint;
std::string rstr;
recnum++;
rstr = pRs->getString( "A" );
rstr = pRs->getString( "B" );
rstr = pRs->getString( "C" );
rint = pRs->getInt( "C1" );
rint = pRs->getInt( "C2" );
// rstr = pRs->getString( 0 );
} else {
break;//
}
}
} catch ( oracle::SQLException& ex ) {
return -3;
}
return 0;
}
...
void Statement::setCursor( int intParamIndex )
{
OCIBind* pbnd;
if (OCIBindByPos ( _pstmth,
&pbnd,
_perrh,
intParamIndex,
&_cursor,
0,
SQLT_RSET,
(ub2 *) 0,
(ub2 *) 0,
(ub4) 0,
(ub4) 0,
(ub4 *) 0,
(ub4) OCI_DEFAULT))
{
throw SQLException( _perrh );
} else {
cursorBinded=TRUE;
// ACE_DEBUG( ( LM_DEBUG, "[%D %T] [DEBUG] (%N:%l)\tsetCursor\n" ) );
}
}