Oracle.DataAccess为什么Oracle.ManagedDataAccess不起作用?

Jef*_*eff 39 c# oracle tnsnames

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

我有一个数据库服务器tnsnames.ora,坐在我的C:\oracle\11g\network\admin目录中.如果我收拾这台服务器,我会得到所需的响应.如果我使用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,Oracle.DataAccess依赖于它运行的系统的体系结构.我看到有另一个库Oracle.ManagedDataAccess,它独立于架构.当我使用这个库时,它不再能够连接到服务器.一个ORA-12545: Network Transport: Unable to resolve connect hostname被抛出.

为什么会这样?这两个库之间有什么不同,因为基于我到目前为止所读到的内容,这应该不是问题.

额外的信息:

  • %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不能?

met*_*art 60

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

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

我相信您的示例使用Oracle.DataAccess而不是Oracle.ManagedDataAccess的原因是后者不支持基于Windows注册表的配置(请参阅文档) - ODP.NET安装设置ORACLE_HOME注册表项(HLKM\SOFTWARE\Oracle)\Key_NAME\ORACLE_HOME)仅由非托管部件识别.

  • 好吧,那肯定会清除空气.但是我的最新一期是"无法识别的配置部分oracle.manageddataaccess.client".看起来像"<configSections> <section name ="oracle.manageddataaccess.client"type ="OracleInternal.Common.ODPMSectionHandler,Oracle.ManagedDataAccess"/> </ configSections>"也是必需的. (2认同)
  • 很好的解释谢谢.在生产环境中,我刚刚添加了密钥HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET.Managed\4.121.2.0并添加了一个字符串值TNS_ADMIN,指向tnsnames.ora (2认同)

kol*_*sov 13

尝试将tnsnames.ora的路径添加到配置文件中:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <oracle.manageddataaccess.client>
    <version number="4.112.3.60">
      <settings>
        <setting name="TNS_ADMIN" value="C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN\" />
      </settings>
    </version>
  </oracle.manageddataaccess.client>
</configuration>
Run Code Online (Sandbox Code Playgroud)

  • 如果 TNS_ADMIN 具有正确的值,则版本号可能存在​​问题。尝试使用&lt;版本号=“*”&gt; (2认同)
  • 我正在这样做。如果能够以编程方式看到正在使用的 tnsnames 和 sqlnet,那就太好了;) 我正在使用几天前发布的生产版本 121.1.0。但无论如何还是谢谢你!:) (2认同)

use*_*302 5

为了避免所有Oracle不知道它在哪里寻找TNSNAMES.ORA的麻烦(我对多个Oracle版本和32/64位有更多的困惑),可以将设置从现有的TNSNAMES.ORA复制到自己的配置中文件并将其用于您的连接。
假设您对TNSNAMES.ORA中的“ DSDSDS”引用感到满意,该引用映射为以下内容:

DSDSDS = {DESCRIPTION = {ADDRESS_LIST = {ADDRESS = {PROTOCOL = TCP} {Host = DSDSDSHost} {Port = 4521}}} {CONNECT_DATA = {SERVICE_NAME = DSDSDSService}}})

您可以在第一个“ =”之后加上文本,然后在使用“ DSDSDS”的任何地方使用该文本,无需查找TNSNAMES.ORA即可知道如何进行连接。
现在,您的连接字符串将如下所示:
string connectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(Host=DSDSDSHost)(Port=4521)))(CONNECT_DATA=(SERVICE_NAME=DSDSDSService)));User Id=UNUNUN;Password=PWPWPW;";

  • 所有允许的属性均以分号分隔。数据源属性使它看起来像表弟它!Oracle 文档有完整的属性列表(包括连接超时,您可以在双引号内的最后一个分号后面添加):https://docs.oracle.com/cd/B13789_01/win.101/b10117/ features001.htm (2认同)