OCI編程基礎篇(六) 斷開數據庫連接
訪問www.tomcoding.com網站,學習Oracle內部數據結構,詳細文檔說明,下載Oracle的exp/imp,DUL,logminer,ASM工具的源代碼,學習高技術含量的內容。
OCI程序在結束前需要先斷開與數據庫的連接,這個過程是程序開頭連接到數據庫的逆操作,也分為幾個步驟。
1. 結束用戶會話,用到函數OCISessionEnd()。
2. 斷開服務器句柄與Oracle數據庫的通信路徑,用到函數OCIServerDetach()。
3. 釋放用戶會話句柄,用到函數OCIHandleFree()。后面所有釋放句柄的操作都用到這個函數。
4. 釋放服務器句柄。
5. 釋放服務上下文句柄。
6. 釋放錯誤句柄。
7. 釋放OCI環境句柄。
下面分別看一下這些函數的原型和參數。
第一個是結束會話函數OCISessionEnd()。
sword OCISessionEnd ( OCISvcCtx *svchp,
OCIError *errhp,
OCISession *usrhp,
ub4 mode );
svchp是一個輸入/輸出參數,是包含用戶會話句柄的服務上下文句柄。
errhp是一個輸入/輸出參數,錯誤句柄,用于返回出錯碼和出錯信息文本。
usrhp是一個輸入參數,用戶會話句柄,用于解除數據庫用戶認證。
mode是一個輸入參數,解除認證模式,只能是OCI_DEFAULT模式。
第二個是斷開服務器通信路徑函數OCIServerDetach()。
sword OCIServerDetach ( OCIServer *srvhp,
OCIError *errhp,
ub4 mode );
srvhp是一個輸入參數,是連接數據庫時創建的服務器句柄。
errhp是一個輸入/輸出參數,錯誤句柄,用于返回出錯碼和出錯信息文本。
mode是一個輸入參數,指定操作模式,只能是OCI_DEFAULT模式。
第三個是釋放句柄函數OCIHandleFree()。
sword OCIHandleFree ( void *hndlp, ub4 type );
hndlp是一個輸入參數,是用OCIHandleAlloc()函數分配的句柄。
type是一個輸入參數,指定句柄類型。句柄分配時用什么類型,釋放時就是什么類型。
下面展示一個斷開數據庫連接的真實示例,看看這些函數都是怎樣調用的。
OCIEnv *envhp = NULL; /* OCI環境句柄 */
OCIError *errhp = NULL; /* 錯誤句柄 */
OCIServer *svrhp = NULL; /* 服務器句柄 */
OCISession *usrhp = NULL; /* 用戶會話句柄 */
OCISvcCtx *svchp = NULL; /* 服務上下文句柄 */
int disconnect_oracle(void){
sword rc;
sb4 ec;
char errbuf[512];
rc = OCISessionEnd(
svchp,
errhp,
usrhp,
OCI_DEFAULT
);
if (rc != OCI_SUCCESS) {
OCIErrorGet(errhp, 1, NULL, &ec, errbuf, 512, OCI_HTYPE_ERROR);
fprintf(stderr, "OCISessionEnd() - [%d] %s\n", ec, errbuf);
return (-1);
}
rc = OCIServerDetach(
svrhp,
errhp,
OCI_DEFAULT
);
if (rc != OCI_SUCCESS) {
OCIErrorGet(errhp, 1, NULL, &ec, errbuf, 512, OCI_HTYPE_ERROR);
fprintf(stderr, "OCIServerDetach() - [%d] %s\n", ec, errbuf);
return (-1);
}
rc = OCIHandleFree(
usrhp,
OCI_HTYPE_SESSION
);
if (rc != OCI_SUCCESS) {
fprintf(stderr, "OCIHandeFree() - free session handle error !\n");
return (-1);
}
rc = OCIHandleFree(
svrhp,
OCI_HTYPE_SERVER
);
if (rc != OCI_SUCCESS) {
fprintf(stderr, "OCIHandleFree() - free server handle error !\n");
return (-1);
}
rc = OCIHandleFree(
svchp,
OCI_HTYPE_SVCCTX
);
if (rc != OCI_SUCCESS) {
fprintf(stderr, "OCIHandleFree() - free service context handle error !\n");
return (-1);
}
rc = OCIHandleFree(
errhp,
OCI_HTYPE_ERROR
);
if (rc != OCI_SUCCESS) {
fprintf(stderr, "OCIHandleFree() - free error handle error !\n");
return (-1);
}
rc = OCIHandleFree(
envhp,
OCI_HTYPE_ENV
);
if (rc != OCI_SUCCESS) {
fprintf(stderr, "OCIHandleFree() - free env handle error !\n");
return (-1);
}
return (0);
}

浙公網安備 33010602011771號