ORACLE - Valor não pode ser nulo. Nome do parâmetro: key

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
:no_entry: v4.122.1 Managed ODP.NET 12.2.0.1.0
:white_check_mark: v4.121.2 Managed ODP.NET 12.1.0.2.0