2011-08-26 51 views
5

最新更新(2011年11月2日上午9時) 我試圖運行從服務用tnsping和有用! 但是當我嘗試連接時,仍然收到錯誤12154。我現在完全困惑,我不明白如何tnsping可以正常工作,但連接無法解析服務名稱。無法從Windows服務連接到Oracle(:ORA-12154:TNS:錯誤無法解析服務名稱(12154))

出於某種原因,當我運行從Windows服務下面的代碼(在定時器事件),我得到的錯誤:ORA-12154:TNS:無法解析服務名稱(12154)

當我運行完全相同的代碼從Windows窗體應用程序,它連接就好了。服務和應用都在我的帳戶下運行,因此帳戶權限沒有區別。
我很困惑,爲什麼服務失敗,任何人都可以點亮這個請嗎?

string connectionString =  ";DSN=o1;UID=SCOTT;PWD=TIGER;DBQ=ORCL;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0;"; 
     OdbcConnection cnn; 
     cnn = new OdbcConnection(connectionString); 
     try 
     { 
      cnn.Open(); 
      myEventLog.WriteEntry("Connection SUCCEEDED!!!"); 
      cnn.Close(); 
     } 
     catch (Exception ex) 
     { 
      string mes = "Connection FAILED!!!" + ex.Message; 
      myEventLog.WriteEntry(mes); 
     } 

更新:

1)我試過用系統和用戶DSN,都具有相同的行爲

2)我添加了一個TNS_ADMIN系統環境變量,以使起訴它可以找到tnsnames.ora文件。這並沒有改變行爲。

最新更新(2011年11月1日):

1)很多的建議,都涉及把Oracle服務器的IP地址的連接字符串中繞過tnsnames.ora文件。不幸的是,該應用程序必須使用用戶設置的Oracle連接,所以我們沒有任何這些信息。我所要做的就是DSN。我必須使用Oracle DSN從Windows服務進行連接。

新更新(2011年11月2日): 1)它看起來像服務IS成功地讀取tnsnames.ora文件。我跑的過程監控,並得到這些行:

7:52:54.4365217 AM OracleService.exe 4624 CreateFile   C:\oracle\ora92\network\Names\sdns.ora NAME NOT FOUND Desired Access: Generic Read, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a 
7:52:54.4368466 AM OracleService.exe 4624 CreateFile C:\Windows\SysWOW64\tnsnames.ora NAME NOT FOUND Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a 
7:52:54.4371203 AM OracleService.exe 4624 CreateFile C:\oracle\ora92\network\ADMIN\tnsnames.ora SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened 
7:52:54.4372693 AM OracleService.exe 4624 QueryBasicInformationFile C:\oracle\ora92\network\ADMIN\tnsnames.ora SUCCESS CreationTime: 01/11/2011 3:10:08 PM, LastAccessTime: 01/11/2011 3:10:08 PM, LastWriteTime: 01/11/2011 3:10:42 PM, ChangeTime: 01/11/2011 3:18:44 PM, FileAttributes: A 
7:52:54.4372866 AM OracleService.exe 4624 CloseFile C:\oracle\ora92\network\ADMIN\tnsnames.ora SUCCESS 
7:52:54.4375418 AM OracleService.exe 4624 CreateFile C:\oracle\ora92\network\ADMIN SUCCESS Desired Access: Read Data/List Directory, Synchronize, Disposition: Open, Options: Directory, Synchronous IO Non-Alert, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened 
7:52:54.4375857 AM OracleService.exe 4624 QueryDirectory C:\oracle\ora92\network\ADMIN\tnsnames.ora SUCCESS Filter: tnsnames.ora, 1: tnsnames.ora 
7:52:54.4376192 AM OracleService.exe 4624 CloseFile C:\oracle\ora92\network\ADMIN SUCCESS 
7:52:54.4377770 AM OracleService.exe 4624 CreateFile C:\oracle\ora92\network\ADMIN\tnsnames.ora SUCCESS Desired Access: Generic Read, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a, OpenResult: Opened 
7:52:54.4379306 AM OracleService.exe 4624 ReadFile C:\oracle\ora92\network\ADMIN\tnsnames.ora SUCCESS Offset: 0, Length: 337, Priority: Normal 
7:52:54.4380061 AM OracleService.exe 4624 ReadFile C:\oracle\ora92\network\ADMIN\tnsnames.ora END OF FILE Offset: 337, Length: 4,096 
7:52:54.4380276 AM OracleService.exe 4624 CloseFile C:\oracle\ora92\network\ADMIN\tnsnames.ora SUCCESS 
7:52:54.4385823 AM OracleService.exe 4624 CreateFile C:\oracle\ora92\network\ADMIN\ldap.ora NAME NOT FOUND Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a 

因此,沒有人有任何想法,爲什麼它會讀取tnsnames.ora文件後失敗?謝謝

+0

由於它的工作原理,當你運行它,我會假設你的tnsnames.ora配置是否正確。您正在連接的ODBC DSN設置爲系統DNS或用戶DSN嗎? – Tridus

+0

我試過用系統和用戶dsn,都有相同的行爲。 –

+0

您使用的是哪個版本的Windows? – WaldiMen

回答

0

