2011-08-09 25 views
6

Actualmente estoy trabajando en un proyecto C# que exportará datos MySQL. La exportación es para cualquier base de datos dentro del servidor, así que no voy a saber qué campos y tipos de datos están en la tabla y no voy a saber si un campo en la tabla permite valores nulos o no.MySQLDataReader recuperando el problema del valor nulo en C#

Durante las pruebas, he encontrado que la exportación funciona bien pero si el campo permite nulo cuando el lector de datos mysql llega a la fila que es nula, muestra un error SqlNullValueException, los datos son nulos.

He intentado hacer if (reader.getString(field) == null) {} pero sigue mostrando el error.

¿Cómo puedo hacer frente a los valores nulos en la base de datos?

Gracias por cualquier ayuda que pueda proporcionar.

Respuesta

17

necesita probar para nula explícitamente en un lector de este modo:

if (!reader.IsDbNull(field)) { 
    var value = reader.GetString(field); 
    // ... do stuff here ... 
} 
+0

gracias por su ayuda – Boardy

+0

En caso de no ser que '.IsDbNull (lector [ "campo"])'? ¿O estoy equivocado? – Hossein

+2

Depende de los métodos de implementación/ayuda del lector. Tendría razón en que la interfaz base IDataReader solo toma índices de columna enteros. MySqlDataReader, sin embargo, tiene sobrecargas para tomar un nombre de campo de cadena, que solo hace un lector. Búsqueda de GetOrdinal. – Nicholi

2

.Net no utiliza una base de datos nulos null literales a distinguir. Solo puedo especular, pero sospecho que la razón para esto es que muchos tipos comunes de columna de base de datos (int, float, etc.) son tipos de valores, y comparar un tipo de valor con null no funcionará en absoluto como esperabas.

En su lugar, verifique DBNull.Value o utilice la función .IsDbNull().

1

He tenido problemas con el uso del método GetString() en los campos que permiten valores nulos. He trabajado en torno a este haciendo algo como:

reader[0].ToString()

3

En este blog Mensaje No es un buen método de extensión para el lector

SQL Data Reader - handling Null column values

lo cambié a la IDataReader interfaz

public static string GetStringSafe(this IDataReader reader, int colIndex) 
    { 
     return GetStringSafe(reader, colIndex, string.Empty); 
    } 

    public static string GetStringSafe(this IDataReader reader, int colIndex, string defaultValue) 
    { 
     if (!reader.IsDBNull(colIndex)) 
      return reader.GetString(colIndex); 
     else 
      return defaultValue; 
    } 

    public static string GetStringSafe(this IDataReader reader, string indexName) 
    { 
     return GetStringSafe(reader, reader.GetOrdinal(indexName)); 
    } 

    public static string GetStringSafe(this IDataReader reader, string indexName, string defaultValue) 
    { 
     return GetStringSafe(reader, reader.GetOrdinal(indexName), defaultValue); 
    } 
+1

tienes razón, es mucho mejor una extensión que hace lo mismo todo código – MrAlex6204

1

Siempre se puede usar el operador condicional C# '?' así ...

string val = (reader.IsDBNull(columnIndex)) ? "" : reader.GetString(columnIndex); 
Cuestiones relacionadas