C# SqlDataReader中Null的处理
我有一个这样的读者:C# SqlDataReader中Null的处理,c#,sql-server,ado.net,C#,Sql Server,Ado.net,我有一个这样的读者: using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { var item = new Product { _x1 = reader.GetString(0), _x2 = reader.GetString(1), _x3 = reader.GetStr
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
值,我得到一个数据为NULL的异常,我如何处理它呢?最有可能的一个列值是DBNull。你不需要检查
在读取可能有空值的列时,我使用了一系列扩展方法。如果基类型不可为null,则返回值是原始类型的可为null变量
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);
}
这里存在的根本问题是,在调用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)
};
出现空异常的位置?无论如何,如果(reader!=null或在
try/catch
中放置一个if(reader!=null)可以使x变量为null吗?@Tico当我创建新产品对象时,异常会触发。@MikeSchwartz我这样做了,但仍然不工作:public DateTime?x3{get;set;}是的,现在我想起来了,reader.GetString()仍然抛出异常。