Crystal 连接到 Oracle 11g 数据库时报告找不到侦听器 (ORA-12541)

Crystal Reports fails to find a listener (ORA-12541) when connecting to Oracle 11g Database

请允许我在开头 post 说我知道这是一个常见的错误代码,并在它尝试连接到 Oracle 数据库时出现在 Crystal 报告中,甚至特别是连接到 11gR2 的 CR08 在互联网上有很好的记录。

几天来我一直在自己进行故障排除,并且尝试了(并在 post 中列出)几乎所有的事情,这就是为什么我决定为我的案例创建一个新的 post .

我没有接受过与计算机技术相关的教育,对 SQL 或 Oracle 的使用经验也很少,这使得阅读假定了解行话的文档有时令人沮丧,因为我一直在谷歌搜索它们的含义。我对这个问题的所有了解都是由于解决了这个问题。

设置


我想做什么?/问题所在

我需要 Crystal 报告才能成功连接到同一台计算机上托管的 Oracle 数据库。建立连接后,我可以继续我的正常工作范围。

我正在尝试通过以下路径连接到数据库:数据库 > 数据库专家 > 创建新连接 > OLE DB (ADO) > Microsoft OLE DB Provider for Oracle。

然后我输入服务 "xe",用户 ID "system",密码 "password"(我会写成系统用户的密码post 的其余部分是随机生成的字母数字字符串)。我返回时出现错误:ORA-12154.

经过一些故障排除后,我能够清除此错误,而不是抛出错误:ORA-12541我在下面解释我是如何到达这里的。


我已解决问题

解决 ORA-12154:

我的第一个想法是检查 tnsnames.ora 是否确实存在并且配置正确。我的在目录中:

"C:\oraclexe\product.2.0\client_1\NETWORK\ADMIN" 以及 listener.ora、sqlnet.ora 和其他 3 个使用文件扩展名 .bak 并且似乎基于 sqlnet.or 和 [=162= 的文件], 我不碰这些。

我的tnsnames.ora如下:

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = IEAS-KEAGAN)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

ORACLR_CONNECTION_DATA = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) 
    ) 
    (CONNECT_DATA = 
      (SID = CLRExtProc) 
      (PRESENTATION = RO) 
    ) 
  ) 
system_xe =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

默认有前3个,我加了最后一个


接下来检查我的sqlnet.oralistener.ora文件,这里分别是:

SQLNET.AUTHENTICATION_SERVICES= (NTS)

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

原来这个没有NAMES.DIRECTORY_PATH,我加了

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product.2.0\server)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    )
  )

DEFAULT_SERVICE_LISTENER = (XE)

这在安装后没有被修改,只是将 HOST 变量从 "IEAS-KEAGAN" 更改为“127.0.0.1”,倒数第 5 行。

此时我开始失去希望,根据另一个用户对另一个 post 的评论,我决定接下来在我的磁盘中搜索 tnsnames.ora[=20= 的所有实例]

我也在我的 client_1\NETWORK\ADMIN 目录中找到了一个 "TNSNAMES.ora",并更新它以匹配服务器的 TNSNAMES.ora。在此之前,它不包含任何条目,只是来自安装的注释。


解决 ORA-12541:

这产生了一个不同的错误,它出现在与 ORA-12154 一样的确切位置,但它现在给出了错误 ORA-12541,TNS:no 侦听器。

这很奇怪,因为我可以在 CMD 中毫无问题地执行 "tnsping system_xe"(当 ORA-12154 是抛出的错误代码时,我也能够这样做)。

我决定从 Documents and Settings>Keaga(我的用户)运行 "lsnrctl stat" 返回 with these results. 显然这些结果表明我的问题是 "listener".

因此,我从熟悉的地方开始,并决定在我的 C:\ 上搜索 LISTENER.ora 的所有实例,就像我之前对 tnsname 所做的那样。

有 2 个 listener.ora 文件,一个用于我在上面引用的服务器安装,另一个位于我的 client_1\NETWORK\ADMIN 目录中,其中包含以下内容:

# listener.ora Network Configuration File: C:\oraclexe\product.2.0\client_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = C:\oraclexe

经过更多的搜索,我找到了一个旧的 post,其中有人通过在他的 [=162] 中设置 HOST 参数时将“127.0.0.1”更改为 "localhost" 来解决此错误=] 和 tnsnames.ora 文件。对我的客户端和服务器安装中的文件执行此操作后,我再次尝试连接并在同一步骤出现另一个错误,ORA-12514:


求解ORA-12514/ORA-12505:

在另一个旧的 Stack Overflow post 中,Brad Rippe 谈到了同样的问题,他的修复是确保在 tnsnames.ora 中找到的 "SERVICE_NAME" 是有效的数据库中的名称。我决定先试试这个。

然而,当我尝试打开 SQL Developer 时,我在尝试连接时也收到了 ORA-12514。 "tnsping system_xe" 不过还是可以的。

经过一些令人沮丧的故障排除后,我完成了这一步,通过添加到 SID_LIST 为 "xe" 创建一个新条目,SQLPlus 现在可以连接到数据库,但是 SQL Developer 现在在尝试连接时抛出 ORA-12505,Crystal Reports 在尝试连接时抛出 ORA-12514。

为了解决我的监听器问题(特别是 Crystal Reports 正在使用的那个)我为我的客户端和服务器编辑了 listener.ora 文件(注意它们在同一台机器上)以调用主机 "localhost" 而不是“127.0.0.1”。

这解决了我的问题并引起了我的注意,我在上次编辑 "Solving ORA-12514/ORA-12505:" 中描述了另一个问题。我目前正在解决这个问题。