c oracle封装
Oracle是一种被广泛使用的关系型数据库系统,而C语言则是一种被广泛应用于系统编程和嵌入式设备上的高级编程语言。为了方便使用Oracle数据库系统,在C语言开发中经常会出现用C语言与Oracle数据库进行直接交互的情况,为了更加方便使用,C语言中也出现了用来封装Oracle的库。
下面给出一个封装好的Oracle数据库库的例子:
#include#include#include#includetypedef struct { OCIEnv* p_env; OCIError* p_err; OCISvcCtx* p_svc; OCIStmt* p_stmt; OCIDefine* p_define; OCIBind* p_bind; OCIServer* p_server; OCISession* p_session; OCIParam* p_param; ub4 n_nrows; ub2 n_ncols; } ConnInfo; ConnInfo* OracleConnect(const char* sz_dbname, const char* sz_user, const char* sz_pwd) { ConnInfo* conn = NULL; OCIEnv* env = NULL; OCIError* err = NULL; OCISvcCtx* svc = NULL; OCIServer* server = NULL; OCISession* session = NULL; sword s_ret = OCI_SUCCESS; const char* sz_db = "192.168.1.100:1521/orcl"; if (OCIEnvCreate(&env, OCI_THREADED|OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL)) { printf("OCIEnvCreate Error!\n"); return NULL; } if (OCIHandleAlloc(env, (void**)&err, OCI_HTYPE_ERROR, 0, NULL)) { printf("OCIHandleAlloc OCI_HTYPE_ERROR Error!\n"); return NULL; } if (OCIHandleAlloc(env, (void**)&server, OCI_HTYPE_SERVER, 0, NULL)) { printf("OCIHandleAlloc OCI_HTYPE_SERVER Error!\n"); return NULL; } s_ret = OCIServerAttach(server, err, (OraText*)sz_dbname, strlen(sz_dbname), 0); if (s_ret != OCI_SUCCESS) { if (s_ret == OCI_INVALID_HANDLE) { printf("OCIServerAttach OCI_INVALID_HANDLE Error!\n"); } else if (s_ret == OCI_SUCCESS_WITH_INFO) { printf("OCIServerAttach OCI_SUCCESS_WITH_INFO Error!\n"); } else { printf("OCIServerAttach Error!\n"); } return NULL; } if (OCIHandleAlloc(env, (void**)&session, OCI_HTYPE_SESSION, 0, NULL)) { printf("OCIHandleAlloc OCI_HTYPE_SESSION Error!\n"); return NULL; } if (OCIAttrSet(session, OCI_HTYPE_SESSION, (void*)sz_user, strlen(sz_user), OCI_ATTR_USERNAME, err)) { printf("OCIAttrSet OCI_ATTR_USERNAME Error!\n"); return NULL; } if (OCIAttrSet(session, OCI_HTYPE_SESSION, (void*)sz_pwd, strlen(sz_pwd), OCI_ATTR_PASSWORD, err)) { printf("OCIAttrSet OCI_ATTR_PASSWORD Error!\n"); return NULL; } s_ret = OCISessionBegin(svc, err, session, OCI_CRED_RDBMS, OCI_DEFAULT); if (s_ret != OCI_SUCCESS) { if (s_ret == OCI_INVALID_HANDLE) { printf("OCISessionBegin OCI_INVALID_HANDLE Error!\n"); } else if (s_ret == OCI_SUCCESS_WITH_INFO) { printf("OCISessionBegin OCI_SUCCESS_WITH_INFO Error!\n"); } else { printf("OCISessionBegin Error!\n"); } return NULL; } if (OCIHandleAlloc(env, (void**)&svc, OCI_HTYPE_SVCCTX, 0, NULL)) { printf("OCIHandleAlloc OCI_HTYPE_SVCCTX Error!\n"); return NULL; } if (OCIAttrSet(svc, OCI_HTYPE_SVCCTX, (void*)server, sizeof(server), OCI_ATTR_SERVER, err)) { printf("OCIAttrSet OCI_ATTR_SERVER Error!\n"); return NULL; } if (OCIAttrSet(svc, OCI_HTYPE_SVCCTX, (void*)session, sizeof(session), OCI_ATTR_SESSION, err)) { printf("OCIAttrSet OCI_ATTR_SESSION Error!\n"); return NULL; } conn = (ConnInfo*)malloc(sizeof(ConnInfo)); memset(conn, 0, sizeof(ConnInfo)); conn->p_env = env; conn->p_err = err; conn->p_svc = svc; conn->p_server = server; conn->p_session = session; return conn; } void OracleDisconnect(ConnInfo* conn) { if (conn) { OCIHandleFree((void*)conn->p_err, OCI_HTYPE_ERROR); OCIHandleFree((void*)conn->p_server, OCI_HTYPE_SERVER); OCIHandleFree((void*)conn->p_session, OCI_HTYPE_SESSION); OCIHandleFree((void*)conn->p_svc, OCI_HTYPE_SVCCTX); OCIHandleFree((void*)conn->p_stmt, OCI_HTYPE_STMT); OCIHandleFree((void*)conn->p_define, OCI_HTYPE_DEFINE); OCIHandleFree((void*)conn->p_bind, OCI_HTYPE_BIND); OCIHandleFree((void*)conn->p_param, OCI_HTYPE_PARAM); OCIHandleFree((void*)conn->p_env, OCI_HTYPE_ENV); free(conn); conn = NULL; } }