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; } }
该库主要由OracleConnect函数和OracleDisconnect函数组成,前者用于连接Oracle数据库,后者用于断开连接。通过调用这两个函数,我们就可以在C语言中直接实现与Oracle数据库的交互。
不仅如此,我们还可以通过这个封装出来的库来实现诸如数据增删改查、存储过程等操作,从而更加方便地操作Oracle数据库系统。例如下面是一个C语言连接Oracle数据库后查询一个表格数据的例子:
OracleConnect("orcl", "scott", "tiger"); OCIStmt* p_sqlstatement; OCIStmtPrepare(p_sqlstatement, conn-> p_err, (CONST OraText*)"SELECT * FROM emp; ", strlen("SELECT * FROM emp; "), OCI_NTV_SYNTAX, OCI_DEFAULT); OCIStmtExecute(conn-> p_svc, p_sqlstatement, conn-> p_err, 1, 0, NULL, NULL, OCI_DEFAULT); OCIStmtFetch(p_sqlstatement, conn-> p_err, conn-> n_nrows, OCI_FETCH_NEXT, OCI_DEFAULT);
在这个例子中,我们先是通过OracleConnect函数获取到一个数据库连接,然后定义了一个SQL语句,语句中查询了表格emp中的所有数据。接着使用OCIStmtPrepare函数将这些语句封装到一个C语言类型中,然后再使用OCIStmtExecute函数将其传递给Oracle数据库进行执行。
最后通过OCIStmtFetch函数把查询结果存储到C语言中。这个例子充分说明了C语言与Oracle数据库之间的交互可以通过封装一个库来实现。
综上所述,C语言与Oracle数据库之间的交互可以通过封装一个库来实现,在C语言中,我们可以直接使用这个库中的函数来完成数据增删改查、存储过程等功能,从而更加方便地操作Oracle数据库系统。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: c oracle封装
本文地址: https://pptw.com/jishu/504949.html