使用Oracle.ManagedDataAccess异常连接到Oracle

时间:2018-01-22 17:36:51

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

我在C#(> .NET 4.0)项目中使用了Oracle.ManagedDataAccess Nuget Package Version 12.2.1100。在我的localhost中一切正常,但在开发服务器上我遇到了这个例外:

  

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

现在我认为ManagedDataAcess包含了我需要的一切。我错过了别的什么吗?还有其他东西干扰了包裹吗?我需要添加其他东西吗?

注意:我的Web.config

中没有def ss(line1,line2): count = 0 list1 = line1.split() list2 = line2.split() for word in list1: if word is not list2[count]: return count else: count += 1 ss("Why is this not working?", "Why is this not working?") 标记

代码:

<oracle.manageddataaccess.client>

修改

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

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

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

您的程序找不到tnsnames.ora(resp。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设置。

答案 2 :(得分:1)

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

在Web服务器上安装Oracle Data Provider for .NET时,根据您在安装期间选择的内容,它会将条目写入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.122.1.0的托管客户端库(版本12.2.1100 nuget包)构建我们的应用程序,它与4.121.2.0不匹配

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

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

并指定&#39; *&#39;对于此标记的版本号:

<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中指定它们。

答案 3 :(得分:0)

以我的情况来说很简单。
在Program.cs(Entrypoint类)中设置ORACLE_HOME环境变量
在app.config中没有任何更改或设置

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

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    ...