代码之家  ›  专栏  ›  技术社区  ›  Jason

如何检查datareader是否为null或空

  •  42
  • Jason  · 技术社区  · 17 年前

    我有一个datareader,它从sql server数据库返回一个lsit记录。我在数据库中有一个名为“附加”的字段。此字段有50%的时间为空或null。

    如果字段“附加”包含文本,则显示信息,否则隐藏字段。

    我试过:

    if (myReader["Additional"] != null)
    {
        ltlAdditional.Text = "contains data";
    }
    else
    {
         ltlAdditional.Text = "is null";
    }
    

    上面的代码给了我这个错误:

    例外情况详情: System.IndexOutOfRangeException:附加

    任何帮助都将不胜感激。。。


    另见:

    Check for column name in a SqlDataReader object

    12 回复  |  直到 5 年前
        1
  •  80
  •   Omar    15 年前
    if (myReader["Additional"] != DBNull.Value)
    {
        ltlAdditional.Text = "contains data";
    }
    else
    {
         ltlAdditional.Text = "is null";
    }
    
        2
  •  15
  •   Gabriel GM    10 年前
    if (myReader.HasRows) //The key Word is **.HasRows**
    
    {
    
        ltlAdditional.Text = "Contains data";
    
    }
    
    else
    
    {   
    
        ltlAdditional.Text = "Is null Or Empty";
    
    }
    
        3
  •  11
  •   Kevin Nelson    15 年前

    我已经3年多没有使用数据阅读器了,所以我想确认一下我的记忆并找到了这个。无论如何,对于任何像我一样偶然看到这篇文章并希望使用列名而不是序号来测试IsDBNull的人,并且您使用的是VS 2008+(&NET 3.5),您可以编写一个扩展方法,以便将列名传入:

    public static class DataReaderExtensions
    {
        public static bool IsDBNull( this IDataReader dataReader, string columnName )
        {
            return dataReader[columnName] == DBNull.Value;
        }
    }
    

        4
  •  9
  •   dmc Rupok    14 年前

    这是正确且经过测试的解决方案

    if (myReader.Read())
    {
    
        ltlAdditional.Text = "Contains data";
    }
    else
    {   
        ltlAdditional.Text = "Is null";
    }
    
        5
  •  7
  •   catalyst    14 年前

    if ( myReader.IsDBNull(colNum) ) { retrievedValue = ""; }
    else { retrievedValue = myReader.GetString(colNum); }
    
        6
  •  2
  •   Joe Phillips    17 年前

    首先,你可能想检查一下 DBNull 不是常客 Null .

    或者你可以看看 IsDBNull 方法

        7
  •  1
  •   Kirtan    17 年前

    除了给出的建议之外,您还可以像这样直接从查询中执行此操作-

    SELECT ISNULL([Additional], -1) AS [Additional]
    

    通过这种方式,您可以写入条件以检查字段值是否为<0或>=0

        8
  •  1
  •   Shiva    15 年前

    @乔·菲利普斯

        9
  •  1
  •   cnom Evert    7 年前

    尝试以下更简单的等效语法:

    ltlAdditional.Text = (myReader["Additional"] == DBNull.Value) ? "is null" : "contains data";
    
        10
  •  0
  •   Rob    14 年前

    我也遇到过这种问题,但我的问题是,我使用DbDataReader作为我的通用读取器(用于SQL、Oracle、OleDb等)。如果使用DataTable,DataTable具有以下方法:

    DataTable dt = new DataTable();
    dt.Rows[0].Table.Columns.Contains("SampleColumn");
    

        11
  •  0
  •   Rodrigo Medeiros da Maia    8 年前

    例子:

    objCar.StrDescription = (objSqlDataReader["fieldDescription"].GetType() != typeof(DBNull)) ? (String)objSqlDataReader["fieldDescription"] : "";
    
        12
  •  -1
  •   Jason    17 年前

    AMG-抱歉,我有一个金发的时刻。“Additional”字段是在我最初设计数据库之后添加到数据库中的。

    我更新了所有代码以使用这个新字段,但是我忘记了更新调用选择数据库字段的实际datareader代码,因此它没有调用“附加”

    推荐文章