一、問題原因
用Navicat Premium 連接 Oracle,提示:
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
中文版的提示:
ORA-12514: TNS: 監聽程序當前無法識別連接描述符中請求服務
1、各軟件的版本
Navicat Premium 版本:11.2.14(64-bit)
Oracle 版本:10.2.0.1.0(32-bit)
2、連接方式
其中,服務名或SID是默認的ORCL,點擊連接測試,出現上訴的錯誤!
谷歌查詢了一番,折騰了一天,都建議修改 listrner.ora 和 tnsnames.ora 。
這兩個文件的路徑:(我是安裝在C盤)
C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN
listrner.ora源碼:

1 SID_LIST_LISTENER = 2 (SID_LIST = 3 (SID_DESC = 4 (SID_NAME = PLSExtProc) 5 (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server) 6 (PROGRAM = extproc) 7 ) 8 (SID_DESC = 9 (SID_NAME = CLRExtProc) 10 (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server) 11 (PROGRAM = extproc) 12 ) 13 ) 14 15 LISTENER = 16 (DESCRIPTION_LIST = 17 (DESCRIPTION = 18 (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) 19 (ADDRESS = (PROTOCOL = TCP)(HOST = Darlin-PC)(PORT = 1521)) 20 ) 21 ) 22 23 DEFAULT_SERVICE_LISTENER = (XE)
tnsnames.ora源碼:

1 XE = 2 (DESCRIPTION = 3 (ADDRESS = (PROTOCOL = TCP)(HOST = Darlin-PC)(PORT = 1521)) 4 (CONNECT_DATA = 5 (SERVER = DEDICATED) 6 (SERVICE_NAME = XE) 7 ) 8 ) 9 10 EXTPROC_CONNECTION_DATA = 11 (DESCRIPTION = 12 (ADDRESS_LIST = 13 (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) 14 ) 15 (CONNECT_DATA = 16 (SID = PLSExtProc) 17 (PRESENTATION = RO) 18 ) 19 ) 20 21 ORACLR_CONNECTION_DATA = 22 (DESCRIPTION = 23 (ADDRESS_LIST = 24 (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) 25 ) 26 (CONNECT_DATA = 27 (SID = CLRExtProc) 28 (PRESENTATION = RO) 29 ) 30 ) 31 TEST = 32 (DESCRIPTION = 33 (ADDRESS_LIST = 34 (ADDRESS = (PROTOCOL = TCP)(HOST = *<validhost>*)(PORT = *<validport>*)) 35 ) 36 (CONNECT_DATA = 37 (SERVER = DEDICATED) 38 (SERVICE_NAME = *<servicenamefromDB>*) 39 ) 40 )
比如說, 有建議在 listrner.ora 的第7行后添加以下代碼:

1 (SID_DESC = 2 (GLOBAL_DBNAME = ORCL) 3 (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server) 4 (SID_NAME = ORCL) 5 )
重啟Oracle的服務,問題解決!
也有建議在 tnsnames.ora 文件中添加以下代碼:

1 TEST = 2 (DESCRIPTION = 3 (ADDRESS_LIST = 4 (ADDRESS = (PROTOCOL = TCP)(HOST = *<validhost>*)(PORT = *<validport>*)) 5 ) 6 (CONNECT_DATA = 7 (SERVER = DEDICATED) 8 (SERVICE_NAME = *<servicenamefromDB>*) 9 ) 10 )
重啟Oracle的服務,問題解決!
然而,在我這里,問題依然沒有解決,沒有解決,沒有解決!!!
二、解決方案
在我准備放棄的時候,看到 listrner.ora 最后一行有這么一句代碼:
DEFAULT_SERVICE_LISTENER = (XE)
並且我的Oracle服務如下:
並沒有OracleServiceORCL這一項啊,有的是OracleServiceXE 於是,我就用以下方式連接:
看到這個界面的時候,那個激動啊,折騰了一天了。終於連接成功了!!!
三、總結
文件 listrner.ora 中配置監聽的服務名是XE, 並且有的是OracleServiceXE。
意思就是,我的服務器名字叫XE,不是默認的ORCL,所以才出現這樣的錯誤!