C語言是一種高級的編程語言,而Oracle是一種廣泛應用于企業(yè)級應用的關系型數(shù)據(jù)庫管理系統(tǒng)。雖然兩者看起來似乎是不同領域的技術(shù),但是它們之間的聯(lián)系是緊密的。
C語言在企業(yè)級應用中的應用非常廣泛,它主要用來開發(fā)系統(tǒng)級軟件和驅(qū)動程序,這些軟件通常需要與Oracle數(shù)據(jù)庫進行交互。比如說,一個銀行的核心應用系統(tǒng)可能是由C語言開發(fā)的,這個系統(tǒng)需要與Oracle數(shù)據(jù)庫進行數(shù)據(jù)交換,比如存款和貸款數(shù)據(jù)。因此,C語言與Oracle之間的交互就變得非常重要。
C語言可以通過ODBC(Open Database Connectivity)和OCI(Oracle Call Interface)來訪問Oracle數(shù)據(jù)庫。ODBC是一種通用的數(shù)據(jù)庫接口,支持多種數(shù)據(jù)庫,可以使應用程序與各種數(shù)據(jù)庫之間進行通信。而OCI是Oracle獨有的一種數(shù)據(jù)庫接口,它提供了Oracle數(shù)據(jù)庫的所有功能和優(yōu)化,可以提高程序的性能效率。下面我們將分別介紹一下C語言使用ODBC和OCI訪問Oracle數(shù)據(jù)庫的方法。
//使用ODBC訪問Oracle數(shù)據(jù)庫的示例代碼 #include#include #include #include int main(int argc, char *argv[]) { SQLHENV henv; //環(huán)境句柄 SQLHDBC hdbc; //連接句柄 SQLHSTMT hstmt; //語句句柄 SQLRETURN retcode; //返回碼 //連接數(shù)據(jù)庫 retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); retcode = SQLConnect(hdbc, (SQLCHAR*)"OracleDSN", SQL_NTS, (SQLCHAR*)"username", SQL_NTS, (SQLCHAR*)"password", SQL_NTS); //執(zhí)行SQL語句 retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); retcode = SQLExecDirect(hstmt, (SQLCHAR*)"SELECT * FROM employee", SQL_NTS); //獲取結(jié)果集 SQLCHAR emp_name[20]; int emp_age; while(SQLFetch(hstmt) == SQL_SUCCESS) { SQLGetData(hstmt, 1, SQL_C_CHAR, emp_name, 20, NULL); //獲取第1列數(shù)據(jù) SQLGetData(hstmt, 2, SQL_C_LONG, &emp_age, sizeof(int), NULL); //獲取第2列數(shù)據(jù) printf("%s,%d\n",emp_name, emp_age); } //釋放資源 SQLFreeHandle(SQL_HANDLE_STMT, hstmt); SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0; }
上面的代碼通過ODBC訪問Oracle數(shù)據(jù)庫,并將employee表中的數(shù)據(jù)輸出到控制臺上。
//使用OCI訪問Oracle數(shù)據(jù)庫的示例代碼 #include#include #include int main(int argc, char *argv[]) { OCIEnv* envhp; //環(huán)境句柄 OCIServer* srvhp; //服務器句柄 OCIError* errhp; //錯誤句柄 OCISession* sesion; //會話句柄 OCIStmt* stmthp; //語句句柄 OCIDefine* defhp1; //定義句柄1 OCIDefine* defhp2; //定義句柄2 OCIDate* date; //日期類型 sword retcode; //返回碼 //初始化環(huán)境句柄 OCIInitialize((ub4)OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *)) 0 ); OCIEnvInit(&envhp, (ub4)OCI_DEFAULT, (size_t)0, (dvoid **)0); //創(chuàng)建服務器句柄 OCIHandleAlloc((dvoid *)envhp, (dvoid **)&srvhp, OCI_HTYPE_SERVER, 0, (dvoid **)0); OCIServerAttach(srvhp, errhp, (OraText *)"tnsname", strlen("tnsname"), 0); //創(chuàng)建會話和語句句柄 OCIHandleAlloc((dvoid *)envhp, (dvoid **)&sesion, OCI_HTYPE_SESSION, 0, (dvoid **)0); OCILogon2(envhp, errhp, &sesion, (OraText *)"username", strlen("username"), (OraText *)"password", strlen("password"), (OraText *)"tnsname", strlen("tnsname"), OCI_DEFAULT); OCIHandleAlloc((dvoid *)envhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, 0, (dvoid **)0); //執(zhí)行SQL語句 OCIStmtPrepare(stmthp, errhp, (OraText *)"SELECT * FROM employee", strlen("SELECT * FROM employee"), OCI_NTV_SYNTAX, OCI_DEFAULT); OCIStmtExecute(sesion, stmthp, errhp, 0, 0, 0, 0, OCI_DEFAULT); //獲取結(jié)果集 char emp_name[20]; int emp_age; OCIDefineByPos(stmthp, &defhp1, errhp, 1, emp_name, strlen(emp_name), SQLT_STR, NULL, NULL, NULL, OCI_DEFAULT); OCIDefineByPos(stmthp, &defhp2, errhp, 2, &emp_age, sizeof(int), SQLT_INT, NULL, NULL, NULL, OCI_DEFAULT); while(retcode = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT) != OCI_NO_DATA) { printf("%s,%d\n",emp_name, emp_age); } //釋放資源 OCILogoff(sesion, envhp, errhp); OCIHandleFree((dvoid *)stmthp, OCI_HTYPE_STMT); OCIHandleFree((dvoid *)sesion, OCI_HTYPE_SESSION); OCIServerDetach(srvhp, errhp, OCI_DEFAULT); OCIHandleFree((dvoid *)srvhp, OCI_HTYPE_SERVER); OCIHandleFree((dvoid *)envhp, OCI_HTYPE_ENV); return 0; }
上面的代碼通過OCI訪問Oracle數(shù)據(jù)庫,并將employee表中的數(shù)據(jù)輸出到控制臺上。
綜上所述,C語言與Oracle的聯(lián)系非常緊密,它們的結(jié)合可以讓企業(yè)級應用開發(fā)更加高效和可靠。在實際開發(fā)中,需要根據(jù)具體的需求來選擇使用ODBC或OCI來進行數(shù)據(jù)庫訪問。