Este código é parte de um aplicativo que lê e grava em um banco de dados ODBC conectado. Ele cria um registro no banco de dados e, em seguida, verifica se um registro foi criado com sucesso e retorna true
.
Meu entendimento do fluxo de controle é o seguinte:
command.ExecuteNonQuery()
está documentado para lançar um InvalidOperationException
quando "uma chamada de método é inválida para o estado atual do objeto". Portanto, se isso acontecer, a execução do try
bloco será interrompida, o finally
bloco será executado e, a seguir, será executado return false;
na parte inferior.
No entanto, meu IDE afirma que o return false;
código é inacessível. E parece ser verdade, posso removê-lo e compilá-lo sem reclamações. No entanto, para mim, parece que não haveria valor de retorno para o caminho do código onde a exceção mencionada é lançada.
private static bool createRecord(String table,
IDictionary<String,String> data,
System.Data.IDbConnection conn,
OdbcTransaction trans) {
[... some other code ...]
int returnValue = 0;
try {
command.CommandText = sb.ToString();
returnValue = command.ExecuteNonQuery();
return returnValue == 1;
} finally {
command.Dispose();
}
return false;
}
Qual é o meu erro de compreensão aqui?
Dispose
explicitamente, mas coloque using
:using (var command = ...) {command.CommandText = sb.ToString(); return command.ExecuteNonQuery(); }
finally
bloqueio significa outra coisa do que você pensa.