標題: Lazarus 連結 Oracle 的問題
無頭像
canonpapago

帖子 28
註冊 2013-4-18
用戶註冊天數 4047
發表於 2020-4-8 14:42 
115.43.252.58
分享  私人訊息  頂部
[ Lazarus 連結 Oracle 的問題 ]

這兩天測試用 XP (Lazarus 1.6.4 內建 Oracle 元件 OracleConnection1) 來連另一台電腦上的 Oracle 10.0.2 DB
遇到一些問題, 搞了兩天終於搞定, 分享一下, 避免有人遇到跟我一樣情形
(之前連過 MS SQL 及 SQLLITE ... 都很順, 就只有連 Oracle 不順利)


前情提要
1.Client 端是 XP 電腦, 也是開發程式的電腦, 有灌了 Lazarus 開發工具 及 Oracle Client
2.有建了 udl 檔來測試 Oracle 連線, 確定可以連到另一台電腦上的 Oracle 10.0.2 DB
3.BCB 5.0 ADO , 也能從這台 XP 連到另一台電腦上的 Oracle 10.0.2 DB
4.Lazarus 1.6.4 內建 Oracle 元件 OracleConnection1 就是無法連, 出現 ORA-12154: TNS: 無法解析指定的連線 ID

5.後來換了 ZEOS 元件, 仍然無法連, 一樣是 ORA-12154 , 所以不是元件問題, 但我百思不解, 明明 udl 檔來測試 Oracle 連線是通的
6.無意間發現, 在 Lazarus IDE 環境中, 設計時期把 Object Inspector 上的 OracleConnection1 或 ZConnection1 元件相關屬性設好
再把其 Connected 設成 true , 居然可以連, 但在編譯後的執行時期, 一到 Connected:=true 的階段, 都是 ORA-12154


解決方案
1.到網路搜尋相關問題, 似乎都沒有對策
2.有人說換掉 Oracle Client, 因為已經沒步了, 姑且一試
把 OracleClient_10.2.0.1 換成 OracleClient_11.2.0 , 結果正常了
網路說高一點的 OracleClient 版本可連低版本資料庫 (Oracle 10g)
3.看起來跟 Oracle Client 有關, 跟 Lazarus 元件及版本無關
但其他程式語言又沒這問題, 可能 OracleClient_10.2.0.1 跟 Lazarus 相剋 ....XD
4.換成 OracleClient_11.2.0 後, Lazarus 內建的 OracleConnection1 & ZConnection1 都能在執行時期正常連 Oracle



補充註記
1.使用 Lazarus 內建的 OracleConnection1 或 ZOES 元件, 都需要安裝 Oracle Client
2.另有一種要錢的元件叫 ODAC ( https://www.devart.com/odac/download.html )
聽說可以不用安裝 Oracle Client 元件就能直接連 Oracle DB
3.以下為 內建的 OracleConnection1 或 ZOES 元件, 測試 OK 的 SAMPLE
Oracle DB 在另一台電腦 IP:192.168.5.12 SID 名稱叫 dream
XP 開發電腦(本機)安裝 Oracle Client 後, 在 NetManager 中設了一服務名稱 niceapdb
其實服務名稱 niceapdb 也是指到 IP:192.168.5.12 SID:dream
所以 DatabaseName 屬性有兩種設法, 一是直接設 'niceapdb' 一是設為 '192.168.5.12/dream'


//使用 Lazarus 內鍵元件測試 OK , 但中文欄位亂碼
//OracleConnection1.HostName := ''; //在 ide design 模式測試發現可以不設
//OracleConnection1.DatabaseName := '192.168.5.12/dream'; //直接聯資料庫所在 IP/SID, OK
OracleConnection1.DatabaseName := 'niceapdb'; //with NetManager setup , OK
OracleConnection1.UserName := 'sa';
OracleConnection1.Password := 'sa123';
//OracleConnection1.Params.Add('codepage=UTF8'); //沒作用
OracleConnection1.Open;
SQLQuery1.PacketRecords:=-1;
SQLQuery1.SQL.Text:='SELECT * FROM "OIS"."PSM_CASHIER"';
SQLQuery1.Active:=true; //SELECT * FROM "OIS"."PSM_CASHIER"
DataSource1.DataSet:=SQLQuery1;


//使用 ZeosLib 外掛元件測試 OK , 且中文欄位正常顯示 (推薦!!)
//ZConnection1.HostName := '' ; //在 ide design 模式測試發現可以不設
ZConnection1.Port := 1521 ;
//ZConnection1.Database := '192.168.5.12/dream'; //直接聯資料庫所在 IP/SID, OK
ZConnection1.Database := 'niceapdb'; //with NetManager setup, OK
ZConnection1.User := 'sa' ;
ZConnection1.Password := 'sa123' ;
ZConnection1.Protocol := 'oracle' ;
ZConnection1.Connected:=true;
ZQuery1.FetchRow:=0;
ZQuery1.SQL.Text:='SELECT * FROM "OIS"."PSM_CASHIER"';
ZQuery1.Active:=true;
DataSource1.DataSet:=ZQuery1;