У меня есть два отдельных проекта в рамках решения. Оба они требуют создания соединений с одной и той же базой данных. Однако по какой-то причине соединение открывается должным образом в одном проекте, но не в другом. Код очень похож, и строка соединения идентична. Эта проблема совершенно ошеломляет, и для жизни меня я не могу понять этого.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()
. Первый преуспевает, а второй терпит неудачу.
Я не знаю точно, что искать, поэтому я действительно не знаю, что делать. Если кто-то может помочь, это будет очень признательно.
Хорошо, вы подключаетесь по-разному. Второй проект показывает вызов некоторой функции, называемой SPFConnection(). Таким образом, ошибка возникает из этой функции. Я не знаком с этим, но вам, вероятно, не хватает информации о соответствующей конфигурации. – OldProgrammer
@OldProgrammer SPFConnection просто возвращает имя строки подключения. (Отредактированный OP выше.) Спасибо за помощь. – painiyff