【发布时间】: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 的东西真的很陌生。