1. 程式人生 > >ubuntu+mono+PetaPoco+Oracle+.net 程式部署

ubuntu+mono+PetaPoco+Oracle+.net 程式部署

前言:將windows 下開發的 .net 控制檯程式(連線Oracle資料庫)部署到 ubuntu 下步驟記錄  2017-09-19

實驗所用機器為虛擬機器Ubuntu16.04  amd64

安裝Mono環境

  首先新增Mono安裝源:

vi /etc/apt/sources.list.d/mono.list

  新增內容:

deb http://download.mono-project.com/repo/debian wheezy main

  儲存後執行 apt-get update ,可能會出現錯誤提示:

W: GPG error: http://download.mono-project.com wheezy Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY A6A19B38D3D831EF

  執行以下命令新增key:

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com A6A19B38D3D831EF

  再次執行 apt-get update ,更新完成後執行 apt-get install mono-complete 即可安裝最新版本的Mono,安裝完成後執行 mono -V 檢視Mono版本

安裝Oracle Client

    2. 安裝alien,和依賴包

    sudo apt-get install alien

    sudo apt-get install libaio1

   3. 使用alien吧rpm包轉換成deb包,並且安裝:

    sudo alien -i oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm

    4.安裝完後,類庫會放到 /usr/lib/oracle/版本號/client/lib/ ,需要做一個軟連線,否則Mono找不到需要的共享庫

    sudo ln -s /usr/lib/oracle/12.2/client64/lib/libclntsh.so.12.1 /usr/lib/oracle/12.2/client64/lib/libclntsh.so 

          5. 更新ldconfig設定:

    在 /etc/ld.so.conf.d目錄下新建 oracle-client.conf  , 輸入Oracle Client 類庫的路徑, /usr/lib/oracle/12.1/client/lib

    別忘了執行  sudo ldconfig

     6.在伺服器上執行:select userenv('language') from dual;  獲取伺服器的字符集

    檢視客戶端字符集,在終端下執行:

    echo $NLS_LANG

     修改客戶端字符集:

    sudo gedit /etc/environment

    在environment 檔案中增加以下內容:

    NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8"

    export NLS_LANG

    重新啟動作業系統即可。

修改程式

  1.PetaPoco原始碼修改:

    PetaPoco報空物件引用 的錯誤,修改PetaPoco.cs中下面程式碼:

    public override void PreExecute(IDbCommand cmd) 

    { 

        //注掉下面一行,修改為下面的程式碼。Command物件裡不存在"BindByName"的屬性,此處會報錯 

        //cmd.GetType().GetProperty("BindByName").SetValue(cmd, true, null); 

       PropertyInfo bindByNameInfo = cmd.GetType ().GetProperty ("BindByName"); 

        if (bindByNameInfo!=null) { 

            bindByNameInfo.SetValue (cmd, true, null); 

         } 

    }

  2. 新增 System.Data.OracleClient.dll 引用

   3. 資料庫連線字串修改為

     <add name="xxx" providerName="Oracle.ManagedDataAccess.Client" connectionString="Data Source=(DESCRIPTION=        (ADDRESS_LIST=(ADDRESS=    (PROTOCOL=TCP)(HOST=xxx)(PORT=1521)))        (CONNECT_DATA=(SERVICE_NAME=xxxx)));User Id=xxx;PassWord=xxx;" />

執行程式

  mono xxx.exe

後記:

  程式執行過程沒有問題,如果停止時會報資料庫連線釋放的問題,此問題應該是Oracle客戶端的dll有問題,目前還沒找出解決辦法!