2009-01-08 11 views
7

Cuando recupero cualquier valor de Scalar de la base de datos, suelo escribir código como este para campos con nulos.¿Cómo puedo verificar DBNull mientras ejecuto mi comando solo una vez?

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

Pero no me gusta porque ejecuta la sentencia ExecuteScalar dos veces. Es un viaje extra al servidor para mi sitio web y a favor del rendimiento. No quiero hacer esto.

¿Hay alguna manera en que pueda deshacerme de este ExecuteScalar extra()?

+0

La elección obvia es utilizar dos líneas. ¿Hay alguna razón por la que lo escribiste de esta manera? Si es solo para mantenerlo en una línea, creo que eso es tomar la concisión en un grado extremo. – BobbyShaftoe

Respuesta

17

escribe usted mismo un método de extensión para el comando SQL.

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; 
} 

uso se convierte en:

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

configuración T: struct no permite el uso de cadenas. Eliminé la herencia. –

+0

Para cualquiera que intente usar esta solución para vb uno de los cambios importantes es 'result == DBNull.Value' cambia a' result es DBNull.Value'. Si intentas usar el operador '=', lanzará un error. –

12

sólo tiene que utilizar una variable para almacenar en caché el resultado:

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

Prefiero esto más que "var." Creo que el uso de "var" es, como esperaba, un abuso. Aunque, me doy cuenta de que algunas personas, Jon Skeet por ejemplo, creen que es más legible, lo que no entiendo. – BobbyShaftoe

+2

¿De verdad? ¿Le importa qué tipo "o" está en ese código? Está siendo descartado en la siguiente línea. Como lector del código, el uso de "objeto" frente a "var" es solo ruido para mí. –

Cuestiones relacionadas