2

我正在尝试使用 MS 访问连接到 Oracle 数据库。我不断收到以下错误消息:

ORA-12154: TSN- 无法解析指定的连接标识符

Oracle Drivers OracleClient10g 可以验证数据库服务器是否存在。

我的 tsnnames.ora 文件中有一个部分如下所示: UBASEP10G = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = bxxx-xxx.yyyy.com)(PORT = 1521)) ) ( CONNECT_DATA = (SERVICE_NAME = UBASE) ) )

根据我解决此错误的尝试,我将其添加到 sqlnet.ora 文件中:

NAMES.DIRECTORY_PATH=(主机名、ONAMES、TNSNAMES、LDAP、EZCONNECT)

使用 Windows ODBC 驱动程序配置实用程序时,它会询问以下信息 DATA SOURCE NAME : MYSOURCE NAME TSN SERVICE NAME:UBASEP10G USERID:MYUSERID

有什么建议么 ?????

4

5 回答 5

3

我没有 Access,但使用 Excel 2007,我必须执行以下操作:

  1. 打开 ODBC 管理员(在管理员控制面板中)
  2. 对于用户 DSN 或系统 DSN,单击添加...
  3. 选择“Oracle in OraDb10g_home1”作为驱动程序
  4. 在 Oracle ODBC 驱动程序配置中,我输入了:
    • 数据源名称:myOracleDsn
    • 描述:这是我的 Oracle 数据库的 DSN
    • TNS 服务名称: oratns
    • 用户名:斯科特
  5. 单击测试连接,然后输入“tiger”作为密码。显然,我正在连接到我的 scott/tiger 示例 Oracle 数据库。此外,当我安装 Oracle 时,我选择了 oratns 作为我的 TNS 名称。上面的其他两个值是任意的——您将在 Excel 的对话框中看到它们。
  6. 如果测试有效,请单击“确定”。
  7. 转到 Excel 并与 DSN 建立新连接。该对话框将显示“myOracleDsn”作为选项。选择它,再次输入“tiger”作为密码,你应该得到一个有效的连接。
于 2008-10-29T16:08:48.900 回答
0

您可以通过 SQL*Plus 登录到相关数据库吗?从具有工作连接的另一台机器(或数据库服务器本身)执行此操作也可以。

如果是这样,运行这个:

select value from v$parameter where name='service_names';

在您的 TNSNAMES.ORA 中,为 SERVICE_NAME 使用其中列出的值之一。

在您的 ODBC 连接中,您只需将 TNS 服务名称设置为您在上面使用的名称“UBASEP10G”

于 2008-10-29T16:50:16.213 回答
0

尝试 tnsping 并报告您的结果。

坏的:

C:\>tnsping notreal.world

TNS Ping Utility for 32-bit Windows: Version 9.2.0.5.0 - Production on 29-OCT-2008 15:56:47

Copyright (c) 1997 Oracle Corporation.  All rights reserved.

Used parameter files:
C:\oracle\ora92\network\admin\sqlnet.ora

TNS-03505: Failed to resolve name

好的:

O:\>tnsping real.world

TNS Ping Utility for 32-bit Windows: Version 9.2.0.5.0 - Production on 29-OCT-2008 15:57:42

Copyright (c) 1997 Oracle Corporation.  All rights reserved.

Used parameter files:

C:\oracle\ora92\network\admin\sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = DBSERVER.DOMAIN.COM)(PORT = 1521)) (LOAD_BALANCE = YES) (FAILOVER = YES))
(CONNECT_DATA = (SERVICE_NAME = REAL.WORLD) 
(FAILOVER_MODE = (TYPE = SELECT) (METHOD = BASIC) (RETRIES = 10) (DELAY = 3))))
OK (40 msec)
于 2008-10-29T20:08:46.797 回答
0

尝试在 TNSNAMES.ora 文件中将 (CONNECT_DATA = (SERVICE_NAME = UBASE) ) 更改为 (CONNECT_DATA = (SID = UBASE) )。

ServiceName 和 SID 不一定相同,因此并不总是可以互换的。

SERVICENAME 参数引用在数据库服务器上的 listener.ora 文件中指定的特定 GLOBAL_DBNAME。它是服务器上实例的别名。您可以在引用相同 SID 的服务器上拥有多个服务名称。SID 参数是指该服务器上的特定实例。

在客户端使用 servicename 的优点是 DBA 可以将 servicename 引用的实际实例透明地更改给使用该名称的客户端。我可以在服务器 listener.ora 文件中有这个:

(SID_DESC =
  (GLOBAL_DBNAME = THESERVICE)
  (ORACLE_HOME = d:\oracle\10.2.0_DB)
  (SID_NAME = SID1)

稍后,我可以通过切换 listener.ora 配置来更改实际引用的数据库:

(SID_DESC =
  (GLOBAL_DBNAME = THESERVICE)
  (ORACLE_HOME = d:\oracle\10.2.0_DB)
  (SID_NAME = SID2)

在客户端,没有人更聪明。客户端上的 tnsnames.ora 文件无需更改。

于 2008-10-29T16:22:59.077 回答
0

让我们回到第一方。打开命令窗口并连接到您的数据库:

sqlplus myuserid/mypassword@UBASEP10G

这样连接成功吗?

既然答案是否定的,有没有办法可以成功连接到这个数据库?BQ 是对的,你的问题出在 UBASE 的服务名上。您需要确定服务器上的侦听器认为该数据库的名称是什么。您有权访问服务器吗?你可以在服务器上执行命令“lsnrctl status”吗?这将告诉您向侦听器注册的服务,如下所示:

Services Summary...
Service "UBASE" has 1 instance(s).
  Instance "UBASE", status READY, has 1 handler(s) for this service...
于 2008-10-29T17:20:30.317 回答