日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Oracle調用接口(OCI)源碼剖析(3):關閉數據庫連接

Oracle調用接口(OCI)源碼剖析(3):關閉數據庫連接

來源:程序員人生   發布時間:2016-10-07 10:16:00 閱讀次數:3293次

概述
繼創建數據庫連接和履行SQL語句并獲得結果以后,我們繼續對OCI中關閉數據庫連接的源碼進行剖析。該操作主要是由CDbCloseDb函數完成的。

下面對這個函數的源碼進行分析。

OCI中履行關閉數據庫連接的源碼剖析
在OCI中,CDbCloseDb函數的代碼以下:

void CDbCloseDb(void *hDb) { CDb *pCDb = NULL; if (NULL == hDb) { return; } pCDb = (CDb *)hDb; DoDbFree(pCDb->hdbc); DoRecFree(pCDb->hRec); OsRetUB((UINT8*)hDb); return; }

從該函數的代碼實現中,我們可以看到:
1)該函數的輸入參數只有1個:數據庫連接句柄。同時,該函數還調用了3個函數,DoDbFree用于釋放數據庫連接,DoRecFree用于釋放數據庫結果集行數據緩沖區,OsRetUB用于釋放操作系統的數據庫內存。

2)CDb結構體用于寄存數據庫連接句柄數據,其聲明以下:

typedef struct CDbTag { INT32 iDbType; /* 數據庫類型 0:sqlservr1:sybase 2:oracle*/ OCIHDBC hdbc; /* 全局OCI句柄 */ CDbRecordset *hRec; /* 行結果集數據結構指針 */ }CDb;

釋放數據庫連接的DoDbFree函數的代碼以下:

static void DoDbFree(OCIHDBC hdbc) { if (NULL == hdbc) { return; } OCISessionEnd(hdbc->svchp, hdbc->errhp, hdbc->authp, (ub4)0); OCIServerDetach(hdbc->srvhp, hdbc->errhp, (ub4)OCI_DEFAULT); OCIHandleFree((dvoid *)hdbc->srvhp, (ub4)OCI_HTYPE_SERVER); OCIHandleFree((dvoid *)hdbc->svchp, (ub4)OCI_HTYPE_SVCCTX); OCIHandleFree((dvoid *)hdbc->errhp, (ub4)OCI_HTYPE_ERROR); OCIHandleFree((dvoid *)hdbc->authp, (ub4)OCI_HTYPE_SESSION); OCIHandleFree((dvoid *)hdbc->envhp, (ub4)OCI_HTYPE_ENV); OsRetUB((UINT8*)hdbc); hdbc = NULL; }

從該函數的代碼實現中,我們可以看到:
1)該函數調用OCI底層的函數來分別釋放與數據庫相干的句柄,這些句柄定義在OCIHDBC結構體中。

2)OCIHDBC結構體的聲明以下:

/* 所有OCI主要句柄數據結構 */ typedef struct { OCIEnv *envhp; /* 環境句柄 */ OCIError *errhp; /* 毛病句柄 */ OCIServer *srvhp; /* 服務器句柄 */ OCISvcCtx *svchp; /* 服務環境句柄 */ OCISession *authp; /* 會話句柄 */ OCIStmt *stmthp; /* 語句句柄 */ }t_envctx; typedef t_envctx *OCIHDBC;

釋放數據庫結果集行數據緩沖區的DoRecFree函數的代碼以下:

static void DoRecFree(CDbRecordset*hRecordset) { if (NULL != hRecordset) { OsRetUB((UINT8*)hRecordset); } }

從該函數的代碼實現中,我們可以看到:
1)該函數調用OsRetUB函數來釋放數據緩沖區。

2)結果集行數據結構體的聲明以下:

typedef struct CDbRecordsetTag { void *cmd; /* 命令緩沖區 */ int sqltype; /* 1:select 2:other*/ int colCount; /* 返回列數 */ char colfieldname[CDB_MAX_COL_NUM][40];/*每列列名 */ int colfieldlength[CDB_MAX_COL_NUM]; /* 列名寬度 */ int pColWidth[CDB_MAX_COL_NUM]; /* 每列寬度 */ int pColType[CDB_MAX_COL_NUM]; /* 列類型 */ char pRecordBuf[CDB_MAX_COL_NUM][CDB_MAX_COL_WIDTH];/* 列數據 */ int pRetColWidth[CDB_MAX_COL_NUM]; short pRetIndicator[CDB_MAX_COL_NUM]; } CDbRecordset;

