Hallo Henry,
auch wenn ich dienstlich immer noch bei C# 7 stecke (weil wir .net Framework 4.x verwenden), hab ich das schon mal gesehen und kann Dir den Tipp geben.
using-Anweisung versus using-Deklaration
Das ist etwas, das mit C# 8 eingeführt wurde und was ich persönlich für einen grandiosen Missgriff halte. Man verwechselt es sehr leicht. So wie Du. C# führt eine Menge Bequemlichkeits-"Verbesserungen" ein, die man aber genau kennen muss, um darauf nicht reinzufallen.
Du hast die Deklaration verwendet, nicht die Anweisung. Die geschweiften Klammern hinter der Deklaration sind deshalb lediglich Dekoration, der Reader wird erst am Ende des try-Blocks verworfen.
Ich zeig's mal kürzer. Hinweis zu var: während JavaScript die var-Deklaration abschafft, führt C# sie ein. Man kann sie verwenden, wenn der Typ der Variablen aus dem Kontext klar ist (hier durch die Methodensignatur) und spart sich Tipparbeit.
try
{
using (var rdr = cmd.ExecuteReader()) // Anweisung!
{ // <-- Scope-Beginn von rdr
// tu was mit dem Reader
// Dispose erfolgt hier
} // <-- Scope-Ende von rdr
// der Reader ist weg, rdr gilt nicht mehr
// Neues Statement kann ausgeführt werden
cmd.CommandText = ...
cmd.ExecuteNonQuery();
}
catch () ...
try
{ // <-- Scope-Beginn von rdr
using var rdr = cmd.ExecuteReader(); // Deklaration!
{ // <-- Statement-Block ohne besondere Wirkung
// tu was mit dem Reader
}
// der Reader ist immer noch da
// eins der beiden folgenden Statements crasht
cmd.CommandText = ...
cmd.ExecuteNonQuery();
// Dispose erfolgt hier
} // <-- Scope-Ende von rdr
catch () ...
Du siehst den Unterschied in der Schreibweise? Der Unterschied in der WIRKUNG ist, dass die Deklaration den Reader disposed, wenn der Block endet, in dem sich die Deklaration befindet. Die Anweisung hingegen hat einen untergeordneten Block, an dessen Ende der Dispose erfolgt.
Rolf
sumpsi - posui - obstruxi