在開發C語言程序中,如果要使用Oracle數據庫,就需要添加Oracle引用。添加Oracle引用可以讓我們在C語言中調用Oracle的API來操作數據庫。本文就來介紹如何在C語言中添加Oracle引用,并且結合具體的代碼來說明。
在添加Oracle引用之前,首先需要下載Oracle Instant Client。下載地址為:https://www.oracle.com/database/technologies/instant-client/downloads.html。下載相應平臺的Instant Client,解壓縮后可以看到有兩個文件夾,一個是sdk,一個是sqlplus。我們需要使用sdk文件夾中的頭文件和庫文件。
在C語言程序中添加Oracle引用需要用到兩個頭文件,一個是oci.h,一個是oratypes.h。這兩個頭文件都在sdk/include目錄下。我們可以按照以下方式包含這兩個頭文件:
#include <oci.h> #include <oratypes.h>我們還需要在程序中鏈接Oracle的庫文件。Oracle庫文件在sdk/lib目錄下,不同平臺的庫文件名稱可能會略有不同。在鏈接Oracle庫文件時,需要注意庫文件的順序,一般是將庫文件libclntsh.so放在最后一個。鏈接庫文件的命令如下:
-L/path/to/sdk/lib -lclntsh -lnnz19其中/path/to/sdk/lib需要替換為實際的Instant Client路徑。 下面是一個簡單的示例程序,演示了如何在C語言中連接Oracle數據庫,并向其中插入一條記錄:
#include <stdio.h> #include <stdlib.h> #include <oci.h> #include <oratypes.h> int main() { OCIEnv* p_env; /* 環境句柄 */ OCIError* p_err; /* 錯誤句柄 */ OCISvcCtx* p_svc; /* 服務句柄 */ OCIStmt* p_stmt; /* 語句句柄 */ OCIDefine* p_def; /* 列定義句柄 */ OCIBind* p_bind; /* 綁定句柄 */ sword status; /* 返回狀態碼 */ char* user = "用戶名"; /* 用戶名 */ char* passwd = "密碼"; /* 密碼 */ char* db = "數據庫名"; /* 數據庫名 */ char* sql = "INSERT INTO table(name, age) VALUES(:1, :2)"; /* SQL語句 */ char name[32]; /* 名稱 */ int age; /* 年齡 */ /* 初始化環境句柄和錯誤句柄 */ OCIEnvCreate(&p_env, OCI_THREADED | OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL); OCIHandleAlloc(p_env, (void**)&p_err, OCI_HTYPE_ERROR, 0, NULL); /* 初始化服務句柄 */ status = OCILogon(p_env, p_err, &p_svc, user, strlen(user), passwd, strlen(passwd), db, strlen(db)); if (status != OCI_SUCCESS) { OCIErrorGet(p_err, 1, NULL, &status, NULL, 0, OCI_HTYPE_ERROR); printf("OCILogon failed: %d\n", status); exit(-1); } /* 創建語句句柄 */ OCIHandleAlloc(p_svc, (void**)&p_stmt, OCI_HTYPE_STMT, 0, NULL); /* 準備SQL語句 */ status = OCIStmtPrepare(p_stmt, p_err, (OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT); if (status != OCI_SUCCESS) { OCIErrorGet(p_err, 1, NULL, &status, NULL, 0, OCI_HTYPE_ERROR); printf("OCIStmtPrepare failed: %d\n", status); exit(-1); } /* 定義輸入參數 */ OCIHandleAlloc(p_svc, (void**)&p_bind, OCI_HTYPE_BIND, 0, NULL); memset(name, 0, sizeof(name)); printf("請輸入名稱:"); scanf("%s", name); status = OCIBindByName(p_stmt, &p_bind, p_err, (OraText*)":1", strlen(":1"), name, strlen(name) + 1, SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT); if (status != OCI_SUCCESS) { OCIErrorGet(p_err, 1, NULL, &status, NULL, 0, OCI_HTYPE_ERROR); printf("OCIBindByName failed: %d\n", status); exit(-1); } printf("請輸入年齡:"); scanf("%d", &age); status = OCIBindByName(p_stmt, &p_bind, p_err, (OraText*)":2", strlen(":2"), &age, sizeof(int), SQLT_INT, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT); if (status != OCI_SUCCESS) { OCIErrorGet(p_err, 1, NULL, &status, NULL, 0, OCI_HTYPE_ERROR); printf("OCIBindByName failed: %d\n", status); exit(-1); } /* 執行SQL語句 */ status = OCIStmtExecute(p_svc, p_stmt, p_err, 1, 0, NULL, NULL, OCI_DEFAULT); if (status != OCI_SUCCESS) { OCIErrorGet(p_err, 1, NULL, &status, NULL, 0, OCI_HTYPE_ERROR); printf("OCIStmtExecute failed: %d\n", status); exit(-1); } printf("插入成功!"); /* 釋放資源 */ OCISessionEnd(p_svc, p_err, NULL, 0); OCIServerDetach(p_svc, p_err, OCI_DEFAULT); OCIHandleFree(p_stmt, OCI_HTYPE_STMT); OCIHandleFree(p_svc, OCI_HTYPE_SVCCTX); OCIHandleFree(p_err, OCI_HTYPE_ERROR); OCIHandleFree(p_env, OCI_HTYPE_ENV); return 0; }通過以上代碼的演示,我們可以看到,在添加Oracle引用后,我們可以簡單地使用C語言來操作Oracle數據庫。在實際開發中,我們可以根據自己的需求編寫更加復雜的程序。