2011-08-26 76 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

相关问题