ExecuteScalar вернет
- ноль, если нет набора результатов
- в противном случае первый столбец первой строки набора результатов, который может быть DBNull.
Если вы знаете, что первый столбец результирующего набора является строкой, то для охвата всех баз необходимо проверить как нулевой, так и DBNull. Что-то вроде:
object accountNumber = ...ExecuteScalar(...);
return (accountNumber == null) ? String.Empty : accountNumber.ToString();
Приведенный выше код основан на том факте, что DBNull.ToString возвращает пустую строку.
Если accountNumber был другого типа (скажем, целое число), то вам нужно быть более явным:
object accountNumber = ...ExecuteScalar(...);
return (accountNumber == null || Convert.IsDBNull(accountNumber) ?
(int) accountNumber : 0;
Если вы точно знаете, что в вашем наборе результатов всегда будет хотя бы одна строка (например, SELECT COUNT (*) ...), то вы можете пропустить проверку на нулевое значение.
В вашем случае сообщение об ошибке «Невозможно привести объект типа« System.DBNull »к типу« System.String` »указывает, что первый столбец вашего результирующего набора является значением DBNUll. Это от приведения к строке в первой строке:
string accountNumber = (string) ... ExecuteScalar(...);
Комментарий Marc_s о том, что вам не нужно проверять DBNull. Значение неверное.