Problema
Quando a conexão utilizada na Consulta ou Formulário está usando o conector ODP.NET, Managed Driver (Oracle.ManagedDataAccess.Client), ocorre o seguinte erro ao tentar abrir a conexão:
Valor não pode ser nulo.
Nome do parâmetro: key
No registro de eventos do sistema, as seguintes informações são exibidas:
LATROMI.Common.Exceptions.DbConnectionException: Valor não pode ser nulo.
Nome do parâmetro: key ---> System.ArgumentNullException: Valor não pode ser nulo.
Nome do parâmetro: key
em System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
em System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
em OracleInternal.Common.SyncDictionary`2.ContainsKey(K k)
em OracleInternal.ConnectionPool.PoolManager`3.CreateServiceCtx(PR pr)
em OracleInternal.ConnectionPool.PoolManager`3.PutNewPR(PR pr, Boolean bForPoolPopulation)
em OracleInternal.ConnectionPool.PoolManager`3.CreateNewPR(Int32 reqCount, Boolean bForPoolPopulation, ConnectionString csWithDiffOrNewPwd, CriteriaCtx criteriaCtx, String instanceName, List`1 switchFailedInstNames)
em OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, CriteriaCtx criteriaCtx, String affinityInstanceName, Boolean bForceMatch)
em OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, Boolean bGetForApp, CriteriaCtx criteriaCtx, String affinityInstanceName, Boolean bForceMatch)
em OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword, CriteriaCtx criteriaCtx)
em Oracle.ManagedDataAccess.Client.OracleConnection.Open()
em LATROMI.Common.DAL.DataProvider.CreateConnection()
--- Fim do rastreamento de pilha de exceções internas ---
em LATROMI.Common.DAL.DataProvider.CreateConnection()
em LATROMI.Common.DAL.DataProvider.CreateCommand(String sqlCommand, Int32 commandTimeout)
em LATROMI.Common.DAL.DataProvider.ExecuteReader(String sqlCommand, CommandBehavior commandBehaviors)
em LATROMI.Web.UI.ObjectDataSourceManager.GetTypedDataSourceFromDB(ConnectionContext userConnection, String sql)
em LATROMI.Web.UI.Controls.GridDataSourceFacade.GetTypedDataSourceInternal(Boolean ignoreMemoryDatasource, Type& dtoType)
[LATROMI.Common.Exceptions.DbConnectionException]
Message: Valor não pode ser nulo.
Nome do parâmetro: key
Source: LATROMI.Common.DAL
ProviderName: Oracle.ManagedDataAccess.Client
ConnectionString: Data Source = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = ***.***.***.***)(PORT = ****))(CONNECT_DATA = (SERVICE_NAME = ****)));User Id = *********;Password=*********;Pooling=False;
[System.ArgumentNullException]
Message: Valor não pode ser nulo.
Nome do parâmetro: key
Source: mscorlib
Causa
Este erro é causado por um erro no conector ODP. NET da ORACLE, mais especificamente na versão 4.122.1 (a mais recente no momento que em que escrevo este artigo).
Há relatos na internet de que o erro passa a ocorrer quando o ArchiveLog do banco fica sem espaço:
No ambiente onde descobrimos este erro, o conector estava funcionando perfeitamente, e de repente passou a apresentar o erro. No entanto, o ArchiveLog do banco foi verificado e não estava com falta de espaço. Todos os alertas registrados no banco foram excluídos e ainda assim o erro continuava a ocorrer.
Solução
Tentamos reinstalar o conector, mas o problema persistiu. Conseguimos solucionar o erro fazendo um Downgrade da versão 4.122.1 para a versão 4.121.2.
Clique aqui para abrir a página de downloads ODP.NET da Oracle.
ODP.NET | ODAC XCopy | |
---|---|---|
v4.122.1 | Managed ODP.NET 12.2.0.1.0 | |
v4.121.2 | Managed ODP.NET 12.1.0.2.0 |