簡體   English   中英

Oracle.DataAccess.Client.OracleConnection.Open()引發NullReferenceException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM