我在数据库记录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"]);
}
答案 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);
}