Я использую SQLdatareader для создания POCO из базы данных. Код работает за исключением случаев, когда он встречает нулевое значение в базе данных. Например, если столбец FirstName в базе данных содержит нулевое значение, возникает исключение.
employee.FirstName = sqlreader.GetString(indexFirstName);
Каков наилучший способ обработки нулевых значений в этой ситуации?
c#
sqldatareader
DenaliHardtail
источник
источник
int colIndex = reader.GetOrdinal(fieldname);
и легко перегрузитьSafeGetString
функцию @ marc_s .Вы должны использовать
as
оператор в сочетании с??
оператором для значений по умолчанию. Типы значений должны быть прочитаны как обнуляемые и заданы по умолчанию.as
Оператор обрабатывает отливку , включая проверки на DBNull.источник
sqlreader[indexAge] as string ?? ""
, вы всегда получите""
. Подумайте, действительно ли вы хотите(int?)sqlreader[indexAge] ?? defaultValue
вместо этого, поэтому, если ваш SQL изменяется, вы получаете исключения вместо неправильных значений. @ Stevo3000: по умолчанию (int) 0, а не -1. @ Крис: Убедитесь, что вы используете тот, который вы действительно хотите.Для строки вы можете просто привести версию объекта (доступ осуществляется с помощью оператора массива) и получить пустую строку для нулей:
или
Для целых чисел, если вы приводите к обнуляемому int, вы можете использовать GetValueOrDefault ()
или нуль-сливающийся оператор (
??
).источник
null
но вместо этого объект DBNull. Разница между этими двумя операторами заключается в том, что первый из них потерпит неудачу, если он не является строкой, тогда как второй просто вернет ноль, если это не строка.IsDbNull(int)
обычно намного медленнее, чем использование таких методов, какGetSqlDateTime
и сравнение сDBNull.Value
. Попробуйте эти методы расширения дляSqlDataReader
.Используйте их так:
источник
Один из способов сделать это - проверить наличие нулей в БД:
источник
reader.IsDbNull(ColumnIndex)
работает так много ответов говорит.И я хочу упомянуть, если вы работаете с именами столбцов, просто сравнение типов может быть более удобным.
источник
Я не думаю, что есть значение столбца NULL , когда строки возвращаются в хранилище данных, используя имя столбца.
Если вы сделаете
datareader["columnName"].ToString();
это, вы всегда получите значение, которое может быть пустой строкой (String.Empty
если вам нужно сравнить).Я бы использовал следующее и не стал бы сильно беспокоиться:
источник
Это решение менее зависит от производителя и работает с SQL, OleDB и MySQL Reader:
источник
Я склоняюсь к тому, чтобы заменить пустые значения в операторе SELECT чем-то подходящим.
Здесь я заменяю каждый ноль пустой строкой. Ваш код не будет выдавать ошибку в этом случае.
источник
Вы можете написать универсальную функцию для проверки Null и включить значение по умолчанию, когда оно равно NULL. Звоните при чтении Datareader
При чтении Datareader используйте
источник
Проверьте,
sqlreader.IsDBNull(indexFirstName)
прежде чем пытаться прочитать.источник
Воздействуя от ответа getpsyched - х , я создал общий метод , который проверяет значение столбца по его имени
Использование:
источник
как насчет создания вспомогательных методов
Для строки
использование
Для Int
использование
Для даты
использование
Примечание: для DateTime объявите переменную как
источник
В дополнение к ответу от marc_s вы можете использовать более общий метод расширения для получения значений из SqlDataReader:
источник
Я думаю, что вы хотели бы использовать:
источник
Мы используем серию статических методов, чтобы извлечь все значения из наших считывателей данных. Так что в этом случае мы будем звонить
DBUtils.GetString(sqlreader(indexFirstName))
. Преимущество создания статических / разделяемых методов заключается в том, что вам не нужно делать одни и те же проверки снова и снова и снова ...Статический метод (ы) будет содержать код для проверки на нулевые значения (см. Другие ответы на этой странице).
источник
Вы можете использовать условный оператор:
источник
Здесь есть много ответов с полезной информацией (и некоторой неправильной информацией), я хотел бы собрать все это вместе.
Короткий ответ на вопрос - проверить DBNull - с этим согласны почти все :)
Вместо использования вспомогательного метода для чтения значений NULL для каждого типа данных SQL универсальный метод позволяет нам решить эту проблему с помощью гораздо меньшего количества кода. Однако у вас не может быть единого универсального метода для типов значений Nullable и ссылочных типов, это подробно обсуждается в типе Nullable как возможный универсальный параметр? и C # ограничение общего типа для всего обнуляемого .
Итак, исходя из ответов @ZXX и @getpsyched, мы в итоге получаем 2 метода для получения значений, допускающих значение NULL, и я добавил 3-й для ненулевых значений (он завершает набор на основе именования методов).
Я обычно использую имена столбцов, меняйте их, если вы используете индексы столбцов. Основываясь на названиях этих методов, я могу сказать, ожидаю ли я, что данные будут обнуляемыми или нет, что весьма полезно при просмотре кода, написанного давно.
Подсказки;
Наконец, во время тестирования вышеуказанных методов для всех типов данных SQL Server, которые я обнаружил, вы не можете напрямую получить char [] из SqlDataReader, если вам нужен char [], вам нужно будет получить строку и использовать ToCharArray ().
источник
Я использую приведенный ниже код для обработки пустых ячеек на листе Excel, который считывается в таблицу данных.
источник
источник
и / или использовать троичный оператор с присваиванием:
замените значение по умолчанию (при нулевом значении) соответствующим образом для каждого типа свойства ...
источник
Этот метод зависит от indexFirstName, который должен быть порядковым номером столбца, начинающимся с нуля.
Если вы не знаете индекс столбца, но не хотите проверять имя, вы можете использовать этот метод расширения:
И используйте метод так:
источник
Старый вопрос, но, возможно, кому-то еще нужен ответ
на самом деле я работал над этим вопросом так
Для int:
то же самое для строки просто вернуть "" вместо 0, так как "" является пустой строкой
так что вы можете использовать его как
и
очень гибкий, поэтому вы можете вставить любой запрос, чтобы прочитать любой столбец, и он никогда не вернется с ошибкой
источник
Вот вспомогательный класс, который могут использовать другие, если им нужно, основываясь на ответе @marc_s:
источник
Конвертировать ручки DbNull разумно.
источник
Вы также можете проверить это
источник
SqlDataReader