在SqlDataReader中处理Null

时间:2013-12-17 02:01:59

标签: 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.GetString(2),
            _x4 = reader.GetDateTime(3)
        };
        list.Add(item);
    }
}

但有时数据库有一些NULL值,我得到一个数据为空的异常,我该如何处理?

2 个答案:

答案 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)
};