連線oracle 客戶端vs2010除錯提示ORA-12154: TNS: 無法解析指定的連線識別符號:轉載

taogchan發表於2013-09-17

win7x64 連線oracle 客戶端 vs 2010除錯 提示“ORA-12154: TNS: 無法解析指定的連線識別符號 ”


在debug的時候出現以下問題:

==========
ORA-12154: TNS: 無法解析指定的連線識別符號

原因是除錯用的web伺服器預設在:C:\Program Files (x86)\Common Files\microsoft shared\DevServer\9.0\WebDev.WebServer.EXE,路徑中的括號找的麻煩。
這個是路徑問題
例項:

把WebDev.WebServer拷貝到C:\目錄裡
在執行裡面輸入cmd 輸入c:\WebDev.WebServer.EXE /port:8796 /path:"Web應用程式路徑" /vpath:"/"

之後在VS裡面點選工具裡面的附加到程式

之後就可以除錯了


自己試過不管用,用了Porcesse Explorer看了,看來是(x86)在命令列裡的影響,先解除安裝vs2010更換一下安裝目錄試試

重灌之後並不管用,於是參考了

http://blog.miniasp.com/post/2009/08/31/Solve-ASPNET-cannot-connect-Oracle-DB-using-Development-Server.aspx

我使用了process explorer找出了WebServer4.0.EXE的Command line然後將program file (x86)改成短格式

"C:\PROGRA~2\Common Files\Microsoft Shared\DevServer\10.0\WebDev.WebServer40.exe"   /port:50266 /path:"E:\abcd\efg\abcd2012\zzzz2012\WebSite" /vpath:"/WebSite"

然後修改網站“屬性頁”中“伺服器”選中“使用自定義伺服器”然後再文字框中填入url(http://localhost:50266/WebSite/)

終於解決了。


 

今天又解決一個十分棘手的問題,我們有個專案原本在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),問題跟他一模一樣,因此也花了好多時間研究分析,直到剛剛跟黑大討論一番後終於給我找出解法。

先說說我電腦的安裝步驟與執行環境:

  • 安裝Oracle Database 10g Client Release 2 (10.2.0.1.0) for Microsoft Windows (32-bit)
  • 設定TNSNAMES.ORA 設定檔( 100% 肯定設定沒問題 )
  • 使用SQL Plus 可以正常連線
  • 使用SQL Developer 可以正常連線
  • 在Visual Studio 中可以建置(Build)專案,建置/編譯後的元件部署到測試機也都沒問題
  • 在Visual Studio 中使用內建的ASP.NET 開發伺服器進行測試
  • 利用Process Explorer檢視WebDev.WebServer.EXE程式,載入的元件都沒問題(正確載入)
  • 利用Prcoess Monitor檢視WebDev.WebServer.EXE程式,載入的Oracle Client相關引數檔路徑也都正確無誤

想破頭無法解決時,黑大建議我用最簡單的方式測試資料庫連線(如下範例),雖然我自己已經測試數十遍了,但我還是不鐵齒,聽話的再測一次( 魔鬼總在細節裡):

  1. using  (OracleConnection cn =  new  OracleConnection(  
  2.     "Data Source=MyName;"  +  
  3.     "Persist Security Info=True;"  +   
  4.     "User ID=user;"  +  
  5.     "Password=pass" ))  
  6. {  
  7.     cn.Open();  //在此發生【 ORA-12154: TNS:無法解析指定的連線ID 】的錯誤  
  8. }  

這時我才想到將TNSNAME 的完整定義移到這裡試試看,請看如下範例:

  1. using  (OracleConnection cn =  new  OracleConnection(  
  2.     "Data Source="  +  
  3.     " (DESCRIPTION ="  +  
  4.     " (ADDRESS_LIST ="  +  
  5.     " (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.245)(PORT = 1521))"  +  
  6.     " )"  +  
  7.     " (CONNECT_DATA ="  +  
  8.     " (SERVICE_NAME = MyName)"  +  
  9.     " )"  +  
  10.     " )"  +  
  11.     ";Persist Security Info=True;User ID=user;Password=pass" ))  
  12. {  
  13.     cn.Open();  //在此時發生【 ORA-6413:連線未被開啟】的錯誤  
  14. }  

這就神奇啦,錯誤訊息竟然不一樣,,中英文錯誤訊息如下:

 ORA-6413: 連線未被開啟 
 ORA-06413: Connection not open 

多一條錯誤訊息就多一條線索,對追Code 絕對有幫助。( 好像在玩偵探遊戲一樣^^ )

這時就被我搜出一篇文章ORA-06413: Connection not open.答案就在其中,原來錯誤發生的原因原來是我的ASP.NET開發伺服器( WebDev.WebServer.EXE )執行檔的路徑有特殊字元導致:

C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\9.0\WebDev.WebServer.EXE

就是這該死的(x86)出現在路徑中,導致我的ASP.NET怎樣都無法連線到程式,為了驗證確定就是這問題,我試著利用Process Explorer找出WebDev.WebServer.EXE的啟動引數:

連線oracle 客戶端vs2010除錯提示ORA-12154: TNS: 無法解析指定的連線識別符號:轉載


並重新透過cmd.exe (命令提示字元)啟動WebDev.WebServer.EXE,這時故意用「短目錄」啟動ASP.NET開發伺服器,如下指令:

"C:\ PROGRA~2 \Common Files\Microsoft Shared\DevServer\9.0\WebDev.WebServer.EX 
E" /port:5970 /path:"D:\XXXX\XXX\Website" /vpath:"/"

神奇的事這就樣發生,Oracle 資料庫竟然真的連上了!

我的解決之道

  1. 改用Windows 7 內建的IIS7 進行網站執行與偵錯,不用ASP.NET 開發伺服器了。Windows 7 內建的IIS7 可新增多個網站,管理上也頗方便,不像Windows XP 只能新增一個網站
  2. 改用Visual Studio巨集啟動ASP.NET開發伺服器偵錯,細節可參考我的另一篇文章:啟動ASP.NET偵錯模式的另一種比按下F5還快的方式

本次除錯心得

  • 不要鐵齒,越覺得不可能發生的地方越有可能是破案的核心關鍵!
  • 找個人聊聊你所遇到的錯誤,在互動、對話的過程中也許會想到一些你不曾想到的地方。
  • 「程式除錯」不但要有「經驗」更要有「創意」,當你擁有更多的「生活體驗」(程設的生活),相對的創意也就越多。
  • 熟悉多種除錯工具,並在工具間互動比對、驗證錯誤,一定可以看出一些端倪,但不要只是會「用」工具而已,而是要熟悉工具「背後的原理」,這樣才有助於你思考問題的本質問題背後的問題
  • http://blog.sina.com.cn/s/blog_6d0021460101545s.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22392018/viewspace-772821/,如需轉載,請註明出處,否則將追究法律責任。

相關文章