C# ODP.NET连接异常

C# ODP.NET连接异常,c#,oracle,odp.net,C#,Oracle,Odp.net,首先,我想说的是,我对Oracle数据库一点也不熟悉,所以我的词汇可能选得不好,我对某些概念的理解可能是错误的。。。 无论如何,我正在尝试使用ODP.NET连接到Oracle 11g数据库,每次它都会出现以下异常: System.TypeInitializationException occurred HResult=-2146233036 Message=The type initializer for 'OracleInternal.Network.AddressResolution' th

首先,我想说的是,我对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服务

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


有什么想法吗

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

  • 您可以使用SqlPlus或SqlDeveloper连接到数据库吗 本地的
  • 如果(1)的答案为真,那么我会尝试修改 _dbConnection.ConnectionString直接在代码中执行,直到我正确执行为止。如果您使用tnsnames.ora进行sqlplus连接,我 将从那里获取代码并将其放入连接字符串中 并验证连接是否正常。我知道这不是你的最终目标,但你必须从某个地方开始
  • 如果(1)的答案是错误的,那么在尝试通过ODP.Net进行连接之前,我将首先努力获得正确的连接

  • 这家伙帮我解决了问题

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

    SQLNET.AUTHENTICATION_SERVICES= (none)
    
    NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, EZCONNECT)
    

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


    希望它能帮助别人

    除了如上所述修复sqlnet.ora外,还要检查TNS_ADMIN环境变量是否指向Oracle客户端的正确network\ADMIN路径。一旦这是正确的,重新启动,一切都应该很好

    你能告诉我你在哪里实例化了dbConnection吗?它可能像坏连接字符串一样简单。Oracle的错误消息并不总是直观的。没有tnsnames的连接应该没有问题(从长远来看,这可能会帮你省去头疼)。您的Oracle客户端在.NET之外运行良好?显示构造字符串的代码会使我的文章变得混乱,但我添加了我尝试过的连接字符串。我认为我的Oracle客户端很好,因为我可以使用SQLDeveloper查询我的数据库。如果您有更好的测试来检查我的Oracle是否安装良好,请告诉我,因为我对Oracle的东西非常陌生。我可以从sqlDeveloper运行查询,所以我认为这部分很好。我试图直接修改连接字符串,但每次更改都会抛出相同的异常,就好像它根本没有尝试过一样。如果您愿意,我可以重试我的字符串并复制到这里,这会有用吗?是的,这是个好主意。将它们添加到您的问题中。我想你需要做一点实验,直到你做对为止。我也有同样的问题!我的路径是:
    “C:\oracle\instantclient\u 11\u 1\SQLNET.ORA”
    @wetwillie是否有办法将其存储在项目中,而不是运行它的机器的注册表中?我试图将Oracle涉及的所有内容都保留在我的项目中。我不想在部署应用程序的计算机上安装任何东西。看起来我可以在app.config中的
    块下添加
    块,并包括那里的sql.ora文件中的所有设置。通过将其添加到我的app.config
    ,而不是我也必须删除的
    ,我终于可以正常工作了LDAP。我仍然有问题,但重新启动IIS后,它开始工作。这些文件似乎已缓存,因此,如果仍然存在问题,请确保重新启动IIS。
    SQLNET.AUTHENTICATION_SERVICES= (none)
    
    NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, EZCONNECT)
    
    SQLNET.AUTHENTICATION_SERVICES= (none)
    
    NAMES.DIRECTORY_PATH= (EZCONNECT, TNSNAMES)