【问题标题】:Connection to Oracle using Oracle.ManagedDataAccess exception使用 Oracle.ManagedDataAccess 异常连接到 Oracle
【发布时间】:2018-07-01 10:03:08
【问题描述】:

我在我的 C# (>.NET 4.0) 项目中使用 Oracle.ManagedDataAccess Nuget 包版本 12.2.1100。在我的本地主机上一切正常,但在开发服务器上我遇到了这个异常:

异常消息:ORA-12154:TNS:无法解析指定的连接标识符 异常来源:适用于 .NET 的 Oracle 数据提供程序,托管驱动程序

现在我认为 ManagedDataAcess 包含我需要的一切。我还缺少其他东西吗?是否有其他东西干扰了包裹?我需要添加其他东西吗?

注意:我的 Web.config 中没有 <oracle.manageddataaccess.client> 标签

代码:

<connectionStrings>
   <add name="XXX" connectionString="Data Source=XXX;User ID=XXX;Password=XXX" />
</connectionStrings>

编辑:

我已经确认 TNS_ADMIN 变量是在控制面板中设置的,但这似乎没有奏效。

然后我将 tnsnames.ora 文件添加到 bin 文件夹中,我已经让它工作了,但这不是一个长期的解决方案。

【问题讨论】:

  • 你有 tnsnames.ora 文件吗?
  • 是的,它存储在网络驱动器上
  • 使用此文件夹设置环境变量 TNS_ADMIN。
  • 如果没有环境变量TNS_ADMIN,这个需要创建吗?是问题的根源,没有 TNS_ADMIN e.v.?

标签: c# .net oracle odp.net-managed


【解决方案1】:

您可能没有配置 TNS,这就是这种形式的连接字符串不起作用的原因。如果您使用不同形式的连接字符串,则不需要配置 TNS,例如:

Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=MyIpOrServerName)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MySID)));User Id=MyUsername;Password=MyPassword;

将所有 My* 占位符替换为您的值。

【讨论】:

  • 我尝试了你的建议,但我最终得到了Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-12154: TNS:could not resolve the connect identifier specified ---&gt; OracleInternal.Network.NetworkException (0x00002F7A): ORA-12154: TNS:could not resolve the connect identifier specified
  • @AirJer 你确定它确实在使用你的连接字符串吗?你确定它没有使用一些默认的连接字符串吗?你能显示代码以及如何填充连接字符串吗?
  • 是的,日志显示它使用了正确的连接字符串并且没有默认值。恐怕没有什么可以展示的了。连接字符串与您发布的相同。今晚我会再看一遍,看看能不能找到新的东西。感谢到目前为止的建议。
  • 您能否修改您的问题以将您正在使用的代码显示为minimal reproducible example
  • 此连接字符串适合 ODBC。必须是Data Source=...;User Id=myUsername;Password=myPassword; 而不是SERVER=...;uid=myUsername;pwd=myPassword;,请参阅connectionstrings.com/oracle
【解决方案2】:

您的程序找不到tnsnames.ora(或sqlnet.ora)文件。指定位置有多种可能性。

  • 在 .NET 配置文件中定义它(web.configmachine.configapplication.config

  • 设置环境变量TNS_ADMIN

  • tnsnames.orasqlnet.ora文件复制到您的应用程序.exe所在的目录。

.NET 配置文件示例:

<oracle.manageddataaccess.client>
  <version number="4.122.*">
     <settings>
          <setting name="TNS_ADMIN" value="C:\oracle\network\admin"/>
     </settings>
  </version>
</oracle.manageddataaccess.client>

请注意,与其他驱动程序/提供程序不同,ODP.NET 托管驱动程序从注册表读取 TNS_ADMIN 设置。

【讨论】:

  • 虽然这是一个选项,但我更喜欢不需要设置 tnsnames.ora 和 sqlnet.ora 文件。我发现它比拥有一个独立的连接字符串要麻烦得多。因此,我自己的答案。
  • 我问你是否有tnsnames.ora 文件。因此,您的回答是“是”,我提供了解决方案。如果您不喜欢tnsnames.ora,您也可以在 .NET 配置文件中定义别名,或者由 Oracle 名称服务器提供,或者将整个 TNS 硬编码到您的连接字符串中。
  • 不,你没有问我,因为我不是问这个问题的人。我只是在评论你的回答。
  • @mason,对不起,我错过了。
  • 你可以创建一个符号链接
【解决方案3】:

我们在我们的一个环境中看到了类似的问题,以下解决了我们的问题;

当 Oracle Data Provider for .NET 安装在 Web 服务器上时,根据您在安装期间选择的内容,它会将条目写入 machine.config 文件(位于 C:\Windows\Microsoft.NET\Framework64\v4. 0.30319\Config\ 取决于框架版本)。似乎不同版本的 ODP.NET 安装程序对 machine.config 执行不同的操作(我们的一些服务器在 machine.config 中没有指定版本号,而其他服务器则为 oracle 托管客户端指定了特定版本号)

根据安装的版本,它会添加如下几行:

...

<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />

...

<oracle.manageddataaccess.client>
  <version number="4.121.2.0">
    <settings>
      <setting name="TNS_ADMIN" value="C:\oracle\client\product\12.1.0\client_1\network\admin" />
    </settings>
  </version>
</oracle.manageddataaccess.client>

...

这些条目包含一个特定的版本号,指的是 ODP.NET oracle 客户端版本。 我们正在使用与 4.121.2.0 不匹配的托管客户端库(版本 12.2.1100 nuget 包)的 4.122.1.0 版本构建我们的应用程序

我们通过从此标签中删除 oracle 管理的客户端库版本来更改上述条目:

<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess" />

并为此标签的版本号指定一个“*”:

<oracle.manageddataaccess.client>
    <version number="*">
      <settings>
        <setting name="TNS_ADMIN" value="C:\oracle\client\product\12.1.0\client_1\network\admin" />
      </settings>
    </version>
  </oracle.manageddataaccess.client>

如果您需要指定特定的版本号,请确保您的代码使用相同的版本号编译。

如果它们存在,您还可以从 machine.config 中删除所有这些条目,并根据您的配置在应用程序 web.config 中指定它们。

【讨论】:

    【解决方案4】:

    在我的情况下是一种简单的方法。
    在 Program.cs 中设置 ORACLE_HOME 环境变量(入口点类)
    无需在 app.config 中进行任何更改或设置

    [STAThread]
    static int Main()
    {
        var oracleHome = GetOracleHome(); // Find registry...
        Environment.SetEnvironmentVariable("ORACLE_HOME", oracleHome);
    
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        ...
    

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 2016-01-02
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2010-11-20
      • 2015-02-17
      相关资源
      最近更新 更多