天天看點

OCI動态連結ORACLE

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); 
	}
}