OCI連接配接ORACLE
需要下載下傳ORACLE 用戶端 instanclient_11_2 或者其他版本 ,環境變量加入路徑
動态連結oci.dll
代碼
<pre name="code" class="cpp">#include "StdAfx.h"
#include "OracleOci.h"
typedef sword (*OCI_FUN_CREATE)(OCIEnv**,ub4,void*,void*,void*,void*,size_t,void**);
typedef sword (*OCI_FUN_HANDLEALLOC)(void*,void**,ub4,size_t,void**);
typedef sword (*OCI_FUN_SERVERATTACH) (OCIServer*,OCIError*,OraText*,sb4,ub4);
typedef sword (*OCI_FUN_FREE) (void*,ub4);
typedef sword (*OCI_FUN_ERRORGET)(void*,ub4,OraText*,sb4*,OraText*,ub4,ub4);
typedef sword (*OCI_FUN_ATTRSET)(void*,ub4,void*,ub4,ub4,OCIError*);
typedef sword (*OCI_FUN_ATTRGET)(void*,ub4,void*,ub4*,ub4,OCIError*);
typedef sword (*OCI_FUN_SESSIONBEGIN)(OCISvcCtx*,OCIError*,OCISession*,ub4,ub4);
typedef sword (*OCI_FUN_STMTPREPARE)(OCIStmt*,OCIError*,const OraText*,ub4,ub4,ub4);
typedef sword (*OCI_FUN_DEFINEBYPOS)(OCIStmt*,OCIDefine**,OCIError*,ub4,void*,sb4,ub2,void*,ub2*,ub2*,ub4);
typedef sword (*OCI_FUN_STMTEXECUTE)(OCISvcCtx*, OCIStmt*,OCIError*,ub4,ub4,const OCISnapshot*,OCISnapshot*,ub4);
typedef sword (*OCI_FUN_STMTFETCH2)(OCIStmt*,OCIError*,ub4,ub2,sb4,ub4);
typedef sword (*OCI_FUN_TRANSCOMMIT)(OCISvcCtx*,OCIError*,ub4);
typedef sword (*OCI_FUN_SERVERDETACH)(OCIServer*,OCIError*,ub4);
typedef sword (*OCI_FUN_LOGOFF)(OCISvcCtx*, OCIError*);
OCI_FUN_CREATE pOci_Create = 0;
OCI_FUN_HANDLEALLOC pOci_HandleAlloc = 0;
OCI_FUN_SERVERATTACH pOci_ServerAttach = 0;
OCI_FUN_FREE pOci_Free = 0;
OCI_FUN_ERRORGET pOci_ErrorGet = 0;
OCI_FUN_ATTRSET pOci_AttrSet = 0;
OCI_FUN_ATTRGET pOci_AttrGet = 0;
OCI_FUN_SESSIONBEGIN pOci_SessionBegin = 0;
OCI_FUN_STMTPREPARE pOci_StmtPrepare = 0;
OCI_FUN_DEFINEBYPOS pOci_DefineByPos = 0;
OCI_FUN_STMTEXECUTE pOci_StmtExecute = 0;
OCI_FUN_STMTFETCH2 pOci_StmtFetch2 = 0;
OCI_FUN_TRANSCOMMIT pOci_TransCommit = 0;
OCI_FUN_SERVERDETACH pOci_ServerDetach = 0;
OCI_FUN_LOGOFF pOci_Logoff = 0;
OracleOci::OracleOci(void)
{
env = NULL;
serv = NULL;
err = NULL;
usr = NULL;
svc = NULL;
stm = NULL;
hdll = NULL;
}
OracleOci::~OracleOci(void)
{
}
int OracleOci::InitaliOle()
{
hdll = LoadLibrary(_T("oci.dll"));
pOci_Create = (OCI_FUN_CREATE)GetProcAddress(hdll, "OCIEnvCreate");
pOci_HandleAlloc = (OCI_FUN_HANDLEALLOC)GetProcAddress(hdll,"OCIHandleAlloc");
pOci_ServerAttach =(OCI_FUN_SERVERATTACH)GetProcAddress(hdll,"OCIServerAttach");
pOci_ErrorGet = (OCI_FUN_ERRORGET)GetProcAddress(hdll,"OCIErrorGet");
pOci_Free = (OCI_FUN_FREE)GetProcAddress(hdll,"OCIHandleFree");
pOci_AttrSet = (OCI_FUN_ATTRSET)GetProcAddress(hdll,"OCIAttrSet");
pOci_SessionBegin = (OCI_FUN_SESSIONBEGIN)GetProcAddress(hdll,"OCISessionBegin");
pOci_StmtPrepare = (OCI_FUN_STMTPREPARE)GetProcAddress(hdll,"OCIStmtPrepare");
pOci_DefineByPos = (OCI_FUN_DEFINEBYPOS)GetProcAddress(hdll,"OCIDefineByPos");
pOci_AttrGet = (OCI_FUN_ATTRGET)GetProcAddress(hdll,"OCIAttrGet");
pOci_StmtExecute = (OCI_FUN_STMTEXECUTE)GetProcAddress(hdll,"OCIStmtExecute");
pOci_StmtFetch2 = (OCI_FUN_STMTFETCH2)GetProcAddress(hdll,"OCIStmtFetch2");
pOci_TransCommit = (OCI_FUN_TRANSCOMMIT)GetProcAddress(hdll,"OCITransCommit");
pOci_ServerDetach = (OCI_FUN_SERVERDETACH)GetProcAddress(hdll,"OCIServerDetach");
pOci_Logoff = (OCI_FUN_LOGOFF)GetProcAddress(hdll,"OCILogoff");
if (hdll == NULL || pOci_AttrGet == 0 || pOci_AttrSet == 0 || pOci_Create == 0 || pOci_DefineByPos == 0 || pOci_ErrorGet == 0 ||
pOci_Free == 0 || pOci_HandleAlloc == 0 || pOci_ServerAttach == 0 || pOci_SessionBegin == 0 || pOci_StmtExecute == 0 ||
pOci_StmtFetch2 == 0 || pOci_StmtPrepare == 0 || pOci_TransCommit == 0 || pOci_ServerDetach == 0 || pOci_Logoff == 0)
{
return -1;
}
return 0;
}
bool OracleOci::InitialiServ(string db)
{
sword swResult;
swResult = (pOci_Create)(&env,OCI_DEFAULT,NULL,NULL,NULL,NULL,0,NULL);
if (swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO)
{
AfxMessageBox("Oracle init server error\n");
return false;
}
(pOci_HandleAlloc)((dvoid*)env,(dvoid**)&err,OCI_HTYPE_ERROR,(size_t)0,(dvoid**)0);
(pOci_HandleAlloc)((dvoid *)env,(dvoid **)&serv,OCI_HTYPE_SERVER,(size_t)0,(dvoid **)0);
swResult = (pOci_ServerAttach)(serv,err,(text *)db.c_str(),strlen(db.c_str()),0);
if (swResult != OCI_SUCCESS)
{
int errcno;
char errbuf[512]= "";
sb4 errcode;
(pOci_ErrorGet)((dvoid *)err,(ub4)1,(text *)NULL,&errcode,(ub1*)errbuf,(ub4)sizeof(errbuf),OCI_HTYPE_ERROR);
errcno = errcode;
AfxMessageBox("Oracle server attach error :%d\n",errcno);
ReleaseServ();
return false;
}
//AfxMessageBox("Oracle server attach success");
return true;
}
bool OracleOci::ConnOracle(string user,string pwd)
{
err = NULL;
(pOci_HandleAlloc)((dvoid*)env,(dvoid **)&err,OCI_HTYPE_ERROR,(size_t)0,(dvoid**)0);
(void)pOci_HandleAlloc((dvoid*)env,(dvoid **)&svc,OCI_HTYPE_SVCCTX,(size_t)0,(dvoid**)0);
(void)pOci_AttrSet((dvoid*)svc,OCI_HTYPE_SVCCTX,(dvoid*)serv,(ub4)0,OCI_ATTR_SERVER,(OCIError*)err);
(void)pOci_HandleAlloc((dvoid*)env,(dvoid **)&usr,OCI_HTYPE_SESSION,(size_t)0,(dvoid**)0);
(void)pOci_AttrSet((dvoid*)usr,(ub4)OCI_HTYPE_SESSION,(dvoid*)user.c_str(),(ub4)strlen(user.c_str()),(ub4)OCI_ATTR_USERNAME,err);
(void)pOci_AttrSet((dvoid*)usr,(ub4)OCI_HTYPE_SESSION,(dvoid*)pwd.c_str(),(ub4)strlen(pwd.c_str()),(ub4)OCI_ATTR_PASSWORD,err);
if (pOci_SessionBegin(svc,err,usr,OCI_CRED_RDBMS,(ub4)OCI_DEFAULT) != OCI_SUCCESS)
{
int errcno;
char errbuf[512]= "";
sb4 errcode;
//擷取錯誤指針和OCI錯誤代碼
pOci_ErrorGet((dvoid *)err,(ub4)1,(text *)NULL,&errcode,(ub1*)errbuf,(ub4)sizeof(errbuf),OCI_HTYPE_ERROR);
errcno = errcode;
AfxMessageBox("User session error : %d\n",errcno);
ReleaseServ();
return false;
}
TRACE("user session success");
(void)pOci_AttrSet((dvoid*)svc,(ub4)OCI_HTYPE_SVCCTX,(dvoid*)usr,(ub4)0,(ub4)OCI_ATTR_SESSION,err);
return true;
}
int OracleOci::SelectItem(string sqlcmd,CString & num)
{
//查詢
err = NULL;
if (pOci_HandleAlloc((dvoid*)env,(dvoid**)&stm,(ub4)OCI_HTYPE_STMT,size_t(0),(dvoid**)0) != OCI_SUCCESS)
{
TRACE("Create Stmt err\n");
return false;
}
pOci_HandleAlloc((dvoid*)env,(dvoid **)&err,OCI_HTYPE_ERROR,size_t(0),(dvoid **)0);
//char sql[MAX_PATH] = "select * from VIDEO_ROLE";
if (pOci_StmtPrepare(stm,err,(text *)sqlcmd.c_str(),(ub4)strlen(sqlcmd.c_str()),(ub4)OCI_NTV_SYNTAX,(ub4)OCI_DEFAULT) != OCI_SUCCESS)
{
TRACE("creat prepare error\n");
return false;
}
TRACE("creat prepare success\n");
OCIDefine * tp1 = NULL;
OCIDefine * tp2 = NULL;
//struct result rst;
char t_res[100] = "";
ub2 datalen = 0;
char isnull[6] = "";
pOci_DefineByPos(stm,&tp1,err,1,(dvoid * )&t_res,sizeof(t_res),SQLT_CHR,NULL,&datalen,NULL,OCI_DEFAULT);
//pOci_DefineByPos(stm,&tp2,err,2,(dvoid *)&rst.cname,sizeof(rst.cname),SQLT_STR,NULL,&datalen,NULL,OCI_DEFAULT);
ub2 stm_type;
pOci_AttrGet((dvoid *)stm,(ub4)OCI_HTYPE_STMT,(dvoid *)&stm_type,(ub4*)0,(ub4)OCI_ATTR_STMT_TYPE,err);
pOci_StmtExecute(svc,stm,err,(ub4)0,(ub4)0,(OCISnapshot*)NULL,(OCISnapshot*)NULL,OCI_DEFAULT);
int row_fetched = 0;
do
{
//輸出結果
} while (pOci_StmtFetch2(stm,err,(ub4)1,OCI_FETCH_NEXT,1,OCI_DEFAULT) != OCI_NO_DATA);
num = t_res;
//獲得條數
pOci_AttrGet(stm,OCI_HTYPE_STMT,(dvoid *)&row_fetched,(ub4*)sizeof(row_fetched),OCI_ATTR_ROW_COUNT,err);
//輸出條目數
return row_fetched;
}
bool OracleOci::InsertItem(char* sqlcmd)
{
if (pOci_HandleAlloc((dvoid*)env,(dvoid**)&stm,(ub4)OCI_HTYPE_STMT,size_t(0),(dvoid**)0) != OCI_SUCCESS)
{
TRACE("Create Stmt err\n");
return false;
}
pOci_HandleAlloc((dvoid*)env,(dvoid **)&err,OCI_HTYPE_ERROR,size_t(0),(dvoid **)0);
sb4 t_result = 0;
//char sql_insert_file[500] = "insert into video_file (id,video_data_id,real_name,physical_location,suffix,yuan_location,status,bytes,create_dept,create_person,create_person_id,create_dept_id,total_bytes,finished_bytes,is_finished) \
values('40000','40000','zzh201511251150.MP4','d:\\VideoUpload\\zzzzzz\\VIDEO\\zzh201511251150.MP4','.MP4','d:\\VideoUpload\\zzzzzz\\VIDEO\\zzh201511251150.MP4','1','412065040','大冶法院','管理者','U0001','M001','0','0','0')";
if (pOci_StmtPrepare(stm,err,(text *)sqlcmd,(ub4)strlen(sqlcmd),(ub4)OCI_NTV_SYNTAX,(ub4)OCI_DEFAULT) != OCI_SUCCESS)
{
TRACE("creat prepare error\n");
return false;
}
t_result = pOci_StmtExecute(svc,stm,err,(ub4)1,(ub4)0,(OCISnapshot*)NULL,(OCISnapshot*)NULL,OCI_DEFAULT | OCI_COMMIT_ON_SUCCESS);
if (t_result != OCI_SUCCESS)
{
int errcno;
char errbuf[512]= "";
sb4 errcode;
//擷取錯誤指針和OCI錯誤代碼
pOci_ErrorGet((dvoid *)err,(ub4)1,(text *)NULL,&errcode,(ub1*)errbuf,(ub4)sizeof(errbuf),OCI_HTYPE_ERROR);
errcno = errcode;
TRACE("User session error\n");
ReleaseServ();
return false;
}
return true;
}
void OracleOci::ReleaseServ()
{
pOci_Logoff(svc,err);
pOci_ServerDetach(serv,err,OCI_DEFAULT);
pOci_Free((dvoid *)env,OCI_HTYPE_ENV);
pOci_Free((dvoid *)serv,OCI_HTYPE_SERVER);
pOci_Free((dvoid *)err,OCI_HTYPE_ERROR);
if(hdll != NULL)
{
FreeLibrary(hdll);
}
}