Ten kod jest częścią aplikacji, która odczytuje i zapisuje w bazie danych połączonej z ODBC. Tworzy rekord w bazie danych, a następnie sprawdza, czy rekord został pomyślnie utworzony, a następnie zwraca true.
Moje rozumienie przepływu kontroli jest następujące:
command.ExecuteNonQuery()jest udokumentowane, aby InvalidOperationExceptionzgłosić, gdy „wywołanie metody jest nieprawidłowe dla bieżącego stanu obiektu”. Dlatego, gdyby tak się stało, wykonanie trybloku zatrzymałoby się, finallyblok zostałby wykonany, a następnie zostałby wykonany return false;na dole.
Jednak moje IDE twierdzi, że return false;kod jest nieosiągalny. I wydaje się, że to prawda, mogę go usunąć i kompiluje bez żadnych skarg. Jednak dla mnie wygląda na to, że nie byłoby wartości zwracanej dla ścieżki kodu, w której jest zgłaszany wspomniany wyjątek.
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;
}
Jaki jest mój błąd zrozumienia?
Disposewyraźnie, ale umieść using:using (var command = ...) {command.CommandText = sb.ToString(); return command.ExecuteNonQuery(); }
finallyBlok oznacza coś innego niż myślisz.