This code is part of an application that reads from and writes to an ODBC connected database. It creates a record in the database and then checks if a record has been successfully created, then returning true
.
My understanding of control flow is as follows:
command.ExecuteNonQuery()
is documented to throw an InvalidOperationException
when "a method call is invalid for the object's current state". Therefore, if that would happen, execution of the try
block would stop, the finally
block would be executed, then would execute the return false;
at the bottom.
However, my IDE claims that the return false;
is unreachable code. And it seems to be true, I can remove it and it compiles without any complaints. However, for me it looks as if there would be no return value for the code path where the mentioned exception is thrown.
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;
}
What is my error of understanding here?
Dispose
explicitly, but putusing
:using (var command = ...) {command.CommandText = sb.ToString(); return command.ExecuteNonQuery(); }
finally
block means something else than you think.