Burada yararlı bilgiler (ve bazı yanlış bilgiler) yayılmış bir sürü cevap var, hepsini bir araya getirmek istiyorum.
Sorunun kısa cevabı DBNull'u kontrol etmektir - neredeyse herkes bu bit üzerinde hemfikirdir :)
SQL veri türü başına null değerlerin okunması için bir yardımcı yöntem kullanmak yerine, genel bir yöntem bunu çok daha az kodla ele almamızı sağlar. Ancak, hem null değer türleri hem de başvuru türleri için tek bir genel yönteme sahip olamazsınız, bu Nullable türünde olası bir genel parametre olarak ayrıntılı olarak tartışılıyor
mu? ve boş bırakılabilir her şey için C # genel tür kısıtı .
Bu nedenle, @ZXX ve @getpsyched'in cevaplarından sonra, null değerleri elde etmek için 2 yöntemle sonuçlandırdık ve null olmayan değerler için bir 3. ekledim (yöntemi adlandırma temelinde seti tamamlar).
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);
}
Ben genellikle sütun isimleri, sütun dizinleri kullanıyorsanız bunları değiştirmek. Bu yöntem adlarına dayanarak, verilerin uzun süre önce yazılan koda bakarken null değer olup olmadığını beklediğimi söyleyebilirim.
İpuçları;
- Veritabanında null olabilecek sütunların olmaması bu sorunu önler. Veritabanı üzerinde denetiminiz varsa, sütunlar varsayılan olarak boş olmamalı ve yalnızca gerektiğinde boş bırakılmalıdır.
- C # 'as' operatörü ile veritabanı değerlerini yayınlamayın çünkü döküm yanlışsa sessizce null değerini döndürür.
- Bir kullanarak varsayılan değer ifade int gibi değer türleri için boş olmayan değerlere veritabanı boş değerlere değişecek, tarih saat, bit vs.
Son olarak, yukarıdaki yöntemleri keşfettiğim tüm SQL Server veri türlerinde test ederken, bir SqlDataReader'dan doğrudan bir char [] alamazsınız, eğer bir char [] istiyorsanız bir dize almanız ve ToCharArray () kullanmanız gerekir.
int colIndex = reader.GetOrdinal(fieldname);
ve @ marc_sSafeGetString
işlevini kolayca aşırı yükleyebilirsiniz .