Jest tu wiele odpowiedzi z użytecznymi informacjami (i kilkoma błędnymi informacjami), chciałbym zebrać je wszystkie razem.
Krótka odpowiedź na pytanie to sprawdzenie DBNull - prawie wszyscy zgadzają się w tej kwestii :)
Zamiast używać metody pomocniczej do odczytywania wartości zerowych dla każdego typu danych SQL, ogólna metoda pozwala nam rozwiązać ten problem przy znacznie mniejszym kodzie. Jednak nie możesz mieć jednej ogólnej metody zarówno dla wartości dopuszczających wartości zerowe, jak i typów referencyjnych. Jest to omówione szczegółowo w typie dopuszczającym wartości zerowe
jako możliwy parametr ogólny? i ogólne ograniczenie typu C # dla wszystkiego, co ma wartość null .
Tak więc, podążając za odpowiedziami z @ZXX i @getpsyched, otrzymujemy 2 metody uzyskiwania wartości zerowych, a ja dodałem 3 dla wartości innych niż null (uzupełnia zestaw na podstawie nazewnictwa metod).
public static T? GetNullableValueType<T>(this SqlDataReader sqlDataReader, string columnName) where T : struct
{
int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
return sqlDataReader.IsDBNull(columnOrdinal) ? (T?)null : sqlDataReader.GetFieldValue<T>(columnOrdinal);
}
public static T GetNullableReferenceType<T>(this SqlDataReader sqlDataReader, string columnName) where T : class
{
int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
return sqlDataReader.IsDBNull(columnOrdinal) ? null : sqlDataReader.GetFieldValue<T>(columnOrdinal);
}
public static T GetNonNullValue<T>(this SqlDataReader sqlDataReader, string columnName)
{
int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
return sqlDataReader.GetFieldValue<T>(columnOrdinal);
}
Zwykle używam nazw kolumn, zmieniam je, jeśli używasz indeksów kolumn. Na podstawie tych nazw metod mogę stwierdzić, czy oczekuję, że dane będą zerowalne, czy nie, co jest całkiem przydatne, gdy patrzę na kod napisany dawno temu.
Porady;
- Brak zerowalnych kolumn w bazie danych pozwala uniknąć tego problemu. Jeśli masz kontrolę nad bazą danych, kolumny powinny domyślnie mieć wartość inną niż null, a w razie potrzeby nulla.
- Nie rzutuj wartości bazy danych za pomocą operatora C # jako, ponieważ jeśli rzutowanie jest nieprawidłowe, po cichu zwróci wartość null.
- Użycie domyślnego wyrażenia wartości zmieni wartości zerowe bazy danych na wartości inne niż null dla typów wartości takich jak int, datetime, bit itp.
Wreszcie, podczas testowania powyższych metod we wszystkich typach danych SQL Server odkryłem, że nie możesz bezpośrednio uzyskać char [] z SqlDataReader, jeśli chcesz char [], musisz uzyskać ciąg znaków i użyć ToCharArray ().
int colIndex = reader.GetOrdinal(fieldname);
i łatwo przeciążyć funkcję @ marc_sSafeGetString
.