无法从Windows服务连接到Oracle(错误:ORA-12154:TNS:无法解析服务名称(12154))

时间:2011-08-26 14:22:55

标签: oracle windows-services

最新消息(2011年11月2日上午9点) 我尝试从服务运行tnsping,它工作! 但是当我尝试连接时仍然会收到错误12154。我现在完全糊涂了,我无法理解tnsping如何正常工作但连接无法解析服务名称。

出于某种原因,当我从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文件后它可能会失败?感谢

7 个答案:

答案 0 :(得分:6)

您在相应对话框中定义的环境变量不可用于Windows服务。您可以尝试的一件事是按照此post中的说明扩展连接字符串。同一篇文章中的其他建议可能适用。

答案 1 :(得分:2)

可能找不到tnsnames.ora文件。确保在启动服务时设置了相同的环境变量。

答案 2 :(得分:0)

确保服务帐户有权读取tnsnames.ora文件。 同样在sqlnet.ora中尝试从SQLNET.AUTHENTICATION_SERVICES中删除NTS(如果存在)。

如果您仍在努力尝试使用ezconnect一起绕过tns名称 例如://ip.of.server/sid

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

答案 3 :(得分:0)

约翰C:对我来说,有几件事情似乎很奇怪。我希望我没有误解你的答复。

在其中一个回复的连接字符串中,您收到有关丢失的驱动程序的错误消息。要解决此问题,您必须提及提供程序/驱动程序,因为您使用的是OdbcConnection而不是OracleConnection。大多数人会使用的OracleConnection会隐式指向驱动程序。我假设您需要服务跨数据库工作,因此需要OdbcConnection。 website为连接字符串提供了很多示例,我认为你应该找到适合的东西。

我建议你试试

  

驱动程序= {Microsoft ODBC for   甲骨文} ; CONNECTSTRING =(DESCRIPTION =(ADDRESS =(PROTOCOL = TCP)(HOST =服务器)(PORT = 7001))(CONNECT_DATA =(SERVICE_NAME = MYDB))); UID =名为myUsername; PWD = MYPASSWORD;

另一件事是你的TNS_ADMIN变量指向的位置。你曾经提到过你指向OraHome。我只想确认您已将变量指向OraHome中的 NETWORK \ ADMIN 文件夹。我相信你必须指向文件所在的文件夹。

最后,我建议您尝试从原始帖子中的连接字符串中取出一些参数。它会减少可能影响结果的变量,使其更容易调试。并将为用户配置的环境变量作为系统环境变量。也许你赢得应用程序工作的原因是因为为用户定义了一个变量。我怀疑Windows服务可能只使用系统变量。

  

Driver = {Oracle in   OraHome92};服务器= myServerAddress; DBQ = MYDATABASE; UID =名为myUsername; PWD = MYPASSWORD;

答案 4 :(得分:0)

好的,我将在这里回答我自己的问题,只是为了让最终的决议与导致我的有用建议分开。一旦我仔细阅读,尼古拉引用的帖子就得到了答案。我的服务是从Program Files(x86)运行的,而oracle驱动程序无法在调用应用程序的路径中处理()。 我将我的服务移动到D:\ ServiceTest,它运行正常。 我现在的问题是我不认为我们的应用程序可以移出Program Files(x86) 谢谢大家的帮助,我感谢所有人的意见,但我必须向Nicola提供赏金,因为他向我指出了包含答案的帖子。 再次感谢您的帮助

答案 5 :(得分:0)

我已经解决了这个问题。

我的数据库密码中有一个'@'字符。更改密码并删除该字符后,问题已得到解决,导出操作已成功完成。

This link有助于解决问题。

答案 6 :(得分:0)

验证TNS名称定义在tnsnames.ora

中的名称前没有空格