2015-12-15 2 views
1

У меня есть два отдельных проекта в рамках решения. Оба они требуют создания соединений с одной и той же базой данных. Однако по какой-то причине соединение открывается должным образом в одном проекте, но не в другом. Код очень похож, и строка соединения идентична. Эта проблема совершенно ошеломляет, и для жизни меня я не могу понять этого.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(). Первый преуспевает, а второй терпит неудачу.

Я не знаю точно, что искать, поэтому я действительно не знаю, что делать. Если кто-то может помочь, это будет очень признательно.

+0

Хорошо, вы подключаетесь по-разному. Второй проект показывает вызов некоторой функции, называемой SPFConnection(). Таким образом, ошибка возникает из этой функции. Я не знаком с этим, но вам, вероятно, не хватает информации о соответствующей конфигурации. – OldProgrammer

+0

@OldProgrammer SPFConnection просто возвращает имя строки подключения. (Отредактированный OP выше.) Спасибо за помощь. – painiyff

ответ

0

Мне удалось исправить эту проблему, изменив поставщика на управляемую версию.

<add name="Database.1" connectionString="Data Source=SPFLKD1;User ID=svc_acct;Password=hidden" providerName="Oracle.ManagedDataAccess.Client"/> 

На данный момент мне непонятно, почему этот метод работает. Вернее, почему неуправляемая версия этого не делает.

+0

Печально не вариант, если вам нужно подключиться к Oracle 11g в режиме FIPS. знак равно – jpmc26