C#SqlDataReader返回值DBNull和String Empty

时间:2018-11-13 20:32:20

标签: c# sqldatareader

我在数据库记录1和记录2中有两个记录。数据读取器将为记录1返回{},并且代码可以正常工作。但是在记录2上,数据读取器将返回“”。我的问题是如何在我的代码中添加String Empty,当我在“即时Windows”中尝试返回“

”时

即时Windows

?dr["PhoneNumberId"].GetType()
{Name = "String" FullName = "System.String"}

Record 1
    ?dr["Id"]
    {}
Record 2    
    ?dr["Id"]
    ""
    ?(dr["Id"]) == DBNull.Value
    false
    ?(dr["Id"]) == string.Empty
    false
    ?(dr["Id"]) == ""
    false
    ?(dr["Id"])
    ""
    ?(dr["Id"]) == DBNull.Value
    false
    ?(dr["Id"]) == String.Empty
    false

代码仅适用于{}的返回,但是它将失败,并带有“”

while (dr.Read())
{
Id = (dr["Id"]) == DBNull.Value ? '\0' : Convert.ToInt32(dr["Id"]);
}

2 个答案:

答案 0 :(得分:0)

查询中的列的顺序位置是否固定?如果是这样,请使用SqlDataReader.GetString代替返回System.Object的{​​{3}}。然后,如果结果不为空,则可以使用string.IsNullOrEmpty或与string.Empty""进行直接比较。您还可以致电string indexer来检查DBNull.Value

// assuming the ordinal position of "id" is 0
var isDbNull = dr.IsDBNull(0);
var isEmpty = dr.GetString(0) == "";
var isEmptyOrWhitespace = string.IsNullOrWhiteSpace(dr.GetString(0));

答案 1 :(得分:0)

IDataReader上有一种方法可以检查空值。您可以将其包装在扩展方法中。我不在我的电脑旁,对任何错误都深表歉意,但是这样的事情……

public static class DataReaderExtensions
{
    public static string GetNullableString(this SqlDataReader dataReader, int ordinal)
    {
        return dataReader.IsDBNull(ordinal))
            ? (string)null
            : dataReader.GetString(ordinal);
    }
}

您需要为int设计一个,就像这样...

public static int? GetNullableInt32(this SqlDataReader dataReader, int ordinal)
{
    return dataReader.IsDBNull(ordinal))
        ? (int?)null
        : dataReader.GetInt32(ordinal);
}

您可以像这样使用它...

int idOrdinal=dr.GetOrdinal("Id");
while (dr.Read())
{
    Id = dr.GetNullableInt32(idOrdinal);
}