關閉數據庫連接CDbCloseDb函數調用
當我們獲得到了數據庫的返回結果以后,如果不再需要使用數據庫了,那末就要調用CDbCloseDb函數關閉數據庫連接。

CDbCloseDb函數調用的示例代碼以下:

INT32 main(void) { INT8 szDBServerName[50] = {0}; INT8 szDBName[50] = {0}; INT8 szDBUser[50] = {0}; INT8 szDBPwd[50] = {0}; INT8 szSqlBuf[100] = {0}; INT8 szRcvBuf[100] = {0}; INT32 iRetVal = 0; void *pDBHandle = NULL; // 獲得數據庫各參數的值 memcpy(szDBServerName, "db192_1_8_13",strlen("db192_1_8_13")); memcpy(szDBName, "dbp_166", strlen("dbp_166")); memcpy(szDBUser, "dbp_166", strlen("dbp_166")); memcpy(szDBPwd, "dbp_166", strlen("dbp_166")); // 連接數據庫 pDBHandle = CDbCreateDb("Oracle", szDBServerName, szDBName, szDBUser,szDBPwd); if (pDBHandle == NULL) // 連接失敗 { printf("ConnectDB failed! ServiceName:%s, DBName:%s, User:%s,Pwd:%s\n", szDBServerName, szDBName, szDBUser, szDBPwd); return -1; } printf("ConnectDB success! ServiceName:%s, DBName:%s, User:%s,Pwd:%s\n", szDBServerName, szDBName, szDBUser, szDBPwd); // 履行SQL語句并獲得結果 // 獲得SQL語句 memcpy(szSqlBuf, "select boxnumber from tb_test where id=1",strlen("select boxnumber from tb_test where id=1")); // 調用CDbExecSql函數履行SQL語句 iRetVal = CDbExecSql(pDBHandle, szSqlBuf); if (iRetVal != 0) // 履行失敗 { printf("CDbExecSql failed! RetVal=%d (ServiceName:%s, DBName:%s,User:%s, Pwd:%s)\n", iRetVal, szDBServerName, szDBName, szDBUser, szDBPwd); return -1; } // 調用CDbFetch函數獲得數據庫返回的結果 iRetVal = CDbFetch(pDBHandle, szRcvBuf, 100); if (iRetVal != 0) // 履行失敗 { printf("CDbFetch failed! RetVal=%d (ServiceName:%s, DBName:%s,User:%s, Pwd:%s)\n", iRetVal, szDBServerName, szDBName, szDBUser,szDBPwd); return -1; } // 打印從數據庫中獲得到的結果 printf("RcvBuf=%s\n", szRcvBuf); // 調用CDbCloseDb函數關閉數據庫連接 CDbCloseDb(pDBHandle); pDBHandle = NULL; // 將數據庫句柄指針置為空 return 0; }

說明:
1)CDbCloseDb函數的輸入參數是:數據庫句柄指針,數據庫句柄是由CDbCreateDb函數履行以后取得的。

2)CDbCloseDb函數履行完成以后,還要單獨編寫語句將數據庫句柄指針置為空,避免該指針在后面的流程中被隨便使用。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 免费国产网站 | 国内偷拍av| 岛国片在线免费观看 | 91一区二区在线观看 | 91这里只有精品 | 久久久久久久一区二区三区 | 久久免费看 | 日韩经典一区二区 | 国产精品电影 | 99re国产 | 日韩免费av | 自拍视频网站 | 亚洲成a| 亚洲综合大片69999 | 成人免费在线观看 | 狼人综合视频 | 国产精品久久久久国产a级 中文字幕影院 | 亚洲精品高清视频 | 精品国产第一国产综合精品 | 国外成人在线视频网站 | 欧美视频区 | 性猛交xxxx乱大交孕妇印度 | 躁躁躁日日躁网站 | 久久国产精品久久w女人spa | 一级黄色大片在线观看 | 国产成人在线播放 | 91精品国产一区二区三区 | 久久久久久免费毛片精品 | 一区二区三区国产视频 | 色综合精品 | 91网站免费| 91色乱码一区二区三区 | 久久99精品久久久久婷婷 | 操操操日日日 | 久久久国产一区二区三区四区小说 | 日韩欧美国产视频 | 亚洲三级网站 | 国产成人免费在线观看 | 免费a观看 | 国产精品国产三级国产aⅴ原创 | 国产一区二区三区视频播放 |