ExecuteScalar возвращает ноль или DBNull (сервер разработки или производства) - PullRequest
10 голосов
/ 28 октября 2011

Я пытаюсь добавить столбец к существующему DataRow в C #. После этого столбец будет заполнен одним значением из моей базы данных.

DataRow dr уже существует, и столбец "COLNAME" также существует.
comTBP это мой SqlCommand.

dr["COLNAME"] = Convert.ToInt32(comTBP.ExecuteScalar());

Это все работает нормально, если в моей базе данных есть значение, и ExecuteScalar () может получить это значение. Если я тестирую этот код на своем сервере разработки (локальном), он также работает, если ExecuteScalar () возвращает null или DBNull и значение моего нового столбца равно 0. Но проблема возникает, если я разверну свой код на производственном сервере. Если я делаю все то же самое, с той же базой данных он генерирует исключение с сообщением, что он не может конвертировать DBNull в Int32.
У меня вопрос: почему эта ошибка появляется на рабочем сервере, а не на моем локальном сервере разработки?

Ответы [ 3 ]

18 голосов
/ 28 октября 2011

ExecuteScalar возвращает DBNull для нулевого значения из query и null для отсутствия результата. Возможно, на вашем сервере разработки это никогда не происходило (null результат из query).

8 голосов
/ 28 октября 2011

Очевидно, что в производственном процессе вы получили либо NULL, возвращенное после выполнения команды, либо что-то другое в строке подключения или что-то еще;Как правило, вы всегда должны проверять DBNull перед приведением / преобразованием непосредственно в другой тип результата ExecuteScalar.

Проверьте ответ Рейна здесь (и проголосуйте за него) для его хорошего предложенного решения:

Невозможно привести объект типа 'System.DBNull' к типу 'System.String`

2 голосов
/ 25 сентября 2014

Используйте функцию ISNULL () в вашем SQL.

ISNULL (выражение_экспозиции, значение_замены)

есть ...

ВЫБРАТЬ ISNULL (СУММА (Цена), 0) ОТ заказа

...