2016-04-26 15 views
0

Wenn ich diesen Code leite:Wie behandelt man die Nullzeigerausnahme in vC# mit MySQL DataReader?

count = mdr.GetInt32("total"); 

mdr ist ein Ziel von MySQL Datareader

Um den Wert des Gesamtfeldes von meinem Tisch zu bekommen, wenn es NULL die Anwendung zurückgibt stoppt mit einer Null-Zeiger-Ausnahme .

Gibt es eine Möglichkeit, diese Ausnahme zu fangen?

+3

Sie die Ausnahme nicht fangen, Sie vermeiden Sie es zu provozieren, z 'if (! mdr.IsDBNull (" total ")) {...}'. –

Antwort

0

Da anscheinend "null" ein gültiger (oder halbgültiger) Wert für das Feld "count" ist, könnten Sie die Anzahl von int in die Nullable int? ändern.

Alternativ könnten Sie umgeben nur das Gespräch mit einem try {} catch {} -Block, wie so:

try 
{ 
    count = mdr.GetInt32("total"); 
} 
catch(Exception ex) 
{ 
    //Any logic you would like to run if "total" is null. 
} 
+0

Tun Sie das nicht. Je. Try-Catch-Blöcke sind nicht zur Validierung gedacht. Wenn Sie so etwas tun, kann Ihr Programm stark nachlaufen. Wie der obige Kommentar, fangen Sie die Ausnahme nicht ein, Sie vermeiden es zu provozieren. @ Jon Skeet hat die richtige Antwort. Kann jemand bitte abstimmen, ich habe keinen Vertreter. – JSON

+0

@JSON Nun, wenn Null tatsächlich nicht als gültiger Wert betrachtet wird (daher sollte int int bleiben und nicht der nullable int?), Sollte dies A) selten sein und B) eine tatsächliche Ausnahme sein. Wenn es ungültig und üblich ist, impliziert dies ein ziemlich wichtiges Problem, das außerhalb des Codes angesprochen werden muss. Wenn Sie weiterhin einen if -> assign ausführen, wenn der DB-Wert null ist, bleibt der Standardwert von 0 für die Eigenschaft "total", was fehlerhaft ist. –

+0

Bitte lesen Sie http://www.dotnetfunda.com/articles/show/2611/never-use-try-catch-for-in-put-validation – JSON

0

Ja, können Sie eine Ausnahme mit try .. catch Block fangen (siehe Nex Terren Antwort).

Eine andere Möglichkeit ist bedingte Scheck als Jon Skeet im Kommentar auf die Frage erwähnt verwenden: Schließlich

if (!mdr.IsDBNull("total")) { ... } 

, können Sie ?: operator verwenden:

count = mdr.IsDbNull("total") == null ? 0 : mdr.GetInt32("total"); 
Verwandte Themen