【问题标题】:C# Project with Oracle.DataAccess.dll (v2) on Win 7 with ORA-12154 ERROR在 Win 7 上使用 Oracle.DataAccess.dll (v2) 的 C# 项目,出现 ORA-12154 错误
【发布时间】:2016-04-11 20:44:59
【问题描述】:

我有:

  • 赢 7 (64)
  • VS 2010
  • Oracle 客户端 11g (32 - client_1 | 64 - client_2)
  • ODP.NET (32 - c:\oracle\ | 64 - c:\oracle64)

我有旧项目 C#,在项目引用中添加了 Oracle.DataAccess.dll (v2)。

在 Win PATH 我只有 C:\Oracle11g\product\11.2.0\client_2\bin; (64)

如果我在任何模式下启动应用程序都会得到 ORA-Error

Oracle.DataAccess.Client.OracleException ORA-12154: TNS:could not resolve the connect identifier specified

在 app.config 中

<connectionStrings>
  <add name="ConnectionStringTEST" connectionString="DATA SOURCE=TEST;PASSWORD=TEST;PERSIST SECURITY INFO=True;USER ID=TEST"
   providerName="Oracle.DataAccess.Client" />
 </connectionStrings>

我如何知道哪个 TNSNAMES 库在 C# 应用程序中使用 Oracle.DataAccess.dll?


我在 REGEDIT 中正确设置了所有 ORACLE_HOME(等)。

我以为使用PATH系统中列出的目录中的tns_names,但我发现它使用了ODP.net的tns_names,我将某些安装到c:\oracle\ (32), 为什么? ()

我不知道为什么它不使用系统 PATH 中引用的标准 Oracle 客户端。

在安装它的其他计算机上,只有一个 oracle 客户端 (32),编译的应用程序运行没有问题(错误)。

【问题讨论】:

标签: c# .net oracle dll oracle11g


【解决方案1】:

我建议您完全跳过 TNS 名称。如果您可以成功地tnsping 服务器(在任何机器上)并获得您需要的元素,您可以使用 Oracle 的 EzConnect 字符串来代替。这有几个优点:

  1. 当您安装了多个版本时,正如您所提到的,没有混淆 - 没关系,因为您没有使用 tnsnames
  2. 当您在另一台机器上部署时,不依赖于他们的 tnsname 是否正确设置
  3. 如果迁移了服务器,您可以更新代码,而不必担心应用程序的任何目标计算机是否已更新 tnsnames

优势#3 是一把双刃剑,因为使用 tnsnames 您可以编辑 tns 文件,而不必处理更改连接字符串,但在我看来,这是一个很小的代价。

所以,如果你 tnsping 测试,你通常会说 Data Source=TEST

> tnsping test

你会得到这样的结果:

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = myserver.foo.com)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = TEST)))

您可以将数据源字符串更改为:

Data Source=myserver.foo.com:1521/TEST

【讨论】:

  • EzConnect 使用非常简单,但也有很多限制。使用 tnsnames.ora Local Naming Parameters 查看您拥有的一系列选项,例如负载平衡或故障转移
  • 当我使用 tnsping test - 我从 client_2 获得 TNSNAMES,但我不能使用 TNSNAMES 的缩短或整个字段。我的应用程序可以在多台计算机上运行,​​并且 tnsnames.ora 中的 HOST 有时可以更改。因此,我只需要使用 app.config SID,但我不知道使用哪个 tnsnames.ora 应用程序以及为什么(使用 ODP 32b tnsnames.ora)。我对为什么应用程序完全使用 ODP 中的 tnsnames.ora 感兴趣。在其他只有 Oracle 客户端的计算机和服务器上一切正常。我没有在 REGEDIT 的另一个 MS Win 变量中设置 TNS_NAMES
  • 您是否考虑过将连接数据存储在引导过程中的某个位置?这样,您可以两全其美。我理解为什么 tnsnames 很吸引人,但你所描述的一切都强化了我为什么最好直接连接。也就是说,如果您转到目标计算机并键入 set,它将显示所有环境变量及其设置,这可能会为您提供有关它为何选择 Oracle 环境的线索
【解决方案2】:

Oracle 可能会在这些位置查找文件 tnsnames.ora(或者更准确地说是文件 sqlnet.ora,然后定义是否应读取 tnsnames.ora):

  • 环境变量TNS_ADMIN

  • 注册表设置:HKLM\SOFTWARE\ORACLE\KEY_{ORACLE_HOME_NAME}\TNS_ADMIN 用于 64 位

    HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_{ORACLE_HOME_NAME}\TNS_ADMIN 用于 32 位

  • 文件夹%ORACLE_HOME%\network\admin

  • 当前文件夹

  • 应用程序二进制文件所在的文件夹

另请参阅此分析器:Determining locatation of relevant tnsnames.ora file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多