2011-08-09 9 views
6

Aktualnie pracuję nad projektem C#, który wyeksportuje dane MySQL. Eksport dotyczy dowolnej bazy danych na serwerze, więc nie będę wiedział, jakie pola i typy danych znajdują się w tabeli i nie będę wiedział, czy pole w tabeli dopuszcza wartości puste, czy nie.MySQLDataReader odzyskuje problem z wartością pustki w C#

Podczas testów odkryłem, że eksport działa poprawnie, ale jeśli pole zezwala na wartość null, gdy czytnik danych mysql przechodzi do wiersza, który jest pusty, wyświetla błąd SqlNullValueException, dane są puste.

Próbowałem robić if (reader.getString(field) == null) {} ale nadal wyświetla błąd.

jaki sposób poradzić sobie z wartości null w bazie danych.

Dziękujemy za pomoc.

Odpowiedz

17

Trzeba przetestować dla wartości null wyraźnie w czytniku tak:

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

dzięki za pomoc – Boardy

+0

Jeżeli nie byłoby '.IsDbNull (czytnik [ "pola"])'? Czy ja się mylę? – Hossein

+2

Zależy od metod implementacji czytnika/pomocnika. Masz rację, że bazowy interfejs IDataReader przyjmuje tylko indeksy kolumn całkowitych. MySqlDataReader jednak ma przeciążenia, aby wziąć nazwę pola ciąg, który po prostu robi odczyt.GetOrdinal wyszukiwania. – Nicholi

2

.NET nie używa null dosłownych do odróżniają null bazy danych. Mogę tylko spekulować, ale podejrzewam, że powodem tego jest to, że wiele typowych typów kolumn bazy danych (int, float itp.) To typy wartości, a porównywanie wartości do wartości null nie będzie działało w żaden sposób.

Zamiast sprawdzać DBNull.Value lub użyć funkcji .IsDbNull().

1

Mam problemy z używaniem metody GetString() w polach, które dopuszczają wartości puste. I obejść to robiąc coś takiego:

reader[0].ToString()

3

W tym poście na blogu nie jest dobra metoda rozszerzenie dla czytelnika

SQL Data Reader - handling Null column values

Zmieniłem go do IDataReader interfejsu

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

masz rację, jest o wiele lepszym rozszerzeniem, zamiast robić to samo co cały kod – MrAlex6204

1

Można zawsze użyć C# warunkowy operatora „?” jak tak ...

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