我浏览过S / O上的其他帖子,但我找不到适用于我的解决方案。
我有一个可能返回null值的datareader,如果是这样,我想将值等于空白
txtMiddleName.Text = rdrGetUserInfo.GetString(1) ?? "";
上面的字符串不起作用。 当我走过代码时,代码跳转到我的错误捕获块;
有什么想法吗?
答案 0 :(得分:7)
尝试
txtMiddleName.Text = rdrGetUserInfo.IsDBNull(1) ? string.Empty : rdrGetUserInfo.GetString(1);
答案 1 :(得分:2)
您可以在DataReader上使用IsDBNull method。
if (!rdrGetUserInfo.IsDBNull(1))
{
txtMiddleName.Text = rdrGetUserInfo.GetString(1);
}
答案 2 :(得分:1)
这是因为rdrGetUserInfo正在返回DBNull,这是一个类。
在获取字符串之前,先检查一下dbnull是什么样的(因为我使用过它已经有一段时间了!):
if (!rdrGetUserInfo.IsDBNull("someField"))
txtMiddleName.Text = rdrGetUserInfo.GetString(1);
答案 3 :(得分:1)
If(rdr("Field") == DBNull.Value)
'assign String.Empty
myString = string.Empty;
else
'assign value
myString = rdr("Field");
或者为了缩短这一点,你可以这样做:
txtMiddleName.Text = rdrGetUserInfo.IsDBNull(1) ? String.Empty : rdrGetUserInfo.GetString(1);
答案 4 :(得分:0)
在致电GetString
之前,您应该check the column for DbNull。
答案 5 :(得分:0)
IsDbNull(int)通常比使用GetSqlInt32等方法慢,然后比较DBNull.Value或使用它自己的.IsNull喜欢:
public static int Int32(this SqlDataReader r, int ord)
{
var t = r.GetSqlInt32(ord);
return t.IsNull ? default(int) : t.Value;
}
尝试了一些模板解决方案但到目前为止无济于事。问题是所有Sql类型(此处为SqlInt32)类型实际上是结构,而它们都有.Value属性C#没有真正的模板来处理它。它们也有自己的INullable接口,它只有.IsNull,并且与Nyllable<>不相容。
我怀疑人们需要完整的Sql类型作为C#模板,或者将ICOnvertible添加到它们中,以便能够只有一个或两个模板化方法。
如果有人可能有一个功能性技巧的想法或两个说出来:-)