由于項目需要,現(xiàn)需要向遠程Oracle數(shù)據(jù)庫插入數(shù)據(jù)。由于后期可能無法在部署程序的電腦上安裝oracle客戶端,網(wǎng)上也有一些解決辦法,通常是要下載對應版本的Oracle Instant Client,將訪問Oracle需要的部分Dll文件拷貝到客戶端本地,然后通過配置環(huán)境變量或修改注冊表的方式,來達到快速安裝客戶端的目的,如果后期部署程序在虛擬空間時,配置環(huán)境變量或修改注冊表或許不可行。這里提供一種簡單、無需安裝和多余配置的方法,適用于.NET C#。 本方法通過程序內(nèi)集成Oracle客戶端,下面是這種方法的具體實現(xiàn): 1.從Oracle官網(wǎng)上下載對應版本的Oracle Instant Client,以下是官網(wǎng)鏈接http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html 但是由于我下載其中的Win32版本的文件不全,因此又通過查找另外下載了一些文件,現(xiàn)已把我在32位機器上測試遠程連接Oracle 10g數(shù)據(jù)庫通過的完整文件上傳到csdn,鏈接為http://download.csdn.net/detail/xiaohu_2012/5999699,壓縮包包括如下文件: classes12.jar oci.dll 其中OraOps11w.dll與Oracle.DataAccess.dll需要配套。 2.在你的工程目錄里新建一個文件夾Oracle(名字和位置隨便定),將上述文件拷貝到里邊,并在Visual Studio中添加這個文件夾及文件們。保證可以在解決方案中看到它們。 3.在Visual Studio IDE 的解決方案資源管理器中,打開Oracle文件夾,選中里邊所有的文件,在“屬性”“復制到輸出目錄”里設置“如果較新則復制”,這樣在編譯或者發(fā)布程序時,Oracle文件夾會隨著發(fā)布到exe所在的地方,部署的時候就不會出現(xiàn)找不到Oracle庫的情況。 4.按照網(wǎng)上的大多數(shù)教程,這個時候就需要配置Windows環(huán)境變量了。其實這一步并不是必須的,因為考慮到不同的客戶環(huán)境,有可能用戶沒有權(quán)限在他的計算機上操作這些,那么我們可以把設置Oracle環(huán)境變量放到程序里來做。這就需要在使用Oracle連接之前,添加如下代碼: //取得oracle驅(qū)動文件夾的位置,也就是放oci.dll的地方 string oraclePath = System.Windows.Forms.Application.StartupPath + @'\oracle'; //設置環(huán)境變量“PATH”,寫入oracle驅(qū)動所在的文件夾 //第三個參數(shù)表示這個PATH只在當前進程起作用,不會修改電腦本身。 Environment.SetEnvironmentVariable('PATH', oraclePath,EnvironmentVariableTarget.Process); //設置Oracle在通訊過程中使用的語言和字符集。 //我的項目用的是上面的字符集,對應到你的項目,可用SQL語句去oracle數(shù)據(jù)庫中查詢。 //這個語言和字符集一定要和服務器一致,否則可能會出現(xiàn)亂碼甚至無法連接。 Environment.SetEnvironmentVariable('NLS_LANG', 'SIMPLIFIED CHINESE_CHINA.ZHS16GBK', EnvironmentVariableTarget.Process);
補充說明,可以用以下SQL語句查詢字符集:
select userenv('language') from dual;查詢服務端字符集,用來設置上面的參數(shù)。 select * from nls_database_parameters;//服務器字符集 select * from nls_instance_parameters;//ora文件定義字符集 select * from nls_session_parameters;//會話字符集
5.理論上,經(jīng)過上面的設置,你的程序就可以使用內(nèi)置到exe目錄下的Oracle驅(qū)動了,這里要注意的還有就是連接數(shù)據(jù)庫的方式,上面的修改并不能保證你可以使用tns名來連接,因此連接字符串要做如下修改: 'Persist Security Info=True;User ID=數(shù)據(jù)庫用戶名;Password=密碼;Unicode=True;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=服務器IP地址)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=服務器上全局數(shù)據(jù)庫的服務名)))' 這個主要是把'Data Source'這部分直接用TCP/IP字符串方式替換了(通常Data Source是寫tns名稱的)
6.Ok,運行程序,連接成功! |
|