最近在一個通過MFC做一個界面,通過這個界面可以對布置在另一台服務器上的數據庫MySQL、SQl Server、Oracle進行增刪創建表的操作。其中我通過ADO很快就完成了對MySQL和SQL Server的控制。但是Oracle的連接就麻煩很多,我完成這個項目的大部分的時間都在研究怎么與Oracle數據庫互通。
先聲明下我的電腦環境,沒有裝ORACLE客戶端,WIN7_64位操作系統,使用的編譯器是VC6。服務器用的是WIN10的系統,Oracle的版本為11.2.0.1.0,我客戶端安裝了
先交代下,我用OTL最終沒能成功連接上數據庫,最終是用ADO連接上的,以下是我整個踩坑過程中難點的記錄。
現有的一些工具有很多,最終考慮先用OTL嘗試。
網上很多人說使用OTL只要有一個頭文件就夠了,而我嘗試了只包含OTLV4.H后連編譯都通不過,因為還要添加OCI的各種lib庫和OCI.dll。
我是先去別的博客推薦的英文網站上下了一個頭文件OTLV4.H,結果發現是個坑,里面的代碼是錯的,怎么都是編譯不過的,后來嘗試性的去國內的一個網站下載了一個OTLV4.h沒想到竟然編譯通過了。
然后我又下載了OCI的各種lib庫和OCI.dll。
在新建工程中,要把OCI.dll放在編譯出來的DEBUG或者RELEASE文件中,
然后在VC6的左上角菜單中project->project setting->LINK->input中的object/library modules中填入oci.lib,在additional library path中填入...\OCI\lib\MSVC(這個是OCI的lib文件庫)。
在左上角菜單中tool->options->directories中寫入include文件目錄...\OCI\include。
然后在工程中包含otlv4.h的頭文件,這樣工程環境的搭建就完成了。
OTL的頭文件中根據你的宏定義選擇相應功能。
我根據我的環境選擇了在StdAfx.h中加入以下宏定義內容:
#define OTL_ORA11G_R2 // Compile OTL 4.0/OCI11.2
#define OTL_ORA_UTF8
#define OTL_ORA_OCI_ENV_CREATE
宏定義介紹參考http://otl.sourceforge.net/otl3_compile.htm。
db.rlogon("userid/password@//IP:PORT/SID"); //這是我的鏈接字符串格式。
連接前記得先初始化。
大部分的環境都好了,可是就死連不上,最后放棄轉用ADO。
MFC調用ADO的環境搭建如下:
#import "../../out/msado15.dll" no_namespace rename ("EOF","adoEOF")
在頭文件中加入上面這句話
下載安裝Oracle 11.2 client
有安裝包的,安裝好后環境變量什么的都會設置好。
在不清楚自己該用什么字符串格式的情況下,我先新建一個txt文件,將后綴改為udl,右鍵打開方式中選擇OLE DB core service 如下圖
因為我想連接Oracle的數據庫所以要在提供程序里選擇XXXX OLE DB Provider for Oracle.
填完連接信息后確認測試連接成功,然后點確定
再用文本文檔打開該文件,得到連接字符串。
Provider=MSDAORA.1;User ID=system;Data Source=10.10.22.103:1521/iotdb;Persist Security Info=False
最終我連接Oracle的字符串如下:
strConnect.Format("Provider=MSDAORA.1;Data Source=%s:%s/%s;Persist Security Info=False",csServer,csPort,csDBName);
然后再 m_pConnection->Open((_bstr_t)strConnect,(_bstr_t)csUser,(_bstr_t)csDBPass,adModeUnknown);///連接數據庫
連接之前記得先調用初始化函數。