Rufen Sie IsDBNull()
im Reader auf, um die Spalte zu überprüfen, bevor Sie versuchen, sie zu konvertieren:
Oder vergleichen Sie mit DBNull.Value
:
Das Problem ist, dass Sie versuchen, int mit einer Null zu setzen, nicht im Lesen. Sie können dies tun, um einen alternativen Wert festzulegen, wenn der Wert, den Sie eingeben möchten, null ist:
%Vor%Eine andere Alternative ist, dass Sie nullable Ganzzahlen verwenden können, indem Sie topID wie folgt initialisieren:
%Vor%aber dies erfordert immer noch, woanders auf Null zu prüfen, zusammen mit einigen anderen Dingen, die zu behandeln sind, deshalb würde ich empfehlen, das doppelte Fragezeichen auf Ihrem Wertsatz zu verwenden, wie ich zuerst gezeigt habe.
Sie müssen überprüfen, ob der Wert DBNull ist, bevor Sie versuchen, ihn abzurufen. Außerdem empfehle ich die Verwendung von GetInt32()
über Convert.ToInt32()
, da angegeben wurde, dass sich die interne Optimierung von GetInt32()
ändern kann, wo sie schneller ist als die Verwendung von Convert.ToInt32()
. Ich habe das schon vor langer Zeit gelernt und habe keinen Referenzartikel, den du dir ansehen kannst. Zu der Zeit, als ich erfuhr, dass GetInt32()
intern Convert.ToInt32()
Ich möchte DataTable
anstelle von DataReader
verwenden. Ich hasse repetitive Boilerplate, also fügte ich der Klasse DataRow
einige Erweiterungsmethoden hinzu, um die Downcast-Logik einzukapseln und für einen besser lesbaren Code zu sorgen:
Hier der Code für den Downcasting eines Spaltenwertes von einem DataRow
zu einem int
/ int?
:
Ich halte es für ziemlich einfach, ähnliche Erweiterungsmethoden von einem DataReader zu entfernen.
Hier ist der Code, in dem wir jede ID aus der MS Access-Datenbank beim Laden der Seite eines Registrierungsformulars automatisch generieren
%Vor%Verwenden Sie eine generische Erweiterungsmethode für Ihren Reader (siehe auch SO Frage )
%Vor%Implementieren Sie diese Erweiterungsmethode für Ihre Leserklasse (MySql, Sql, Oracle, etc.)
%Vor%Tags und Links c# error-handling null