Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';无法从windows服务连接到Oracle(错误:ORA-12154:TNS:无法解析服务名称(12154))_Oracle_Windows Services - Fatal编程技术网

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

Can';无法从windows服务连接到Oracle(错误:ORA-12154:TNS:无法解析服务名称(12154)),oracle,windows-services,Oracle,Windows Services,最新更新(2011年11月2日上午9点) 我试着从服务中运行tnsping,它成功了! 但是,当我尝试连接时,仍然会出现错误12154。我现在完全糊涂了,我不明白tnsping如何工作得很好,但是连接无法解析服务名称 由于某种原因,当我从windows服务(在计时器事件上)运行以下代码时,我得到错误:ORA-12154:TNS:无法解析服务名称(12154) 当我从windows窗体应用程序运行完全相同的代码时,它的连接很好。服务和应用都在我的帐户下运行,因此帐户权限没有差异。 我不明白为什么服

最新更新(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) 看起来服务正在成功读取tnsnames.ora文件。我运行了process monitor并获得以下行:

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文件。确保在启动服务时设置了相同的环境变量。

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

请确保服务帐户具有读取tnsnames.ora文件的权限。 此外,在sqlnet.ora中,如果存在NTS,请尝试从sqlnet.AUTHENTICATION\u服务中删除NTS

如果您仍在挣扎,请尝试使用ezconnect一起绕过tns名称 ex://ip.of.server/sid


约翰·C:有几件事我觉得很奇怪。我希望我没有误解你的回答

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

我建议你试试

驱动程序={Microsoft ODBC for 甲骨文};CONNECTSTRING=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=server)(PORT=7001))(CONNECT_DATA=(SERVICE_NAME=myDb));Uid=我的用户名;Pwd=我的密码

另一件事是TNS_ADMIN变量指向的位置。你说过你指的是家。我只是想确认您是否将变量指向OraHome中的网络\管理文件夹。我相信您必须指向文件所在的文件夹

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

驱动程序={Oracle in OraHome92};Server=myserver地址;Dbq=myDataBase;Uid=我的用户名;Pwd=我的密码


好的,我将在这里回答我自己的问题,只是为了将最终的解决方案与引导我实现它的有用建议分开。尼古拉提到的那篇文章)我仔细读了一遍)最终找到了答案。我的服务是从程序文件(x86)运行的,oracle驱动程序无法处理调用应用程序路径中的() 我将我的服务移动到了D:\ServiceTest,它工作得很好。 我现在的问题是,我认为我们的应用程序无法移出程序文件(x86)。
谢谢大家的帮助,我感谢大家的意见,但我必须把奖金给尼古拉,因为他把我指给了包含答案的帖子。
再次感谢您的帮助

我已经解决了这个问题

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


有助于解决此问题。

请验证TNS Name定义在tnsnames.ora中的名称前没有空格

因为它在您运行它时起作用,我将假设您的tnsnames.ora配置正确。您连接到的ODBC DSN是系统DNS还是用户DSN?我尝试过使用系统DSN和用户DSN,两者都有相同的行为。您使用的是哪个版本的windows?我使用的是windows 7,但据我所知,它在所有当前版本的windows上都会发生感谢您的输入。只是为了检查并确保将TNS_ADMIN环境变量添加到系统变量中,并将其指向orahome目录,然后重新启动服务。据我所知,这应该可以确保服务能够找到tnsnames.ora文件,但我仍然会遇到同样的错误。我也有同样的问题。我更新我的TNS_ADMIN env变量