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?

想當然爾果然是不行 (´・_・`)

Error Message
Error Message

但神奇的是用 Oracle Sql Developer 這套工具居然可以成功連線…

Oracle Sql Developer
Oracle Sql Developer

神奇了我的天,讓我們繼續看下去…

. . .

ORA-12154 可能的除錯方向

  1. 應用程式設定檔(*.config)connectionStrings 是否有打錯?(理論上會和 Oracle Client 下 network/admin/tnsnames.ora 設定有對應)
  2. Oracle Client 下 network/admin/tnsnames.ora 是否檔案存在?
  3. Oracle Client 下 network/admin/tnsnames.ora 是否有被存取的權限?
  4. Oracle Client 下 network/admin/tnsnames.ora 內容設定是否有誤?

. . .

ORA-12154 狀況排除

案例情境

  1. 使用 ODP.NET 幫助應用程式可以連線至 Oracle 資料庫
  2. 開發環境需要安裝 ODAC

必須先備註一下,此案例是我遇到的狀況,但應該大同小異哦。

首先我先確認一下設定檔,看起來沒問題…

*.config
*.config

接著來確認 Oracle Cilent 下 network/admin/tnsnames.ora …

哦,原來是沒有檔案的部分阿 (´・_・`)

因為 ODAC 安裝完後,需要自己從 Sample 資料夾把 sqlnet.ora 和 tnsnames.ora 寫好後丟出來外層資料夾…

Tnsnames.ora 初步設定

tnsnames.ora
tnsnames.ora
  1. 資料來源別名(Data source)
  2. 主機位址或 IP(Host name or IP)
  3. 連接埠(Port)
  4. 資料庫服務名稱(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 的疑問跟狀況排除◝( ゚∀ ゚ )◟