【发布时间】:2011-08-26 14:22:55
【问题描述】:
最新更新(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,使sue可以找到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 文件后它可能会失败?谢谢
【问题讨论】:
-
因为它在您运行时可以工作,所以我假设您的 tnsnames.ora 配置正确。您要连接的 ODBC DSN 是设置为系统 DNS 还是用户 DSN?
-
我已经尝试过系统和用户 dsn,两者的行为相同。
-
你用的是哪个版本的windows?
-
我在 Windows 7 上,但据我所知,它发生在所有当前版本的 Windows 上