20170201
今天遇上一個困難的問題,說明如下:
開發環境:win 10/vs 2015/oracle 10g/ms sql2014
測試環境:win server 2018/iis 10
在本機開發後可連oracle db,連線字串為<connectionString="DATA SOURCE=XXXXX;PASSWORD=XXXXX;USER ID=XXXXX">
但最後卻改成另一種連線字串就可以連到了,連線字串為<connectionString="Data Source = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = XXXXX)(PORT = XXXXX)))(CONNECT_DATA = (SERVICE_NAME = XXXXX))); Persist Security Info=True;User ID = XXXXX; Password=XXXXX">
而以下為參考<保哥>網站上文章所得到的心得及部份內容節錄:<先感謝保哥的文章,如內容不可copy/paste來說明,再請告知後刪除,謝謝>
https://blog.miniasp.com/post/2009/08/31/Solve-ASPNET-cannot-connect-Oracle-DB-using-Development-Server.aspx
今天又解決一個十分棘手的問題,我們有個專案原本在 x86 機器上開發 ( 資料庫採用 Oracle ),最近由於主機升級到 Windows 7 (x64) 後發現程式出問題,當在 Visual Studio 中按下 F5 進行測試除錯時完全無法連接到資料庫,而且一整個很沒道理,看看我如何解決這個棘手的問題吧。
我遇到的錯誤如下:
ORA-12154: TNS: 無法解析指定的連線 ID
ORA-12154:TNS:could not resolve service name
錯誤發生點是在「建立連線」的程式碼,只要 Open Connection 就會立即出錯。
這問題首先是出在我同事的身上,他主機在一個多月前換成 Windows Server 2008 (x64),而我是最近才換到 Windows 7 (x64),問題跟他一模一樣,因此也花了好多時間研究分析,直到剛剛跟黑大討論一番後終於給我找出解法。
想破頭無法解決時,黑大建議我用最簡單的方式測試資料庫連線 (如下範例),雖然我自己已經測試數十遍了,但我還是不鐵齒,聽話的再測一次 ( 魔鬼總在細節裡 ):
using (OracleConnection cn = new OracleConnection( "Data Source=MyName;" + "Persist Security Info=True;" + "User ID=user;" + "Password=pass")) { cn.Open(); // 在此發生【 ORA-12154: TNS: 無法解析指定的連線 ID 】的錯誤 }
這時我才想到將 TNSNAME 的完整定義移到這裡試試看,請看如下範例:
using (OracleConnection cn = new OracleConnection( "Data Source=" + " (DESCRIPTION =" + " (ADDRESS_LIST =" + " (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.245)(PORT = 1521))" + " )" + " (CONNECT_DATA =" + " (SERVICE_NAME = MyName)" + " )" + " )" + ";Persist Security Info=True;User ID=user;Password=pass")) { cn.Open(); // 在此時發生【 ORA-6413: 連線未被開啟 】的錯誤 }
神奇的事這就樣發生,Oracle 資料庫竟然真的連上了!!
我的解決之道
- 請同事先協助,看之前有沒有遇過這樣的問題,然後討論找的方向。
- 其實也是滿神的,一週前還完全沒頭緒也不想處理,因為太煩,但經討論後,又看見<保哥>的文章,耐下性子去測試,就成功了,只是沒像<保哥>他們遇見的那麼細,因為server上是沒裝vs的IDE啊!