2009-01-08 3 views
7

Wenn ich einen Scalar-Wert aus der Datenbank abrufe, schreibe ich normalerweise einen solchen Code für nullbare Felder.Wie kann ich während der Ausführung meines Befehls nur einmal nach DBNull suchen?

cmd.ExecuteScalar() == DBNull.Value ? 0 : (int)cmd.ExecuteScalar() 

Aber ich mag es nicht, weil es die doppelte ExecuteScalar Anweisung ausführt. Es ist eine zusätzliche Reise zum Server für meine Website und zugunsten der Leistung möchte ich das nicht tun.

Gibt es eine Möglichkeit, wie ich diese extra ExecuteScalar() loswerden kann?

+0

Die offensichtliche Wahl ist zwei Linien zu verwenden. Gibt es einen Grund, warum du es so geschrieben hast? Wenn es nur darum geht, es auf einer Linie zu halten, denke ich, dass das knapp wird. – BobbyShaftoe

Antwort

17

Schreiben Sie sich eine Erweiterungsmethode für den SQL-Befehl.

public static T ExecuteNullableScalar<T>(this SqlCommand cmd) 
    where T : struct 
{ 
    var result = cmd.ExecuteScalar(); 
    if (result == DBNull.Value) return default(T); 
    return (T)result; 
} 

Verbrauch wird:

int value = cmd.ExecuteNullableScalar<int>(); 
+0

Einrichten T: Struktur erlaubt es nicht, Zeichenfolgen zu verwenden. Ich habe die Erbschaft entfernt. –

+0

Für jeden, der versucht, diese Lösung für VB zu verwenden, ist eine der wichtigen Änderungen 'Ergebnis == DBNull.Value' ändert sich zu' Ergebnis ist DBNull.Value'. Wenn Sie versuchen, den Operator '=' zu verwenden, wird ein Fehler ausgegeben. –

12

Verwenden Sie einfach eine Variable das Ergebnis cachen:

var o = cmd.ExecuteScalar(); 
return o == DBNull.Value ? 0 : (int)o; 
4
object o = cmd.ExecuteScalar(); 
return (o== DBNull.Value) ? 0 : (int)o; 
+0

Ich bevorzuge das über "var." Ich denke, die Verwendung von "var" wird, wie ich erwartet habe, missbraucht. Obwohl mir klar ist, dass einige Leute, Jon Skeet zum Beispiel, glauben, dass es lesbarer ist, was ich nicht verstehe. – BobbyShaftoe

+2

Wirklich? Sie interessieren sich, welcher Typ "o" in diesem Code ist? Es wird in der nächsten Zeile verworfen. Als Leser des Codes ist die Verwendung von "Objekt" vs "var" nur ein Geräusch für mich. –

Verwandte Themen