2009-11-21 8 views
7

Tengo el siguiente código que parece explotar si la columna en el datarow (dr) es nula. ¿Cuál es la forma correcta de analizar el valor de la fila de datos y manejar las comprobaciones nulas?cuál es la forma correcta de leer desde un datarow si la celda puede ser nula

Person person = new Person() 
{ 
    FirstName = dr["FirstName"].ToString(), 
    LastName = dr["LastName"].ToString(), 
    BusinessPhoneNumber = dr["BusinessPhone"].ToString(), 

Respuesta

6

Si la columna es de tipo cadena, pero es anulable, ¿qué hay de tratar:

// FirstName must allow null 
FirstName = dr["FirstName"] as string 

o

// FirstName would be empty for a NULL in the database 
FirstName = (dr["FirstName"] as string) ?? string.Empty 
+0

Las cadenas son "anulables" por defecto, ya que son tipos de referencia. –

+1

Estaba hablando de la columna y no del tipo de cadena. –

1

Pase la columna, y un valor predeterminado a una función auxiliar que comprueba nulo y devuelve el valor predeterminado si nulo, o el valor de columna si no nulo.

2

dr["FirstName"].ToString() de vez en cuando lanzar excepciones de puntero nulo, ya que está tratando de acceder ToString en un objeto nulo Aparte de eso, las cadenas pueden ser nulos, así que realmente, si usted sabe que es una cadena, y no te importa que es nula, sería seguro hacerlo

FirstName = (String) dr["FirstName"] 
+1

Eso está mal, las excepciones de puntero nulo no ocurrirán aquí. Si el contenido de la columna es nulo, se devuelve un objeto 'System.DBNull', y' .ToString() 'devuelve una cadena vacía, mientras que' (cadena) 'o' como cadena' devuelve 'null'. –

1

Se puede utilizar el siguiente para volver una cadena en blanco si la columna es nula.

FirstName = string.format("{0}", dr["FirstName"]) 
3

Creo que la nula celda de datos anulada no puede ser el motivo de su problema. Tal vez la columna no exista o se haya producido cualquier otro error, o DataRow en sí mismo sea nulo y usted debería manejar eso. Mire la excepción: "parece explotar" no es una descripción válida de su problema.

Lo siguiente explica eso, pero también responderá la pregunta del título para todos los demás.

Si el valor de la columna es nulo, un objeto System.DBNull se devuelve, y .ToString() devuelve una cadena vacía, mientras que (string) o as string retorno null.

Por lo tanto, no tiene sentido comprobar el artículo devuelto para ==null porque eso nunca se evaluará a true.

  • Si acepta cadenas vacías como resultado, su código ya es óptimo, no es necesario manejar el caso DBNull.
  • Si quiere obtener null, cambie .ToString() a as string.
  • Si desea manejarlo de otra manera, use if (dr.IsNull("FirstName")) o haga ==null en la variable de destino después del as string.
Cuestiones relacionadas