public static T Def<T>(this SqlDataReader r, int ord)
{
var t = r.GetSqlValue(ord);
if (t == DBNull.Value) return default(T);
return ((INullable)t).IsNull ? default(T) : (T)t;
}
public static T? Val<T>(this SqlDataReader r, int ord) where T:struct
{
var t = r.GetSqlValue(ord);
if (t == DBNull.Value) return null;
return ((INullable)t).IsNull ? (T?)null : (T)t;
}
public static T Ref<T>(this SqlDataReader r, int ord) where T : class
{
var t = r.GetSqlValue(ord);
if (t == DBNull.Value) return null;
return ((INullable)t).IsNull ? null : (T)t;
}
像这样使用它们:
var dd = r.Val<DateTime>(ords[4]);
var ii = r.Def<int>(ords[0]);
int nn = r.Def<int>(ords[0]);
9
此解决方案不依赖于供应商,可与SQL,OleDB和MySQL Reader配合使用:
public static string GetStringSafe(this IDataReader reader, int colIndex)
{
return GetStringSafe(reader, colIndex, string.Empty);
}
public static string GetStringSafe(this IDataReader reader, int colIndex, string defaultValue)
{
if (!reader.IsDBNull(colIndex))
return reader.GetString(colIndex);
else
return defaultValue;
}
public static string GetStringSafe(this IDataReader reader, string indexName)
{
return GetStringSafe(reader, reader.GetOrdinal(indexName));
}
public static string GetStringSafe(this IDataReader reader, string indexName, string defaultValue)
{
return GetStringSafe(reader, reader.GetOrdinal(indexName), defaultValue);
}
22 回答
您可以编写一个Generic函数来检查Null,并在它为NULL时包含默认值 . 读取Datareader时调用此方法
在阅读Datareader时使用
您应该将
as
运算符与??
运算符结合使用以获取默认值 . 值类型需要被读取为可空并给定默认值 .as
运算符处理转换,包括检查DBNull .我想你会想要使用:
我使用下面列出的代码来处理读入数据表的Excel工作表中的空单元格 .
你也可以检查这个
当使用列名称在datareader中返回行时,我不会 NULL 为 NULL 列值 .
如果你执行
datareader["columnName"].ToString();
它将始终为您提供一个可以为空字符串的值(如果需要比较,则为String.Empty
) .我会使用以下内容,不会太担心:
一种方法是检查db nulls:
你需要检查
IsDBNull
:这是您检测和处理这种情况的唯一可靠方法 .
我将这些内容包装到扩展方法中,如果列确实是
null
,则往往会返回默认值:现在你可以像这样调用它:
而且你永远不必再担心异常或
null
值 .IsDbNull(int)
通常比使用GetSqlDateTime
之类的方法慢得多,然后与DBNull.Value
进行比较 . 尝试SqlDataReader
的这些扩展方法 .像这样使用它们:
此解决方案不依赖于供应商,可与SQL,OleDB和MySQL Reader配合使用:
在尝试阅读之前检查
sqlreader.IsDBNull(indexFirstName)
.和/或使用三元运算符和赋值:
替换每个属性类型的默认值(当为null时)...
如何创建帮助方法
对于String
用法
对于Int
用法
对于日期
用法
注意:对于DateTime,将varialbe声明为
您可以使用条件运算符:
我们使用一系列静态方法从数据读取器中提取所有值 . 所以在这种情况下我们会调用
DBUtils.GetString(sqlreader(indexFirstName))
创建静态/共享方法的好处是你不必一遍又一遍地做同样的检查......静态方法将包含检查空值的代码(请参阅本页的其他答案) .
老问题,但也许有人仍然需要一个答案
实际上,我解决了这个问题
对于int:
对于字符串相同只返回“”而不是0,因为“”是空字符串
所以你可以像使用它一样
和
非常灵活,所以你可以插入任何查询来读取任何列,它永远不会返回错误
我倾向于用适当的东西替换SELECT语句中的空值 .
在这里,我用空字符串替换每个null . 在这种情况下,您的代码不会出错 .
作为marc_s的答案的补充,您可以使用更通用的扩展方法从SqlDataReader获取值:
对于字符串,您可以简单地转换对象版本(使用数组运算符访问)并使用null字符串为null:
要么
对于整数,如果转换为可为空的int,则可以使用GetValueOrDefault()
或null-coalescing运算符(
??
) .reader.IsDbNull(ColumnIndex)
正如许多答案所说 .我想提一下,如果你使用列名,只比较类型可能会更舒服 .
此方法依赖于indexFirstName,它应该是从零开始的列序号 .
如果您不知道列索引但不想检查名称,则可以使用此扩展方法:
并使用这样的方法: