【问题标题】:ODP.NET Connection exceptionODP.NET 连接异常
【发布时间】:2014-10-19 22:20:58
【问题描述】:

首先我想说我对Oracle数据库一点也不熟悉,所以我的话可能选得不好,我对某些概念的理解可能是错误的...... 无论如何,我正在尝试使用 ODP.NET 连接到 Oracle 11g 数据库,每次它都会给我这个异常:

System.TypeInitializationException occurred
HResult=-2146233036
Message=The type initializer for 'OracleInternal.Network.AddressResolution' threw an exception.
Source=Kiwi.ServiceBase
TypeName=OracleInternal.Network.AddressResolution
StackTrace:
    at OracleInternal.ConnectionPool.PoolManager`3.CreateNewPR(Int32 reqCount, Boolean bForPoolPopulation, ConnectionString csWithDiffOrNewPwd, String instanceName)

    at OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch)

    at OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch)

    at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword)

    at Oracle.ManagedDataAccess.Client.OracleConnection.Open()

    at Kiwi.DataAccess.OracleDataService.get_DbConnection() in c:\Projects\Kiwi-Beta7-0\Kiwiweb\src\Common\ApplicationServices\DataService\OracleDataService.cs:line 28

    InnerException: System.TypeInitializationException
        HResult=-2146233036
        Message=The type initializer for 'OracleInternal.Network.LDAP' threw an exception.
        Source=Oracle.ManagedDataAccess
        TypeName=OracleInternal.Network.LDAP
        StackTrace:
            at OracleInternal.Network.LDAP..ctor()
            at OracleInternal.Network.AddressResolution..cctor()
        InnerException: System.NullReferenceException
            HResult=-2147467261
            Message=Object reference not set to an instance of an object.
            Source=Oracle.ManagedDataAccess
            StackTrace:
                at OracleInternal.Network.LDAP._LDAP(Hashtable dsMap)
                at OracleInternal.Network.LDAP..cctor()
            InnerException:

调用自:

private System.Data.IDbConnection _dbConnection;
public override IDbConnection DbConnection
{
    get
    {
        if (_dbConnection.State == ConnectionState.Closed)
            _dbConnection.Open();        // Crash from HERE
        return _dbConnection;
    }
}

编辑 附加信息:我也在尝试在没有 tnsname.ora 文件的情况下进行连接。这是在数据库所在的同一台服务器上运行的 Windows 服务。

我尝试了以下连接字符串,第一个在调试中工作(并且是由应用程序构造的):

Data Source=demosyr20140329:1521/demosyr;User ID=SEI;password=manager;Pooling = False;

Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)       (HOST=DEMOSYR20140329)(PORT=1521))(CONNECT_DATA=(SID=DEMOSYR)));User Id=system;Password=manager;

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=DEMOSYR20140329)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=DEMOSYR)));

Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=DEMOSYR20140329)(PORT=1521))(CONNECT_DATA=(SID=DEMOSYR)));  User Id=system;Password=manager;

User Id=system;Password=manager;Data Source=oracle

Data Source=system/manager@//DEMOSYR20140329:1521/DEMOSYR;

有什么想法吗?

【问题讨论】:

  • 你能说明你在哪里实例化 _dbConnection 吗?它可能就像一个错误的连接字符串一样简单。 Oracle 的错误消息并不总是直观的。在没有 tnsnames 的情况下进行连接应该没问题(从长远来看可能会让您头疼)。您的 Oracle 客户端在 .NET 之外还能正常工作吗?
  • 显示构造字符串的代码会使我的帖子变得混乱,但我添加了我尝试过的连接字符串。我认为我的 Oracle 客户端很好,因为我可以使用 SQLDeveloper 查询我的数据库。如果您有更好的测试来检查我的 Oracle 是否安装良好,请告诉我,因为我对 Oracle 的东西真的很陌生。

标签: c# oracle odp.net


【解决方案1】:

这个人帮我解决了我的问题 https://pravsdatums.wordpress.com/2013/12/16/ocac-12c-and-visual-studio-developer-tools/#comment-1

解决方案是从 sql.ora 文件的 NAMES.DIRECTORY_PATH 中删除 LDAP。此文件位于您的客户端主目录中(此路径可以在注册表中 HLM/SOFTWARE/ORACLE 下的键之一上找到)。所以文件的内容来自

SQLNET.AUTHENTICATION_SERVICES= (none)

NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, EZCONNECT)

SQLNET.AUTHENTICATION_SERVICES= (none)

NAMES.DIRECTORY_PATH= (EZCONNECT, TNSNAMES)

现在它可以工作了!我不知道为什么它在我的开发机器上运行(可能是因为它没有安装 Oracle)。

希望它可以帮助别人!

【讨论】:

  • +1。我有同样的问题!我的路径是:"C:\oracle\instantclient_11_1\SQLNET.ORA"
  • @wetwillie 有没有办法将其存储在项目中,而不是存储在运行它的机器的注册表中?我试图将 Oracle 中涉及的所有内容都保留在我的项目中。我不想在我的应用程序部署到的机器上安装任何东西。
  • 看起来我可以在 app.config 的 <version> 块下添加一个 <settings> 块,并在其中包含 sql.ora 文件中的所有设置。
  • 我终于通过将它添加到我的 app.config <setting name="NAMES.DIRECTORY_PATH" value="(HOSTNAME)" /> 而不是 <setting name="NAMES.DIRECTORY_PATH" value="(LDAP, TNSNAMES, HOSTNAME)" /> 而让我的工作了
  • 我也不得不删除 LDAP。我仍然遇到问题,但重新启动 IIS 后,它开始工作。这些文件似乎已被缓存,因此如果仍有问题,请确保重新启动 IIS。
【解决方案2】:

除了如上所述修复 sqlnet.ora,还要检查您的 TNS_ADMIN 环境变量指向您的 Oracle 客户端的正确网络\管理路径。一旦这是正确的,重新启动,一切都会好起来的!

【讨论】:

    【解决方案3】:

    我的猜测是连接字符串是个问题。一些建议:

    1. 能否使用 SqlPlus 或 SqlDeveloper 连接到数据库 本地?
    2. 如果 (1) 的答案是正确的,那么我会尝试修改 _dbConnection.ConnectionString 直接在代码中,直到我做对了。如果您使用 tnsnames.ora 进行 sqlplus 连接,我 将从那里获取代码并将其放入连接字符串中 并验证连接作为健全性检查。我知道这不是你的最终目标,但你必须从某个地方开始。
    3. 如果 (1) 的答案为假,我会先努力建立正确的连接,然后再尝试通过 ODP.Net 进行连接。

    【讨论】:

    • 我可以从 sqlDeveloper 运行查询,所以我认为这部分很好。我尝试直接修改连接字符串,但每次更改都尝试抛出相同的异常,就好像它甚至没有尝试过一样。如果你愿意,我可以重试我的字符串并将它们复制到这里,有用吗?
    • 是的,这是个好主意。将它们添加到您的问题中。我怀疑你需要做一些实验,直到你做对了。
    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多