尝试在 C# 中连接到 Oracle DB 时出现问题

Posted

技术标签:

【中文标题】尝试在 C# 中连接到 Oracle DB 时出现问题【英文标题】:Issue when trying to connect to Oracle DB in C# 【发布时间】:2019-04-05 18:02:47 【问题描述】:

我正在尝试使用以下方法连接到 Oracle DB:

OracleConnection con = new OracleConnection();
con.ConnectionString = "User ID=ID;Password=PASSWORD;Data Source=SOURCE";
con.Open();
write("connected to oracle " + con.ServerVersion);

但是每次我运行程序我都会得到错误:

[2018-11-01 09:29:19.705] System.BadImageFormatException: 不能 加载文件或程序集 'Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=PUBLIC_KEY' 或其之一 依赖关系。试图加载一个不正确的程序 格式。文件名:'Oracle.DataAccess,版本=2.112.1.0, 文化=中性,PublicKeyToken=PUBLIC_KEY' 在 adrentech_previous_day.Program.processFile() 在 adrentech_previous_day.Program.Main() 在 目录\程序:行 25

=== 预绑定状态信息 === LOG: DisplayName = Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=PUBLIC_KEY(完全指定)日志:Appbase = 文件:///目录 日志:初始 PrivatePath = NULL 调用程序集: adrentech_previous_day,版本=1.0.0.0,文化=中性, PublicKeyToken=null。 === LOG:此绑定在默认加载上下文中开始。 LOG:使用应用程序配置文件: 目录\program.vshost.exe.Config LOG:使用主机配置文件: LOG:使用机器配置 文件来自 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config。 LOG:后策略参考:Oracle.DataAccess,Version=2.112.1.0, 文化=中性,PublicKeyToken=PUBLIC_KEY 日志:正在尝试 下载新网址 文件:///DIRECTORY/Oracle.DataAccess.DLL。 ERR:无法完成程序集的设置(hr = 0x8007000b)。探测 终止。

有什么建议吗?

【问题讨论】:

1) 您可以使用Oracle Managed client,它没有外部依赖项并且不是 X86/64 特定的。 2) 确保将 IDisposable 对象(例如 OracleConnection)包装在 using 语句中。 我安装了 Oracle 托管客户端并将 OracleConnection 包装在 using 语句中,但我仍然收到相同的错误。 您确定删除了对非托管客户端的引用吗? 好的,是的,我刚刚这样做了,现在我收到一个新错误:Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-12154: TNS:could not resolve the connect identifier specified --- > OracleInternal.Network.NetworkException (0x00002F7A): ORA-12154: TNS: 无法解析指定的连接标识符 很好,这意味着你走得更远了。我建议你使用这样的连接字符串:SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MyOracleSID))); uid=myUsername;pwd=myPassword; 【参考方案1】:

您的编译目标很可能是 .NET Framework 4.0(或更高版本),但您安装了 ODP.NET 2.x 版 - 它们不能一起工作。

一种解决方案是使用 ODP.NET 托管驱动程序 - 您已经这样做了。不过也有另一种解决方法,见The provider is not compatible with the version of Oracle client

现在是关于ORA-12154: TNS:could not resolve the connect identifier specified的第二个问题

ODP.NET 托管驱动程序使用与非托管驱动程序不同的方法来查找 sqlnet.oratnsnames.ora(以及 ldap.ora,如果使用)文件,请参阅 Determining location of relevant tnsnames.ora file

非托管驱动程序搜索文件夹 %ORACLE_HOME%\network\admin 并读取注册表项 HKLM\SOFTWARE\ORACLE\KEY_OraClient11g_home1\TNS_ADMIN,而 ODP.NET 托管驱动程序则不会。

ODP.NET 托管驱动程序从您的 .NET 配置文件中检索tnsnames.ora 的位置,即machine.config。您可以手动修改文件(请参阅Oracle Data Provider for .NET, Managed Driver Configuration)或使用如下批处理脚本(选择与您相关的 x64 或 x86 行并根据您的机器更改文件夹名称)

set Oracle_x64=c:\oracle\product\11.2\Client_x64\odp.net
set Oracle_x86=c:\oracle\product\11.2\Client_x86\odp.net

OraProvCfg_x64=%Oracle_x64%\bin\4\OraProvCfg.exe
OraProvCfg_x86=%Oracle_x86%\bin\4\OraProvCfg.exe

set TNS_ADMIN=C:\oracle\network\admin

"%OraProvCfg_x64%" /action:config /product:odpm /frameworkversion:v4.0.30319 /providerpath:%Oracle_x64%\managed\common\Oracle.ManagedDataAccess.dll /set:settings\TNS_ADMIN:%TNS_ADMIN%
"%OraProvCfg_x86%" /action:config /product:odpm /frameworkversion:v4.0.30319 /providerpath:%Oracle_x86%\managed\common\Oracle.ManagedDataAccess.dll /set:settings\TNS_ADMIN:%TNS_ADMIN%

或者将TNS_ADMIN 设置为环境变量,在任何情况下都可以使用。

【讨论】:

【参考方案2】:

我在 TNS_ADMIN 计算机变量中使用文件 tnsnames.ora 和 sqlnet.ora 设置了目录的路径,它无需重新启动即可为我工作。

【讨论】:

以上是关于尝试在 C# 中连接到 Oracle DB 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 SSIS 包中连接到 DB2 时出现错误 58031?

为啥在 C# .Net Core 3 中连接到 MySql 时出现错误

在 NodeJS 中连接到 websocket 时出现协议错误

在 gitlab CI 中连接到 kubernetes 集群时出现禁止错误

Sqoop - 尝试连接到 Oracle DB 服务器时出现 java.lang.NullPointerException

无法在 Visual Studio 2019 C# 中连接到 Oracle 数据库