Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqlDataReader中Null的处理_C#_Sql Server_Ado.net - Fatal编程技术网

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()仍然抛出异常。