Comprobación de DBNull lanza una StrongTypingException
Pregunta
Estoy utilizando un conjunto de datos para extraer datos de una base de datos. Uno de los campos en una fila es NULL
. Yo se esto. Sin embargo, el siguiente código de vb.net lanza una StrongTypingException
(en el get_SomeField autogenerado (método) en el diseñador conjunto de datos):
If Not IsDBNull(aRow.SomeField) Then
'do something
End If
De acuerdo con la documentación y esta pregunta que debería estar bien.
editar: If aRow.SomeField is DBNull.Value Then
también devuelve el mismo error. Argh.
Solución
La diferencia es que en la cuestión conexa, se está hablando de un valor sin tipo (es decir object
) a través de un indexador. Cuando usted va a través de .SomeField
, el tipo ya está incluido - por lo que este podría ser int
etc, y que no tendría sentido tratar IsDBNull
en una int
, como int
puede no ser DBNull
En esencia, el SomeField
es un contenedor para (con perdón del C # acento ...)
public int SomeField {
get { return (int) this["someFieldName"]; }
set { this["someFieldName"] = value; }
}
No soy una persona enorme DataTable
, pero se puede intentar comprobar por su nombre / index / columna; o marcar la columna como así anulable que es Nullable<int>
(en el ejemplo anterior).
Otros consejos
Sólo un poco de información adicional: La excepción viene porque está utilizando un fuertemente DataSet . StrongTypingException documentación dice que:
La excepción que se produce por un conjunto de datos con establecimiento inflexible cuando el usuario accede a un valor DBNull.
El uso de conjuntos de datos con establecimiento inflexible es ligeramente diferente de la de los sin tipo. Con conjuntos de datos con establecimiento inflexible se obtiene de forma automática algunos métodos ampliada / adicionales para sus campos que se pueden llamar. En el caso de que le muy probable que tenga que llamar a:
If Not aRow.IsSomeFieldNull Then
'do something
End If
Prueba esto: aRow.IsSomeFieldNull
Hay una clara forma de ir a su alrededor. Pero hay que ser conscientes de las consecuencias.
Para evitar excepción de que ocurren puede cambiar en el conjunto de datos NullValue propiedad de campo que sea "nulo" o "vacío" (lo que se adapte a sus necesidades). Por defecto se establece en "excepción throw".
Para una mirada referencia aquí: MSDN la documentación
Buena suerte.
**DateTime? ToDate = (row.IsToDateNull()) ? null : row.IsToDate;**
Esta pregunta es viejo, pero lo que estoy añadiendo no parece estar en cualquiera de las otras respuestas.
Si utiliza
If Not IsDBNull(aRow.item("SomeField")) Then
'do something
End If
Esto no va a lanzar una excepción, incluso si usted está usando un conjunto de datos con establecimiento inflexible