Dieser Code ist Teil einer Anwendung, die aus einer mit ODBC verbundenen Datenbank liest und in diese schreibt. Es erstellt einen Datensatz in der Datenbank und prüft dann, ob ein Datensatz erfolgreich erstellt wurde, und kehrt dann zurück true
.
Mein Verständnis des Kontrollflusses ist wie folgt:
command.ExecuteNonQuery()
Es wird dokumentiert, dass ein InvalidOperationException
"ein Methodenaufruf für den aktuellen Status des Objekts ungültig ist" ausgelöst wird. Wenn dies passieren würde, würde die Ausführung des try
Blocks anhalten, der finally
Block würde ausgeführt und dann return false;
die unten ausgeführt.
Meine IDE behauptet jedoch, dass der return false;
Code nicht erreichbar ist. Und es scheint wahr zu sein, ich kann es entfernen und es kompiliert ohne Beschwerden. Für mich sieht es jedoch so aus, als gäbe es keinen Rückgabewert für den Codepfad, in dem die erwähnte Ausnahme ausgelöst wird.
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;
}
Was ist mein Verständnisfehler hier?
Dispose
explizit anrufen , sondern setzen using
:using (var command = ...) {command.CommandText = sb.ToString(); return command.ExecuteNonQuery(); }
finally
Block bedeutet etwas anderes als Sie denken.