oracle - 无法从 Windows 服务连接到 Oracle(错误 : ORA-12154: TNS:could not resolve service name (12154) )

标签 oracle windows-services

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

出于某种原因,当我从 Windows 服务(在计时器事件上)运行以下代码时,出现错误:ORA-12154: TNS:could not resolve service name (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) 看起来服务成功读取了 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 文件后它可能会失败?谢谢

最佳答案

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

关于oracle - 无法从 Windows 服务连接到 Oracle(错误 : ORA-12154: TNS:could not resolve service name (12154) ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7206129/

相关文章:

c# - 某些 Excel 文件未从共享路径移动到 SQL Server

sql - plsql/cursors 处理异常并返回执行流程

sql - Oracle - 按百分比限制 Row_number()

c - 系统托盘中的 Windows 服务消息

c# - 我必须在 Windows 服务中实现 Stop 方法吗?

c# - 使用 Windows 服务截屏

oracle - 如何在 mac 中使用 oracle sql developer 获取查询结果的 GridView ?

sql - 为什么 SQL Server 中的输出不同而 Oracle 中的输出相同?

sql - Oracle 触发器 - :new have when nothing is passed? 有什么值(value)

windows - 设置在 Visual Studio 的 "Title"对话框中显示的 "Attach to Process"值?