ODP.NET连接异常

本文关键字:异常 连接 NET ODP | 更新日期: 2023-09-27 18:19:37

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

知道吗?

ODP.NET连接异常

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

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

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

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

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

希望它能帮助其他人!

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

  1. 可以使用SqlPlus或SqlDeveloper连接到数据库吗本地
  2. 如果(1)的答案是真的,那么我会尝试修改_dbConnection.ConnectionString直接在代码中,直到我做对为止。如果您使用tnsnames.ora进行sqlplus连接,我将从中获取代码并将其放入连接字符串中并将该连接验证为健全性检查。我知道这不是你的最终目标,但你必须从某个地方开始
  3. 如果(1)的答案是false,那么在尝试通过ODP.Net进行连接之前,我会先处理好该连接

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