為什么80%的碼農都做不了架構師?>>> ??
最近公司有個項目需要用到Oracle數據庫,我負責前期的調研。由于項目要用到C和PHP兩種語言,所以先收集這兩種語言連接Oracle的方法。PHP使用的是Laravel框架,直接使用了Laravel-OCI8進行數據庫連接,毫無壓力的連接成功了。C使用的是Ocilib進行數據庫連接,在這里踩了幾個坑,卡了幾天,今天有空整理下,防止下次繼續掉坑。
提示:本文使用的是win7 64位去連接遠程的 Oracle 11g數據庫
OCILIB介紹
OCILIB是一個跨平臺的Oracle驅動程序,可提供非常快速和可靠地訪問Oracle數據庫。它提供了一個豐富,功能齊全,并易于使用的API 。OCILIB 支持運行的所有Oracle平臺。
OCI環境搭建
由于OCILIB是對OCI進行二次封裝,所以在使用OCILIB前,需要安裝OCI環境,我們只要安裝好Instant Client就能完成OCI環境的搭建。
Instant Client下載
首先我們從官方下載自己系統所對應的Instant Client,由于我的系統是win7 64位的,所以選擇了 Instant Client for Microsoft Windows (x64)
下的 instantclient-basic-windows.x64-12.1.0.2.0.zip
提示:頁面下需要點擊 Accept License Agreement 后才能開始下載。
Instant Client安裝
我們將下載的文件解壓到電腦任意位置(本文將以解壓到 D:\instantclient_12_1 為例),然后添加以下環境變量:
- path => D:\instantclient_12_1
- TNS_ADMIN => D:\instantclient_12_1
- NLS_LANG => SIMPLIFIED CHINESE_CHINA.ZHS16GBK
提示:path如果已經存在值的話,直接在尾部追加。
下載OCILIB
直接從Github上下載最新版即可,下載完成后將文件解壓到任意位置(本文將以解壓到 **C:\ocilib **為例)。
VS2010配置
- 點擊
項目
-屬性
-配置管理器
,新建一個X64平臺(因為我下載的Instant Client是64位的,所以要用x64平臺) - 點擊
項目
-屬性
-配置屬性
-VC++ 目錄
,在 包含目錄 添加 C:\ocilib\include - 點擊
項目
-屬性
-配置屬性
-鏈接器
-常規
,在 附加庫目錄 添加 C:\ocilib\lib64
示例代碼
#include "stdafx.h"
#include "ocilib.h"#if defined(OCI_CHARSET_WIDE)
#pragma comment(lib, "ocilibw.lib")
#elif defined(OCI_CHARSET_ANSI)
#pragma comment(lib, "ociliba.lib")
#endifvoid err_handler(OCI_Error *err)
{printf("code : ORA-%05i\n""msg : %s\n""sql : %s\n",OCI_ErrorGetOCICode(err), OCI_ErrorGetString(err),OCI_GetSql(OCI_ErrorGetStatement(err)));
}int main(int argc, _TCHAR* argv[])
{OCI_Connection* cn;OCI_Statement* st;OCI_Resultset* rs;OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT);cn = OCI_ConnectionCreate("192.168.1.152:1521/TEST", "system", "123456", OCI_SESSION_DEFAULT);if(cn == NULL){err_handler(OCI_GetLastError());printf("%i",OCI_GetVersionServer(cn));printf("連接失敗!\n");}st = OCI_StatementCreate(cn);OCI_ExecuteStmt(st, "select id,age from web_user");rs = OCI_GetResultset(st);while (OCI_FetchNext(rs)){printf("code: %i, name %s\n", OCI_GetInt(rs, 1) , OCI_GetString(rs, 2));}printf("\n%d row(s) fetched\n", OCI_GetRowCount(rs));OCI_Cleanup();char a[20];gets(a);return EXIT_SUCCESS;
}
提示:程序運行時如果提示 計算機中丟失 ocilib*.dll,這里由于程序找不到ocilib*.dll造成的,只要將 C:\ocilib\lib64 加入path或者將 C:\ocilib\lib64 下的 ocilib*.dll 復制到程序目錄就可以解決了。