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有問題,目前還沒找出解決辦法!