好的,我要在這裏回答我自己的問題,只是爲了讓最終解決方案與導致我的有用建議分開。尼古拉引用的帖子)我仔細閱讀後)竟然得到了答案。我的服務從Program Files(x86)運行,oracle驅動程序無法在調用應用程序的路徑中處理()。
我將我的服務移動到D:\ ServiceTest並且工作正常。 我現在的問題是,我不認爲我們的應用程序可以移出Program Files(x86)。
謝謝大家的幫助,我很感謝大家的意見,但我必須向Nicola提供賞金,因爲他向我指出了包含答案的帖子。 再次感謝您的幫助

2

它可能找不到tnsnames.ora文件。確保在啓動服務時設置相同的環境變量。

+0

感謝您的輸入。只需檢查並確保將TNS_ADMIN環境變量添加到系統變量並將其指向orahome目錄並重新啓動服務。據我所知,應該確保服務可以找到tnsnames.ora文件,但我仍然得到相同的錯誤。 –

6

您在相應對話框中定義的環境變量不適用於Windows服務。您可以嘗試的一件事是擴展您的連接字符串,如此post中所述。來自同一職位的其他建議可能適用。

+0

感謝您的意見。我很抱歉,但我不明白甲骨文或連接字符串很好,所以我嘗試了什麼建議您的鏈接,但是當我更改我的連接字符串:數據源=(描述=(ADDRESS_LIST =(地址=(協議= TCP )(HOST = 192.168.121.200)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = ORCL))); User Id = SCOTT; Password = TIGER;我得到的錯誤:[IM002] [微軟] [ODBC驅動程序管理器]未找到數據源名稱,沒有指定默認驅動程序,我在應用程序和服務中都得到它,所以我做了一些錯誤的事,但我無法弄清楚什麼。謝謝 –

+0

您是否嘗試了我鏈接的問題中的其他建議? @crb的答案似乎與您的問題有關。 –

+0

嗨尼古拉,謝謝!至少我迄今取得了一些進展。我沒有看到crb的建議,現在我有我跑過程監視器,發現令人驚訝的服務似乎是找到並閱讀正確的tnsnames.ora文件。所以必須有一些其他問題,該服務應用程序沒有。我將從processes監視器發佈相關的linces,顯示該服務已成功讀取tnsnames.ora文件。謝謝 –

0

確保服務帳戶有權讀取tnsnames.ora文件。 也在sqlnet.ora嘗試從SQLNET.AUTHENTICATION_SERVICES刪除NTS,如果它存在。

如果您正在使用EZCONNECT TNS的名字繞過所有一起 前還在苦苦嘗試://ip.of.server/sid

http://www.orafaq.com/wiki/EZCONNECT

+0

我已經嘗試過ezconnect,無法從應用程序或服務中獲取它,所以我不得不更好地說明它。但即使它工作,我也無法使用它,因爲這是一個用戶定義的oracle連接,所以我必須連接的是dsn。 –

+0

我假設DSN = o1是在您的計算機上定義的odbc連接。 當您在「TNS服務名稱」中編輯odbc連接時,請使用//ip.addr/SID替換您當前擁有的任何內容,其中ip.addr是您的oracle計算機的ip,SID是Oracle實例的SID或數據庫名稱。 –

+0

還要確保在sqlnet.ora文件中有以下內容NAMES.DIRECTORY_PATH =(ezconnect,tnsnames) 我從來沒有必須自己使用它,但嘗試添加它,如果它不起作用。 –

0

約翰·C:一對夫婦的事情似乎奇怪了吧。我希望我沒有誤解你的回覆。

在其中一個回覆的連接字符串中,您收到有關缺少驅動程序的錯誤。要解決這個問題,你必須提及提供者/驅動程序,因爲你使用的是OdbcConnection而不是OracleConnection。大多數人使用的OracleConnection會隱含地指向驅動程序。我假設你需要服務跨數據庫工作,所以需要OdbcConnection。 website給出了很多連接字符串的例子,我認爲你應該找到適合的東西。

我建議你嘗試

Driver={Microsoft ODBC for Oracle};CONNECTSTRING=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=server)(PORT=7001))(CONNECT_DATA=(SERVICE_NAME=myDb)));Uid=myUsername;Pwd=myPassword;

的另一件事是,你的TNS_ADMIN變量指向的位置。你剛纔提到你指的是OraHome。我只是想確認您是否將變量指向OraHome內的NETWORK \ ADMIN文件夾。我相信你將不得不指向文件所在的文件夾。

最後,我建議你嘗試從原始帖子中的連接字符串中取出一些參數。它會減少可能影響結果的變量,使其更易於調試。並將爲用戶配置的環境變量設置爲系統環境變量。也許你winforms應用程序工作的原因是因爲爲用戶定義了一個變量。我懷疑Windows服務可能只使用系統變量。

Driver={Oracle in OraHome92};Server=myServerAddress;Dbq=myDataBase;Uid=myUsername;Pwd=myPassword;

+0

謝謝akhliss,我試過簡化連接字符串,但它仍然不起作用。我不會花太多時間直接嘗試連接字符串,其中包括服務器IP,因爲我們不知道服務器IP(請參閱問題的更新),因爲這無助於我們的應用程序。感謝您的努力,並歡迎您提供任何其他建議。 –

0

我已經解決了這個問題。

我的數據庫的密碼中有一個'@'字符。在我更改密碼並刪除該字符後,問題已得到解決,導出操作已成功完成。

This link有助於解決問題。

0

驗證TNS名稱的定義沒有名稱之前的空間在tnsnames.ora

相關問題