在C語言中連接Oracle數據庫是非常常見的操作,使用Oracle提供的OCI接口可以實現數據庫連接、查詢、更新、刪除等操作。本文將介紹如何使用C語言連接Oracle數據庫和如何編寫數據庫操作的代碼。
首先我們需要下載Oracle Instant Client,這個客戶端是Oracle提供的輕量級客戶端,可以用來訪問Oracle數據庫的服務。
1.連接Oracle數據庫
連接Oracle數據庫的步驟如下:
1)初始化OCI環境。
OCIEnvCreate 函數用來初始化OCI環境,并且為OCI分配空間。代碼如下:
OCIEnvCreate(&envhp, OCI_DEFAULT, (dvoid *) 0, (dvoid * (*)(dvoid *, size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t)) 0, (void (*)(dvoid *, dvoid *)) 0, (size_t) 0, (dvoid **) 0);2)創建OCI錯誤句柄。 OCIHandleAlloc函數用來創建句柄,對于OCI錯誤句柄,用OCI_HTYPE_ERROR參數即可。代碼如下:
OCIHandleAlloc((dvoid *) envhp, (dvoid **) &errhp, OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0);3)創建OCI會話句柄。 創建會話句柄用OCIHandleAlloc函數即可,對于OCI會話句柄,用OCI_HTYPE_SESSION參數即可。代碼如下:
OCIHandleAlloc((dvoid *) envhp, (dvoid **) &svchp, OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **) 0); OCIHandleAlloc((dvoid *) envhp, (dvoid **) &authp, OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0);4)設置數據庫連接信息。 OCIAttrSet函數用來設置連接信息,包括用戶名、密碼、服務器地址、服務器端口等信息。代碼如下:
OCIAttrSet((dvoid *) authp, OCI_HTYPE_SESSION, (dvoid *) username, (ub4) strlen((const char *) username), OCI_ATTR_USERNAME, errhp); OCIAttrSet((dvoid *) authp, OCI_HTYPE_SESSION, (dvoid *) password, (ub4) strlen((const char *) password), OCI_ATTR_PASSWORD, errhp); OCIAttrSet((dvoid *) svchp, OCI_HTYPE_SVCCTX, (dvoid *) servername, (ub4) strlen((const char *) servername), OCI_ATTR_SERVER, errhp); OCIAttrSet((dvoid *) svchp, OCI_HTYPE_SVCCTX, (dvoid *) &port, (ub4) sizeof(port), OCI_ATTR_PORT, errhp);5)連接Oracle數據庫。 OCISessionBegin函數用來連接Oracle數據庫,代碼如下:
OCIAttrSet((dvoid *) authp, OCI_HTYPE_SESSION, (dvoid *) username, (ub4) strlen((const char *) username), OCI_ATTR_USERNAME, errhp); OCIAttrSet((dvoid *) authp, OCI_HTYPE_SESSION, (dvoid *) password, (ub4) strlen((const char *) password), OCI_ATTR_PASSWORD, errhp); OCIAttrSet((dvoid *) svchp, OCI_HTYPE_SVCCTX, (dvoid *) servername, (ub4) strlen((const char *) servername), OCI_ATTR_SERVER, errhp); OCIAttrSet((dvoid *) svchp, OCI_HTYPE_SVCCTX, (dvoid *) &port, (ub4) sizeof(port), OCI_ATTR_PORT, errhp);6)執行SQL語句。 執行SQL語句可以使用OCIStmtExecute函數,代碼如下:
OCIStmtExecute(svchp, stmthp, errhp, (ub4) 0, (ub4) 0, (OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_STMT_SCROLLABLE_READONLY);2.查詢Oracle數據庫 查詢Oracle數據庫也是常見的操作之一,我們可以使用該語句獲取數據庫中的數據。 OCIStmtPrepare函數用來準備SQL語句,OCIStmtExecute函數用來執行SQL語句。代碼如下:
OCIStmtPrepare(stmthp, errhp, (text *) "SELECT * FROM tablename", (ub4) strlen("SELECT * FROM tablename"), OCI_NTV_SYNTAX, OCI_DEFAULT); OCIStmtExecute(svchp, stmthp, errhp, (ub4) 0, (ub4) 0, (OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT);OCIStmtFetch 函數用來獲取結果集中的數據。循環遍歷結果集,代碼如下:
while ((status = OCIStmtFetch2(stmthp, errhp, (ub4) 1, OCI_DEFAULT, (sb4) 0, OCI_DEFAULT)) != OCI_NO_DATA) { if (status != OCI_SUCCESS && status != OCI_SUCCESS_WITH_INFO) { printf("Error in OCIStmtFetch2 %d\n", status); break; } OCIAttrGet((dvoid *) stmthp, OCI_HTYPE_STMT, (dvoid *) &row_count, (ub4 *) 0, OCI_ATTR_ROW_COUNT, errhp); printf("row count: %d\n", row_count); }3.修改Oracle數據庫 修改Oracle數據庫的操作是很常見的,我們可以使用以下代碼修改數據庫中的數據。 OCIStmtPrepare函數用來準備SQL語句,OCIStmtExecute函數用來執行SQL語句。代碼如下:
OCIStmtPrepare(stmthp, errhp, (text *) "UPDATE tablename SET field1 = new_value WHERE condition", (ub4) strlen("UPDATE tablename SET field1 = new_value WHERE condition"), OCI_NTV_SYNTAX, OCI_DEFAULT); OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0, (OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT);4.刪除Oracle數據庫 刪除數據庫中的數據也是常見的操作之一,我們可以使用以下代碼刪除數據庫中的數據。 OCIStmtPrepare函數用來準備SQL語句,OCIStmtExecute函數用來執行SQL語句。代碼如下:
OCIStmtPrepare(stmthp, errhp, (text *) "DELETE FROM tablename WHERE condition", (ub4) strlen("DELETE FROM tablename WHERE condition"), OCI_NTV_SYNTAX, OCI_DEFAULT); OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0, (OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT);總結 本文介紹了C語言連接Oracle數據庫以及對數據庫進行查詢、更新、刪除的操作。雖然OCI接口看起來復雜,但只需要按照上述步驟操作即可,沒有太大的難度。對于數據庫操作的代碼,由于涉及到安全性,我們應該在代碼中加入參數檢查和異常處理,避免因為程序缺陷導致的數據錯誤。