Oracle是一款強大的關聯式資料庫管理系統,在C 中使用Oracle資料庫可以幫助我們更有效率地管理資料庫。本文將介紹如何在C 中使用Oracle資料庫以及相關範例程式碼。
一、安裝和設定Oracle資料庫驅動程式
在使用Oracle資料庫之前,需要安裝對應的Oracle驅動程式。 Oracle官方提供了ODBC驅動程序,我們可以從官網上下載和安裝。
安裝完成後,進入控制台 -> 管理工具 -> 資料來源(ODBC)。在「驅動程式」中可以看到ODBC驅動程式。我們需要選擇對應的驅動程式並進行配置。
在「資料來源名稱」中輸入需要連接的Oracle資料庫的別名,例如「orcl」。在「伺服器名稱」中輸入連接資料庫的主機名稱或IP位址。在「用戶id」中輸入連接資料庫的用戶名,密碼中輸入對應的密碼。點擊“測試連線”按鈕,如果提示“連線成功”,則表示連線成功。
二、使用Oracle資料庫
在C 中使用Oracle資料庫需要引入oracle頭檔並進行相關設定。
1.頭檔包含
首先需要包含oci.h和oci.cpp的頭文件,這兩個頭檔在Oracle安裝目錄下的OCI/include目錄中。
2.連結Oracle庫文件
需要連結Oracle的庫文件,包括oci.lib、ociw32.lib和orannzsbb11.dll等。
3.創建OCI句柄
OCI句柄是Oracle提供的一種記憶體管理機制。 OCI句柄用於管理OCILIB函式庫與Oracle服務(SQL語句)之間的連結與互動。
OCI句柄在使用時需要先申請,再依需求進行設定。常用的OCI句柄包括:
(1)環境句柄:OCIEnv。
(2)服務句柄:OCISvcCtx。
(3)會話句柄:OCISession。
(4)語句句柄:OCIStmt。
(5)結果集句柄:OCIDefine,OCIParam。
下面是申請OCI環境句柄、服務句柄、會話句柄和語句句柄的代碼:
OCIEnv* envhp; OCIStmt* stmthp; OCIServer* srvhp; OCISession* sesshp; //申请环境句柄 int err = OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, (dvoid*)0, (dvoid*(*)(dvoid*, size_t))0, (dvoid*(*)(dvoid*, dvoid*, size_t))0, (void(*)(dvoid*, dvoid*))0, (size_t)0, (dvoid**)0); //申请服务句柄 err = OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (dvoid**)0); //申请会话句柄 err = OCIHandleAlloc(envhp, (dvoid**)&sesshp, OCI_HTYPE_SESSION, (size_t)0, (dvoid**)0); //申请语句句柄 err = OCIHandleAlloc(envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);
4.連接Oracle資料庫
需要先設定OCIServer的服務名稱,再呼叫OCILogon2函數連接到Oracle資料庫。以下是連接Oracle資料庫的程式碼:
//设置服务名称 const char* db_name = "orcl"; err = OCIAttrSet(srvhp, OCI_HTYPE_SERVER, (dvoid*)db_name, strlen(db_name), OCI_ATTR_SERVER_NAME, envhp); //连接数据库 const char* user_name = "scott";//连接的用户名 const char* password = "tiger";//连接的密码 const char* dblink = 0;//连接方式 ub4 dblink_len = 0; err = OCILogon2(envhp, errhp, &sesshp, (CONST OraText*)user_name, strlen(user_name), (CONST OraText*)password, strlen(password), (CONST OraText*)dblink, (ub4)dblink_len, (CONST OraText*)0, 0);
5.執行SQL語句
執行SQL語句需要使用OCIStmt句柄和OCIDefine句柄。 OCIStmt句柄用於準備SQL語句,OCIDefine句柄用於定義輸出變數。
下面是執行SQL語句的程式碼:
//定义SQL语句 const char* sql = "select empno from emp where empno=:1"; err = OCIStmtPrepare(stmthp, errhp, (CONST OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT); //绑定输入参数 ub2 empno = 7900; err = OCIBindByPos(stmthp, &bindhp, errhp, 1, &empno, sizeof(empno), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT); //执行SQL语句 err = OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT); //定义输出变量 ub2 out_empno; ub2 ind; sb2 out_len; ERRCALL(OCIDefineByPos(stmthp, &dfnhp, errhp, 1, (dvoid*)&out_empno, sizeof(out_empno), SQLT_INT, &ind, &out_len, 0, OCI_DEFAULT)); //获取结果 err = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
三、範例程式碼
以下是連接Oracle資料庫和執行SQL語句的完整程式碼:
#include<iostream> #include<occi.h> #include<oci.h> using namespace std; using namespace oracle::occi; int main() { OCIEnv *envhp; OCIStmt *stmthp; OCIServer *srvhp; OCISession *sesshp; // 申请OCI环境句柄 int err = OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, (dvoid*)0, (dvoid*(*)(dvoid*, size_t))0, (dvoid*(*)(dvoid*, dvoid*, size_t))0, (void(*)(dvoid*, dvoid*))0, (size_t)0, (dvoid**)0); // 申请服务句柄 err = OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (dvoid**)0); // 申请会话句柄 err = OCIHandleAlloc(envhp, (dvoid**)&sesshp, OCI_HTYPE_SESSION, (size_t)0, (dvoid**)0); // 申请语句句柄 err = OCIHandleAlloc(envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0); // 设置服务名称 const char* db_name = "orcl"; err = OCIAttrSet(srvhp, OCI_HTYPE_SERVER, (dvoid*)db_name, strlen(db_name), OCI_ATTR_SERVER_NAME, envhp); // 连接数据库 const char* user_name = "scott";//连接的用户名 const char* password = "tiger";//连接的密码 const char* dblink = 0;//连接方式 ub4 dblink_len = 0; err = OCILogon2(envhp, errhp, &sesshp, (CONST OraText*)user_name, strlen(user_name), (CONST OraText*)password, strlen(password), (CONST OraText*)dblink, (ub4)dblink_len, (CONST OraText*)0, 0); // 执行SQL语句 const char* sql = "select empno from emp where empno=:1"; err = OCIStmtPrepare(stmthp, errhp, (CONST OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT); ub2 empno = 7900;// 输入的empno OCIBind* bindhp; err = OCIBindByPos(stmthp, &bindhp, errhp, 1, &empno, sizeof(empno), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT); OCIDefine* dfnhp; ub2 out_empno; ub2 ind; sb2 out_len; ERRCALL(OCIDefineByPos(stmthp, &dfnhp, errhp, 1, (dvoid*)&out_empno, sizeof(out_empno), SQLT_INT, &ind, &out_len, 0, OCI_DEFAULT)); err = OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT); err = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT); while(err == OCI_SUCCESS) { cout << out_empno << endl; err = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT); } // 断开连接 OCILogoff(sesshp, envhp); OCIHandleFree(srvhp, OCI_HTYPE_SERVER); OCIHandleFree(sesshp, OCI_HTYPE_SESSION); OCIHandleFree(stmthp, OCI_HTYPE_STMT); OCIHandleFree(envhp, OCI_HTYPE_ENV); return 0; }
以上就是在C 中使用Oracle資料庫及其範例程式碼,希望對大家有幫助。
以上是在C++中使用Oracle資料庫及其範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!