Тут є багато відповідей з корисною інформацією (і деякою неправильною інформацією), яку я хотів би зібрати.
Коротка відповідь на питання - це перевірити наявність DBNull - майже всі згодні з цим бітком :)
Замість того, щоб використовувати хелперний метод для читання змінних значень для кожного типу даних SQL, загальний метод дозволяє нам вирішувати це з набагато меншим кодом. Однак у вас не може бути єдиного загального методу як для типів зведених значень, так і для еталонних типів, це обговорюється в
Nullable типу як можливий загальний параметр? і загальне обмеження типу C # для всього зведеного нанівець .
Отже, випливаючи з відповідей @ZXX та @getpsyched, ми закінчуємо це двома методами отримання нульових значень, і я додав 3-й для ненульових значень (він доповнює набір на основі методу іменування).
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);
}
Зазвичай я використовую назви стовпців, змінюю їх, якщо ви використовуєте індекси стовпців. На основі цих назв методів я можу сказати, чи очікую я, що дані будуть нульовими чи ні, що дуже корисно при перегляді коду, написаного давно.
Поради;
- Якщо в базі даних немає змінних стовпців, це дозволяє уникнути цього питання. Якщо у вас є контроль над базою даних, то стовпці повинні бути ненульовими за замовчуванням і лише нульовими, коли це необхідно.
- Не кидайте значення бази даних за допомогою оператора C # 'як', тому що, якщо команда неправильна, вона мовчки поверне нуль.
- Використання виразу значення за замовчуванням змінить нулі бази даних на ненульові значення для типів значень, таких як int, datetime, bit тощо.
Нарешті, під час тестування вищезазначених методів у всіх типах даних SQL Server, які я виявив, ви не можете безпосередньо отримати char [] від SqlDataReader, якщо ви хочете char [], вам доведеться отримати рядок і використовувати ToCharArray ().
int colIndex = reader.GetOrdinal(fieldname);
і легко перевантажити функцію @ marc_sSafeGetString
.