2012-05-03 15 views
35

Estoy tratando de ejecutar un procedimiento almacenado y luego usar una instrucción if para verificar valores nulos y me estoy quedando corto. Soy un tipo de VB, por favor, por favor, si estoy cometiendo un error de sintaxis de colegial.DBNull if instrucción

objConn = new SqlConnection(strConnection); 
objConn.Open(); 
objCmd = new SqlCommand(strSQL, objConn); 
rsData = objCmd.ExecuteReader(); 
rsData.Read(); 

if (!(rsData["usr.ursrdaystime"].Equals(System.DBNull.Value))) 
     { 
      strLevel = rsData["usr.ursrdaystime"].ToString(); 

     } 

Sería esto me permite verificar que la conexión de SQL devuelve sólo un valor y si es así entonces poblar mi cuerda?

Estoy acostumbrado a ser capaz de simplemente marque la siguiente para ver si se devuelve un valor y no sabe lo estoy haciendo correctamente con C#

Si no IsDBNull (rsData ("usr.ursrdaystime"))

¡Cualquier ayuda sería apreciada!

+3

si usted está esperando una célula, consideran 'ExecuteScalar' –

+0

No ponga el lenguaje de programación en el título de tu pregunta - eso es lo que las etiquetas son para. –

+0

Disculpas: notaremos que para el futuro @DBM. – PipBoy

Respuesta

58

Esto debería funcionar.

if (rsData["usr.ursrdaystime"] != System.DBNull.Value)) 
{ 
    strLevel = rsData["usr.ursrdaystime"].ToString(); 
} 

También es necesario añadir using, como a continuación:

using (var objConn = new SqlConnection(strConnection)) 
    { 
     objConn.Open(); 
     using (var objCmd = new SqlCommand(strSQL, objConn)) 
     { 
      using (var rsData = objCmd.ExecuteReader()) 
      { 
       while (rsData.Read()) 
       { 
       if (rsData["usr.ursrdaystime"] != System.DBNull.Value) 
       { 
        strLevel = rsData["usr.ursrdaystime"].ToString(); 
       } 
       } 
      } 
     } 
    } 

esto va automaticamente dispose (cerrar) los recursos fuera del bloque {..}.

+0

¿La instrucción using reemplaza mis cadenas de conexión iniciales? Supongo que reemplazará la siguiente objConn = new SqlConnection (strConnection); objConn.Open(); ¿Seguiría utilizando las cadenas objCmd y rsdata? – PipBoy

+0

He editado el código: se ha agregado el uso correcto de las declaraciones (que cierran/eliminan) la conexión. Aún necesita ** abrir ** la conexión –

+0

Creo que en este caso, esto se adaptará mejor a mis necesidades, ¡gracias! – PipBoy

9

La forma idiomática es decir:

if(rsData["usr.ursrdaystime"] != DBNull.Value) { 
    strLevel = rsData["usr.ursrdaystime"].ToString(); 
} 

Este:

rsData = objCmd.ExecuteReader(); 
rsData.Read(); 

hace que parezca que estás leyendo exactamente un valor. Use IDbCommand.ExecuteScalar en su lugar.

2

Sí, solo un problema de sintaxis. Tal vez puedas probar:

if (reader["usr.ursrdaystime"] != DBNull.Value) 

.Equals() está comprobando para ver si two Object instances are the same.

+1

Eso lo llevará en condición si. Make '==' to '! =' –

+0

Sí, lo noté después de publicarlo. Ahora corregido. – mgnoonan

2

considerar:

if(rsData.Read()) { 
    int index = rsData.GetOrdinal("columnName"); // I expect, just "ursrdaystime" 
    if(rsData.IsDBNull(index)) { 
    // is a null 
    } else { 
    // access the value via any of the rsData.Get*(index) methods 
    } 
} else { 
    // no row returned 
} 

también: necesita más using; p

-1

En primer uso ExecuteScalar

objConn = new SqlConnection(strConnection); 
objConn.Open(); 
objCmd = new SqlCommand(strSQL, objConn); 
object result = cmd.ExecuteScalar(); 
if(result == null) 
    strLevel = ""; 
else 
    strLevel = result.ToString(); 
2

El equivalente más cercano a su VB sería (see this):

Convert.IsDBNull() 

Pero hay un número de maneras de hacer esto, y la mayoría están vinculados from here

0

utilizo a menudo String.IsNullOrEmpty . Le funcionará porque cuando DBNull se establece en .ToString, vuelve vacío.

if(!(String.IsNullorEmpty(rsData["usr.ursrdaystime"].toString())){ 
     strLevel = rsData["usr.ursrdaystime"].toString(); 
    }