Přejít na hlavní obsah

"Neplatný pokus o volání isdbnull, když je čtečka zavřená"

Při vývoji softwaru v programovacím jazyce C# často dochází k chybám, které brání správnému fungování aplikace. Jednou z takových chyb je "Invalid attempt to call isdbnull when reader is closed". K této chybě může dojít při použití objektu sqldatareader, který je navržen pro čtení dat z databáze. V tomto článku se podíváme na důvody a způsoby, jak se této chybě vyhnout.

K chybě "Invalid attempt to call isdbnull when reader is closed" dochází, když se po uzavření objektu sqldatareader pokusíme vyvolat metodu isdbnull. Metoda isdbnull se používá ke kontrole, zda aktuální pozice objektu sqldatareader obsahuje hodnotu DBNull. K chybě dochází, pokud se tuto metodu pokusíme vyvolat po uzavření objektu sqldatareader.

Příčiny chyby:

1. Pokus o vyvolání metody isdbnull, když je objekt sqldatareader již uzavřen.

2. Nesprávné použití objektu sqldatareader: je třeba se ujistit, že objekt sqldatareader je otevřen před vyvoláním metody isdbnull a uzavřen poté, co byla získána všechna potřebná data.

Abyste se vyhnuli chybě "Invalid attempt to call isdbnull when reader is closed", musíte při práci s objektem sqldatareader dodržovat určitá doporučení. Je důležité vždy zkontrolovat stav objektu sqldatareader před vyvoláním metody isdbnull a ujistit se o správném pořadí otevření a zavření daného objektu. K tomu lze použít bloky try-catch-finally a příkaz using.

Jak obejít chybu "Invalid attempt to call isdbnull when reader is closed"

K chybě "Invalid attempt to call isdbnull when reader is closed" dochází, když se pokusíte získat hodnotu z databáze pomocí sqldatareader po uzavření objektu sqldatareader. K této chybě obvykle dochází, když se pokusíte získat hodnotu z uzavřeného objektu sqldatareader.

Abyste se této chybě vyhnuli, musíte se ujistit, že objekt sqldatareader je před získáním hodnot z něj stále otevřený. K tomu lze použít vlastnost IsClosed:

if (!reader.IsClosed)

Pokud vlastnost IsClosed vrátí hodnotu false, znamená to, že objekt sqldatareader je stále otevřený a lze z něj bezpečně získávat hodnoty. Pokud vlastnost IsClosed vrátí hodnotu true, znamená to, že objekt sqldatareader je uzavřen a pokus o získání hodnot z něj způsobí chybu "Invalid attempt to call isdbnull when reader is closed".

Také stojí za to se ujistit, že objekt sqldatareader zavřete pouze po zpracování všech hodnot. Například:

while (reader.Read())reader.Close();

Dodržováním těchto jednoduchých pravidel se můžete vyhnout chybě "Invalid attempt to call isdbnull when reader is closed" při práci s objektem sqldatareader.

Pochopit příčinu chyby

K chybě "Invalid attempt to call isdbnull when reader is closed" dochází v situaci, kdy k pokusu o vyvolání metody isDBNull objektu DataReader dojde po jeho uzavření. Taková situace může nastat, pokud byl po přečtení dat pomocí Datareaderu proveden hovor metodou Close nebo Dispose .

Při volání metody isDBNull je ověřena hodnota aktuálního sloupce na rovnost DBNull.Value . Pokud je DataReader již uzavřen, vede to k vyloučení "invalidního attempt to call isDBNull when reader is closed".

Měli byste zkontrolovat bod, kde dochází k volání metody isDBNull, a ujistit se, že DataReader zůstává otevřený v době volání této metody. Pokud má být DataReader po přečtení dat skutečně uzavřen, je nutné před uzavřením Datareaderu přenést volání metody isDBNull nebo zajistit jinou logiku zpracování.

SqlDataReader reader = cmd.ExecuteReader();while (reader.Read())>reader.Close();

Zkontrolujte stav objektu Reader

Jednou z nejčastějších chyb souvisejících s prací s objektem Reader je pokus o vyvolání metody IsDBNull,, když už je objekt uzavřen. Abyste se této chybě vyhnuli, musíte vždy zkontrolovat stav objektu Reader před vyvoláním metody IsDBNull.

Pokud je stav objektu Reader roven DataReader.Closed, to znamená, že je již zavřeno a nelze volat metody IsDBNull nebo jiné metody související s přístupem k datům. V takovém případě je nutné objekt Reader předem otevřít a provést všechny potřebné operace s daty.

Příklad kontroly stavu objektu Reader:

V tomto příkladu ověřujeme, že objekt Reader není null a jeho stav se nerovná DataReader.Closed. Pokud jsou tyto podmínky splněny, můžeme bezpečně zavolat metodu IsDBNull, abychom zkontrolovali hodnotu v uvedeném sloupci.

Tímto přístupem se vyhnete chybě "Invalid attempt to call IsDBNull when reader is closed" a zajistíte správnou práci s daty v zařízení Reader.

Použijte podmínky k zamezení chyby

Chybám "Invalid attempt to call isdbnull when reader is closed" se lze vyhnout použitím podmínek ke kontrole stavu objektu DataReader před vyvoláním metody IsDBNull(). Zde je několik příkladů, jak to udělat:

  • Zkontrolujte, zda je DataReader otevřený:
  • if (reader != null && !reader.IsClosed)
    • Zkontrolujte, zda má DataReader následující řádek:
    • if (reader.HasRows)
      • Zkontrolujte, zda hodnota NULL:
      • if (!reader.IsDBNull(index))

      Pomocí těchto podmínek se můžete vyhnout volání metody IsDBNull(), pokud je DataReader zavřený nebo bez řádků, a zabránit tak vzniku chyby "Invalid attempt to call isdbnull when reader is closed".