[英]System.Runtime.InteropServices.ExternalException on calling Oracle.DataAccess.Client.OracleConnection.Open()
[英]Oracle.DataAccess.Client.OracleConnection.Open() throws NullReferenceException
我在解决方案中有两个单独的项目。 它们都需要创建到同一数据库的连接。 但是,由于某种原因,连接会在一个项目中正确打开,但在另一个项目中无法打开。 代码非常相似,并且连接字符串相同。 这个问题令人难以置信,对于我的一生,我无法弄清楚。
这一项工作...配置为:
<add name="Database.1" connectionString="Data Source=SPFLKD1;User ID=svc_acct;Password=hidden" providerName="Oracle.DataAccess.Client"/>
编码:
public UnitOfWork(String connectionName)
{
Verify.NotNullOrWhiteSpace(connectionName, "connectionName");
connection = CreateConnection(connectionName);
try
{
connection.Open(); // Successfully opens a connection
transaction = connection.BeginTransaction();
}
catch (Exception)
{
connection.Dispose();
throw;
}
}
private static IDbConnection CreateConnection(String connectionName)
{
var configuration = ConfigurationManager.ConnectionStrings[connectionName];
var providerFactory = DbProviderFactories.GetFactory(configuration == null ? String.Empty : configuration.ProviderName);
var connection = providerFactory.CreateConnection() ?? new OdbcConnection();
connection.ConnectionString = configuration == null ? String.Empty : configuration.ConnectionString;
return connection;
}
以上返回正确的Oracle连接。 现在下面的内容在单独的项目中不起作用。 它引用相同的连接字符串(来自不同的app.config文件)。
private static string SPFConnection(int id)
{
var systemId = id + 1;
return "SpfDatabase." + systemId;
}
private IDbConnection CreateConnection(String connectionName)
{
var configuration = ConfigurationManager.ConnectionStrings[connectionName];
var providerFactory = DbProviderFactories.GetFactory(configuration == null ? String.Empty : configuration.ProviderName);
var connection = providerFactory.CreateConnection() ?? new OdbcConnection();
connection.ConnectionString = configuration == null ? String.Empty : configuration.ConnectionString;
return connection;
}
public IList<string> GetUserRoles(string username, int facilityId)
{
var retVal = new List<string>();
var connection = CreateConnection(SPFConnection(facilityId));
try
{
connection.Open(); // Open method throws exception
... other code
catch (Exception e)
{
throw new Exception("Unable to get SPF User Roles for '" + username + "'", e);
}
}
异常是NullReferenceException
,并且堆栈跟踪是:
at Oracle.DataAccess.Client.OracleConnection.Open()
at TDNR.Data.SPF.SPFData.GetUserRoles(String username, Int32 facilityId) in c:\DefaultCollection\LLK - TDNR\TDNR-Support-Release 3.x\TDNR.Data\SPF\SPFData.cs:line 57
请注意,连接对象不为空。 而是,异常来自OracleConnection.Open()方法。
我意识到上面的代码本身可能不是错误的原因。 我已经完成调试,在调用connection.Open()
方法之前,所有东西(连接对象,配置和连接字符串)似乎都是完全相同的。 第一个成功,第二个失败。
我不确切知道要寻找什么,所以我真的不知道要张贴什么。 如果有人可以帮助,将不胜感激。
我设法通过将提供程序更改为托管版本来解决此问题。
<add name="Database.1" connectionString="Data Source=SPFLKD1;User ID=svc_acct;Password=hidden" providerName="Oracle.ManagedDataAccess.Client"/>
目前,我尚不清楚此方法为何有效。 或更确切地说,为什么非托管版本没有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.