在C#中,不安裝Oracle客戶端如何連接Oracle數據庫


本方法優點: 1、程序內集成Oracle客戶端,無需用戶自行進行配置

本方法缺點: 2、增加程序包的體積(Oracle instant client本身有幾十兆大小)

下面說一下如何實現。

  • 0、首先,從Oracle網站上下載對應版本的Oracle instant client包,網址在這里 http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html 由於是Windows程序,只需要下載Win32或64版本就行了。
  • 1、下載來的.zip壓縮包,解壓后應該有如下文件:(我使用的是11G版本,其他版本可能略有不用) 
  • 2、在你的工程根目錄下新建一個”Oracle”的文件夾(其實名字和位置隨便定),然后將上述文件拷貝到里邊,並在Visual Studio中添加這個文件夾及文件們。保證你的解決方案里能看到它們。
  • 3、在Visual Studio IDE的“解決方案資源管理器”里,打開Oracle文件夾,選中里邊所有的文件,在“屬性”“復制到輸出目錄”里設置“如果較新則復制”,這樣在編譯或者發布程序的時候,Oracle文件夾會隨着發布到exe所在的地方,部署時候就不會出現找不到Oracle庫的情況。
  • 4、按照網上的大多數教程,這個時候就需要在widnows環境變量里邊添加東西了。其實這一步不是必須的,因為考慮到不同的客戶環境,有可能用戶沒有權限在他的計算機上操作這些,那么我們把設置Oracle環境變量放到程序里來做。那么在你初始化程序之后使用Oracle之前,需要添加如下代碼:string oraclePath = System.Windows.Forms.Application.StartupPath + @"\oracle"; Environment.SetEnvironmentVariable("PATH", oraclePath,EnvironmentVariableTarget.Process); Environment.SetEnvironmentVariable("NLS_LANG", "SIMPLIFIED CHINESE_CHINA.ZHS16GBK", EnvironmentVariableTarget.Process);解釋一下上面的代碼: string oraclePath = System.Windows.Forms.Application.StartupPath + @"\oracle"; 這一句取得了oracle 驅動文件夾的位置,也就是放oci.dll的地方。Environment.SetEnvironmentVariable("PATH", oraclePath,EnvironmentVariableTarget.Process); 這一句設置環境變量“PATH”,寫入oracle驅動所在的文件夾,第三個參數表示這個PATH只在當前進程起作用,不會修改電腦本身。 注意:如果你用到某些外部程序,還有其他PATH變量要設置,在這里加入就行了。具體方法參見.net相關文檔。Environment.SetEnvironmentVariable("NLS_LANG", "SIMPLIFIED CHINESE_CHINA.ZHS16GBK", EnvironmentVariableTarget.Process); 這一句,設置Oracle在通訊過程中使用的語言和字符集。我的項目用的是上面的字符集,對應到你的項目,可用SQL語句去oracle數據庫中查詢。這個語言和字符集一定要和服務器一致,否則可能會出現亂碼甚至無法連接。可能會用到如下SQL語句: //select userenv('language') from dual; 查詢服務端字符集,用來設置上面的參數。 //select * from nls_database_parameters;//服務器字符集 //select * from nls_instance_parameters;//ora文件定義字符集 //select * from nls_session_parameters; //會話字符集
  • 5、理論上,經過上面的設置,你的程序就可以使用內置到exe目錄下的Oracle驅動了,這里要注意的還有就是連接數據庫的方式,上面的修改並不能保證你可以使用tns名來連接,因此連接字符串要做如下修改:

    在app.config中修改connectionString為 Persist Security Info=True;User ID=數據庫用戶名;Password=數據庫密碼;Unicode=True;Data Source= (DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 服務器IP地址)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = 服務器上的數據庫實例名))); 這個主要是把“Data Source”這部分直接用tcp/ip字符串方式替換了(通常Data Source是寫tns名稱的)

  • 6、好了,運行你的程序試試看吧。

如果你tns名稱來訪問oracle數據庫,那么還要做以下工作。 

  • a.在程序的Oracle文件夾下增加tnsnames.ora,並將tns名稱的配置寫到里邊去。
  • b.在程序設置環境變量的地方,加入 Environment.SetEnvironmentVariable("TNS_ADMIN", oraclePath,EnvironmentVariableTarget.Process);
  • c.連接字符串里應該可以使用tns名稱了

整體代碼如下:

 // 這一句取得了oracle 驅動文件夾的位置,也就是放oci.dll的地方。
            string oraclePath = System.Windows.Forms.Application.StartupPath + @"\ORCLconn";
            // //這一句設置環境變量“PATH”,寫入oracle驅動所在的文件夾,
            // //第三個參數表示這個PATH只在當前進程起作用,不會修改電腦本身。 
            // //注意:如果你用到某些外部程序,還有其他PATH變量要設置,在這里加入就行了。具體方法參見.net相關文檔。

///當系統還使用其他軟件的環境變量時則需要先獲取本機電腦上的環境變臉結合Oracle環境變量一起使用。
            string s = Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Machine);

            Environment.SetEnvironmentVariable("PATH", s + ";" + oraclePath, EnvironmentVariableTarget.Process);
            // //這一句,設置Oracle在通訊過程中使用的語言和字符集
            Environment.SetEnvironmentVariable("NLS_LANG", "SIMPLIFIED CHINESE_CHINA.ZHS16GBK", EnvironmentVariableTarget.Process);
            // //在程序的Oracle文件夾下增加tnsnames.ora,並將tns名稱的配置寫到里邊去。
            // //b.在程序設置環境變量的地方c.連接字符串里應該可以使用tns名稱了

            Environment.SetEnvironmentVariable("TNS_ADMIN", oraclePath, EnvironmentVariableTarget.Process);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM