ORA-12154: TNS:could not resolve the connect identifier specified
本篇目錄
前言
小弟我最近從原本 VM 開發環境要搬回本機開發環境時,是的沒錯不外乎就是把環境恢復到可以開發應用的程度,其中在處理和 Oracle 資料庫連線時,發生了「ORA-12154: TNS:could not resolve the connect identifier specified」◢▆▅▄▃崩╰(〒皿〒)╯潰▃▄▅▇◣
. . .
情境
裝完 ODAC 之後,想說試試看正在開發中的系統能不能連線至 DB Server…
💭 什麼是 Oracle Data Access Components?
想當然爾果然是不行 (´・_・`)
但神奇的是用 Oracle Sql Developer 這套工具居然可以成功連線…
神奇了我的天,讓我們繼續看下去…
. . .
ORA-12154 可能的除錯方向
- 應用程式設定檔(*.config)connectionStrings 是否有打錯?(理論上會和 Oracle Client 下 network/admin/tnsnames.ora 設定有對應)
- Oracle Client 下 network/admin/tnsnames.ora 是否檔案存在?
- Oracle Client 下 network/admin/tnsnames.ora 是否有被存取的權限?
- Oracle Client 下 network/admin/tnsnames.ora 內容設定是否有誤?
. . .
ORA-12154 狀況排除
案例情境
- 使用 ODP.NET 幫助應用程式可以連線至 Oracle 資料庫
- 開發環境需要安裝 ODAC
必須先備註一下,此案例是我遇到的狀況,但應該大同小異哦。
首先我先確認一下設定檔,看起來沒問題…
接著來確認 Oracle Cilent 下 network/admin/tnsnames.ora …
哦,原來是沒有檔案的部分阿 (´・_・`)
因為 ODAC 安裝完後,需要自己從 Sample 資料夾把 sqlnet.ora 和 tnsnames.ora 寫好後丟出來外層資料夾…
Tnsnames.ora 初步設定
- 資料來源別名(Data source)
- 主機位址或 IP(Host name or IP)
- 連接埠(Port)
- 資料庫服務名稱(Database service name)
設定完搬到外層後,應用程式就能正常連線囉(如果還不行,可以試試重開機)。
. . .
延伸
你/妳可能會問為什麼上面都做完之後,應用程式就有辦法連線阿!?
這邊先說一點點哦,有興趣可以上網查查相關資料。
首先我們在開始功能列搜尋「regedit」查看註冊表,以 ODP.NET 來說…
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\[version] 位置下可以看到 Key 為 DllPath 標註的 value 為 Oracle Client 下的 bin 實體路徑。
因為 ODP.NET 實際背後是用 Oracle.DataAccess.dll 去操作資料庫行為,最終會去爬這個路徑的相關 DLL 來達到實際操作的目的,但這也是一個很大的缺點,就是會去依賴註冊表!!
👍 所以現在大部分的應用程式如果要連接 Oracle 資料庫,可以改用 Managed ODP.NET 去實作!!
下面這文就有提到一個修改方式,正是用 Managed ODP.NET 的做法。
💭 ORA-12154: TNS: 無法解析指定的連線 ID
但他怎麼沒設定幾行就能連線,好像又更簡單了!?
對 Managed ODP.NET 來說,它使用的元件是 Oracle.ManagedDataAccess.dll ,但是它對於尋找 TNS 有一套機制且是有順序的。
所以註冊表上只有 Key 為 TNS_ADMIN 標註的 value 為network/admin/tnsnames.ora 的實體路徑,但其實會視情況才會使用到,所以 Managed ODP.NET 不會強制依賴註冊表!!
以上區別。
. . .
結尾
感謝各位花時間看完此篇小文,如果本文中有描述錯誤,還請各位指教。
希望這篇文章可以解決掉大多數人對 ORA-12154 的疑問跟狀況排除◝( ゚∀ ゚ )◟