我有一个这样的读者:
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
var item = new Product
{
_x1 = reader.GetString(0),
_x2 = reader.GetString(1),
_x3 = reader.GetString(2),
_x4 = reader.GetDateTime(3)
};
list.Add(item);
}
}
但有时数据库有一些NULL
值,我得到一个数据为空的异常,我该如何处理?
答案 0 :(得分:2)
最有可能的一个列值是DBNull。你没有检查。
在读取可能具有空值的列时,我使用了一系列扩展方法。如果基类型不可为空,则返回值是原始类型的可空变体。
public static string GetStringOrNull(this IDataReader reader, int ordinal)
{
return reader.IsDBNull(ordinal) ? null : reader.GetString(ordinal);
}
public static DateTime? GetDateTimeOrNull(this IDataReader reader, int ordinal)
{
return reader.IsDBNull(ordinal) ? null : (DateTime?)reader.GetDateTime(ordinal);
}
答案 1 :(得分:0)
您遇到的根本问题是,当您调用reader.GetString()时,.NET无法将“NULL”转换为字符串。要解决您的问题,如果数据读取器中的值为NULL,则必须确定要执行的操作,并在编程代码中提供此信息。你想用空字符串吗?你想使用null吗?你想要一个例外吗?
我建议为DataReader类编写一个扩展方法来创建一个封装所需逻辑的新函数。这是一个例子:
public static string GetStringOrEmptyString(this IDataReader reader, int ordinal)
{
if (reader.IsDBNull(ordinal)) {
// if its DBNULL, return empty string
return "";
} else {
// otherwise return thew value as string
return reader.GetString(ordinal);
}
}
您可以这样使用:
var item = new Product
{
_x1 = reader.GetStringOrEmptyString(0),
_x2 = reader.GetStringOrEmptyString(1),
_x3 = reader.GetStringOrEmptyString(2),
_x4 = reader.GetDateTime(3)
};