Я получил указанную выше ошибку в своем приложении. Вот исходный код
public string GetCustomerNumber(Guid id)
{
string accountNumber =
(string)DBSqlHelperFactory.ExecuteScalar(connectionStringSplendidmyApp,
CommandType.StoredProcedure,
"GetCustomerNumber",
new SqlParameter("@id", id));
return accountNumber.ToString();
}
Я заменил на
public string GetCustomerNumber(Guid id)
{
object accountNumber =
(object)DBSqlHelperFactory.ExecuteScalar(connectionStringSplendidCRM,
CommandType.StoredProcedure,
"spx_GetCustomerNumber",
new SqlParameter("@id", id));
if (accountNumber is System.DBNull)
{
return string.Empty;
}
else
{
return accountNumber.ToString();
}
}
Есть ли способ лучше?
Ответы:
Можно использовать более короткую форму:
РЕДАКТИРОВАТЬ: Не обращал внимания на ExecuteScalar. Он действительно возвращает null, если поле отсутствует в возвращаемом результате. Поэтому используйте вместо этого:
источник
null
, если выбранная строка имеетNULL
в этом столбце, возвращаемое значениеSystem.DBNull
.С простой универсальной функцией вы можете сделать это очень легко. Просто сделай это:
используя функцию:
источник
ExecuteScalar вернет
Если вы знаете, что первый столбец набора результатов является строкой, то для охвата всех баз вам необходимо проверить как null, так и DBNull. Что-то вроде:
Приведенный выше код основан на том, что DBNull.ToString возвращает пустую строку.
Если accountNumber был другим типом (скажем, целым), вам нужно было бы быть более явным:
Если вы точно знаете, что в вашем наборе результатов всегда будет хотя бы одна строка (например, SELECT COUNT (*) ...), то вы можете пропустить проверку на null.
В вашем случае сообщение об ошибке «Невозможно привести объект типа 'System.DBNull' к типу 'System.String`» указывает, что первый столбец вашего набора результатов является значением DBNUll. Это от приведения к строке в первой строке:
Комментарий Marc_s, что вам не нужно проверять DBNull.Value, неверен.
источник
Вы можете использовать оператор объединения NULL в C #
источник
Есть еще один способ обойти эту проблему. Как насчет изменения процедуры вашего магазина? используя функцию sql ISNULL (ваше поле, ""), вы можете вернуть пустую строку, если возвращаемое значение равно null.
Тогда у вас будет чистый код в виде оригинальной версии.
источник
Это общий метод, который я использую для преобразования любого объекта, который может быть DBNull.Value:
использование:
короче:
источник
Полагаю, вы можете сделать это так:
Если accountNumber имеет значение null, это означает, что это DBNull, а не строка :)
источник
return (accountNumber as string) ?? string.Empty;
, если accountNumber по-прежнему являетсяobject
. Если вы предпочитаете, чтобы вызов базы данных оставался на отдельной линии.String.Concat преобразует значения DBNull и NULL в пустую строку.
Однако я думаю, что вы теряете понятность кода.
источник
return "" + accountNumber;
?Поскольку у меня есть экземпляр, который не равен нулю, и если я сравнил с DBNULL, я получил
Operator '==' cannot be applied to operands of type 'string' and 'system.dbnull'
исключение, и если я попытался изменить, чтобы сравнить с NULL, он просто не сработал (поскольку DBNull является объектом), даже если это принятый ответ.Я решил просто использовать ключевое слово «есть». Так что результат очень читабельный:
data = (item is DBNull) ? String.Empty : item
источник
Я использую расширение, чтобы устранить эту проблему, которая может быть или не быть тем, что вам нужно.
Это выглядит так:
Примечание:
Это расширение не возвращает
null
значений! Если элемент равенnull
или DBNull.Value , он вернет пустую строку.Использование:
источник
Преобразуйте это как
источник