Привет, Я получаю следующее сообщение об ошибке при попытке обработать нулевое значение, используя coalesce operator, любая идея, почему?
Невозможно использовать объект типа System.DBNull
для ввода System.String
using(SqlDataReader rMemo = cmdUMemo.ExecuteReader())
{
while (rMemo.Read())
{
String Title = (String)rMemo["UpdateTitle"] ?? "";
lblUTitle.Text = Title;
}
}
Используйте ключевое слово as
:
String Title = rMemo["UpdateTitle"] as String ?? "";
Тип DBNull
не может быть явно преобразован в строку, однако ключевое слово as
попытается выполнить преобразование, а если оно не выполнено, верните null
. Это null
будет затем соединялись в ""
с помощью ??
оператор.
Сравните его DBNull.Value и верните пустую строку, например:
String Title = rMemo["UpdateTitle"] == DBNull.Value ? "" :
rMemo["UpdateTitle"].ToString();
Другой способ сделать то же самое можно было бы использовать Convert.ToString
он вернет пустую строку для DBNull.Value
String Title = Convert.ToString(rMemo["UpdateTitle"]);
Помните DBNull.Value.ToString()
означает пустую строку. Таким образом, вы можете проверить, есть ли у ваших возвращенных строк столбец UpdateTitle
а затем вызвать Convert.ToString
как:
string Title = rMemo["UpdateTitle"] != null ? Convert.ToString(rMemo["UpdateTitle"])
: "";
Применение Convert.ToString
отношении null
значений возвращает null
не пустую строку.
Хороший простой способ справиться с этим - написать метод расширения, который затем можно использовать повсеместно:
public static class ObjectExtensions
{
public String ToStringOrEmpty(this object obj)
{
if(obj == null)
return String.Empty;
return obj.ToString();
}
}
Тогда вы можете просто называть его так, чтобы ваш код был приятным и читаемым:
String Title = rMemo["UpdateTitle"].ToStringOrEmpty()