2010-01-13 13 views
7

tengo la siguiente línea de códigoCómo puede DBNull no es igual DBNull

if (DBNull.Value.Equals(o) || o != null) 

donde o es object o in row.ItemArray Me aparece un error de ->

Xml type "List of xdt:untypedAtomic" does not support a conversion from Clr type "DBNull" to Clr type "String".

Lo que no hago Entiendo es que cuando paso por mi código, este if debería captar esto y realizar mi acción alternativa, pero no es así?

Por favor alguien puede arrojar algo de luz para mí.

Gracias!

+0

¿Puedes publicar un código más? ¿Dónde se asigna o? – hackerhasid

+1

¿Cuál es el resultado de 'Console.WriteLine (o.GetType(). Name);'? – jason

+2

Creo que es un poco extraño primero se compara con DBNull y luego con no nulo – tga

Respuesta

1

puede ser tal comparación ayuda

if (!o.GetType().Equals(DBNull.Value))

o

if (o is DBNull)

6

Creo que problema es que, de hecho,

DBNull.Value == null 
//is always false 

El DBNull es una clase especial para las comparaciones de los valores obtenidos del dB por lo usted realmente necesita verificar una condición nula Y un DBNull.value si su matriz contiene ambos.

EDIT: Lo sentimos al mirar más de cerca su código, es posible que necesite invertir su operación OR. Si o == null su primera declaración explotará con su excepción. Proveedores:

if (o != null || o == DBNull.Value) 
+1

no si o == null ... –

+0

esta edición es incorrecta, con lo que hace una prueba exactamente opuesta de lo que se entiende. Como @ThomasLevesque correctamente indica, necesita ser 'if (o == null || o == DBNull.Value)' en su lugar. Pero la primera declaración tampoco debería ser un problema, pero ese estilo conduce al problema de muchos errores de codificación donde arrojará excepciones cuando el objeto sea nulo. por lo que es * muy * bueno comprobar siempre nulo o no nulo * primero *, antes de hacer cualquier otra cosa con el valor. –

+1

los errores que explotan el código es cuando intentas algo como 'if (o.ToString()) {...}' porque entonces cuando o es nulo, cualquier * properties * o método funciona como '.ToString() 'arrojará un error. así que siempre es una buena práctica asegurarse de probar nulo o no nulo primero. Sin embargo 'if (DBNull.Value.Equals (o) || o! = Null)' no está accediendo a ninguna propiedad de o. Y si el método maneja un valor nulo correctamente, entonces no hay ningún error cuando o es nulo. Pero MUCHOS programadores se olvidan de probar nulo, por lo que pasar nulo a MUCHOS métodos frecuentemente causa muchos problemas porque, sinceramente, muchos códigos son descuidados. –

Cuestiones relacionadas