2012-01-13 16 views
9

¿Por qué el siguiente código:¿Cómo verifico correctamente DBNull en VB?

A = not IsDBNull(CurRow("BuyBook")) AndAlso CType(CurRow("BuyBook"), string) = "Yes" 

resultados en el siguiente error:

Conversion from type 'DBNull' to type 'String' is not valid. 

Cuando AndAlso se supone que es de corto circuito de acuerdo con este artículo:

http://support.microsoft.com/kb/817250

+0

Puede probar esto 'A = (no IsDBNull (CurRow (" BuyBook "))) Y también CType (CurRow (" BuyBook "), cadena) =" Sí "' –

+0

depurar el código para ver los datos dentro de las celdas . – Boomer

+0

Incluso lo he dividido en dos declaraciones y lo he intentado. Creo que IsDBNull está roto. – merlin2011

Respuesta

9

Estás en lo correcto. AndAlso está en cortocircuito.

Sin embargo, el error viene por llamandoCurRow("GuyBook") (verificar esto en un depurador para asegurarse de que no soy un mentiroso o hacer algunas suposiciones locos o simplemente misremembering * ;-). Antes de solicitar un valor, debe consultar el DataRow if it has a value. Es decir, use:

CurRow.IsNull("BuyBook") 

Happy coding.


* Una debe ser sólo capaz de comparar con DBNull.Value o utilizar IsDBNull. Sin embargo, estoy bastante seguro de que encontré una fila antes de que lanzara estas excepciones en lugar de devolver un objeto DBNull. Comience descubriendo - en la Ventana Inmediata del Depurador - exactamente expresión que arroja la excepción.

0

En lugar de no IsDBNull (CurRow ("BuyBook")), el uso de NOT (CurRow ("BuyBook")) es System.Dbnull.Value. Prueba esto:

A = (NOT (CurRow("BuyBook")) is System.Dbnull.Value) AndAlso CType(CurRow("BuyBook"), string) = "Yes" 

O

A = not string.IsNullOrEmpty(CurRow("BuyBook")) AndAlso CType(CurRow("BuyBook"), string) = "Yes" 
+0

Supongo que te perdiste esto 'Incluso lo he dividido en dos instrucciones y he intentado'. –

4

has necesitado comparación de la siguiente manera:

If CurRow("BuyBook") Is DBNull.Value Then 
    '... 
End If 
+0

Sí, recibo una excepción que dice que no se puede comparar un tipo Object y DBNull. – merlin2011

+0

Se actualizó para cambiar la comparación realizada para que coincida con la forma en que se hace en algunos de nuestros códigos. – Pondidum

-1

En vb.net por lo general hago algo como esto:

A = (CurRow("BuyBook") & "" = "Yes") 

viejo truco de la época de VB6. Si CurRow("BuyBook") es nulo, vb.net lo considerará como una cadena vacía al concatenarlo con otra cadena.

+0

¿Esto no depende de que Option Strict esté apagado? Preferiría simplemente usar el método ToString directamente 'CurRow (" BuyBook "). ToString =" Sí "' si usa esta solución. – jmoreno

0
If dt.Rows(0)("BuyBook") = DBNull.Value Then 
End If 

Espero que ayude.