检查datareader中的记录是否为NULL

时间:2010-03-22 14:47:06

标签: c# asp.net-3.5

我浏览过S / O上的其他帖子,但我找不到适用于我的解决方案。

我有一个可能返回null值的datareader,如果是这样,我想将值等于空白

txtMiddleName.Text = rdrGetUserInfo.GetString(1) ?? "";

上面的字符串不起作用。 当我走过代码时,代码跳转到我的错误捕获块;

有什么想法吗?

6 个答案:

答案 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添加到它们中,以便能够只有一个或两个模板化方法。

如果有人可能有一个功能性技巧的想法或两个说出来:-)