![](/img/trans.png)
[英]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.