gpt4 book ai didi

c# - 为什么 Oracle.DataAccess 工作时 Oracle.ManagedDataAccess 不工作?

转载 作者:IT王子 更新时间:2023-10-29 04:00:57 25 4
gpt4 key购买 nike

我正在开发一个非常简单的应用程序,我打算用它来解决我在几台机器上遇到的问题,但在我还没走到那一步之前,我遇到了一些问题,包括 cpu 架构差异和 Oracle 数据库库。

我在 tnsnames.ora 中列出了一个数据库服务器,位于我的 C:\oracle\11g\network\admin 目录中。如果我 tnsping 这台服务器,我会得到所需的响应。如果我使用以下代码使用 Oracle.DataAccess.Client 编写我的 C# 程序以连接到此服务器,它就可以工作。

string connectionString = "Data Source=DSDSDS;User Id=UNUNUN;Password=PWPWPW;";
DataTable dataTable = new DataTable();

using (var connection = new OracleConnection(connectionString)) {
connection.Open();
using (var command = new OracleCommand()) {
command.Connection = connection;
command.CommandText = sql;
command.CommandType = CommandType.Text;
using (var oda = new OracleDataAdapter(command)) {
oda.Fill(dataTable);
}
}
}

但是 Oracle.DataAccess 依赖于它运行的系统架构。我看到还有另一个与体系结构无关的库 Oracle.ManagedDataAccess。当我使用这个库时,它不再能够连接到服务器。抛出 ORA-12545:网络传输:无法解析连接主机名

为什么会这样?这两个库之间有什么不同,因为根据我迄今为止阅读的内容,这应该不是问题。

额外信息:

  • %ORACLE_HOME% 和 %TNS_ADMIN% 未定义(记住 tnsping 和 Oracle.DataAccess 工作)
  • PATH 定义了 C:\oracle\11g\BIN
  • 我的机器只有一个tnsnames.ora文件

如果我将 tnsnames.ora 移动到与我的 .exe 文件相同的位置,它就可以工作。为什么Oracle.DataAccess可以在C:\oracle\11g\network\admin目录下找到tnsnames.ora,而Oracle.ManagedAccess却找不到?

最佳答案

在 ODP.NET 中解析 TNS 名称的优先顺序,托管驱动程序是这样的(参见 here):

  1. .NET 配置文件中“dataSources”部分中的数据源别名。
  2. tnsnames.ora 文件中的数据源别名位于 .NET 配置文件中“TNS_ADMIN”指定的位置。
  3. tnsnames.ora 文件中的数据源别名与 .exe 位于同一目录中。
  4. tnsnames.ora 文件中的数据源别名位于 %TNS_ADMIN%(其中 %TNS_ADMIN% 是环境变量设置)。
  5. tnsnames.ora 文件中的数据源别名位于 %ORACLE_HOME%\network\admin(其中 %ORACLE_HOME% 是环境变量设置)。

我相信您的示例适用于 Oracle.DataAccess 但不适用于 Oracle.ManagedDataAccess 的原因是后者不支持基于 Windows 注册表的配置(请参阅 documentation)- ODP.NET 安装设置了 ORACLE_HOME 注册表项( HLKM\SOFTWARE\Oracle\Key_NAME\ORACLE_HOME),它只能被非托管部分识别。

关于c# - 为什么 Oracle.DataAccess 工作时 Oracle.ManagedDataAccess 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17456024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com