【问题标题】:how to check if a datareader is null or empty如何检查数据读取器是否为空或为空
【发布时间】:2010-10-20 06:09:59
【问题描述】:

我有一个数据读取器,它从 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

【问题讨论】:

    标签: c# null sqldatareader


    【解决方案1】:
    if (myReader["Additional"] != DBNull.Value)
    {
        ltlAdditional.Text = "contains data";
    }
    else
    {
         ltlAdditional.Text = "is null";
    }
    

    【讨论】:

    • 感谢您的回复罗伯特,我尝试了您建议的代码,但它仍然给了我“System.IndexOutOfRangeException: Additional”,因为在这种情况下,“Additional”为空
    • 虽然这是一篇较旧的帖子,但在 VB 中“If reader("Additional") System.DBNull.Value Then”此代码返回错误“Operator '' is not defined for types “对象”和“System.DBNull”
    • VB 中的语法是“如果不是 reader("Additional") Is DBNull.Value Then”
    【解决方案2】:
    if (myReader.HasRows) //The key Word is **.HasRows**
    
    {
    
        ltlAdditional.Text = "Contains data";
    
    }
    
    else
    
    {   
    
        ltlAdditional.Text = "Is null Or Empty";
    
    }
    

    【讨论】:

    • 感谢它帮助了我,但在 Windows Phone 8.1 中它应该是 myReader.HasRows,没有“()”。
    • 这回答了我的问题和标题中的问题,但原始帖子表明标题完全错误。很高兴它在这里供人们寻找标题问题的答案。只是很难过它这么远......
    • 我不确定这是否适用于这种情况。除非查询无法执行,否则 SqlReader 将始终至少有一个空数据集行。
    【解决方案3】:

    我已经 3 年多没有使用 DataReaders 了,所以我想确认一下我的记忆并找到了这个。无论如何,对于像我一样发生在这篇文章中并想要一种使用列名而不是序号来测试 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】:

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

      if (myReader.Read())
      {
      
          ltlAdditional.Text = "Contains data";
      }
      else
      {   
          ltlAdditional.Text = "Is null";
      }
      

      【讨论】:

      • 如果他们的 if NULL 在特定的列..?
      • 调用 .Read() 读取第一行,所以如果 DataReader 通过 while(DataReader.Read()) 传递给方法/函数,那么第一行会被跳过吗?如果是这样,我想我们可以使用 do while。
      • 这只会测试 DataReader 是否有行。问题是如何测试特定字段中的 NULL 值。 IDataReader 文档:msdn.microsoft.com/en-us/library/…
      【解决方案5】:

      我也使用 OleDbDataReader.IsDBNull()

      if ( myReader.IsDBNull(colNum) ) { retrievedValue = ""; }
      else { retrievedValue = myReader.GetString(colNum); }
      

      【讨论】:

        【解决方案6】:

        首先,您可能想要检查 DBNull 而不是常规的 Null

        或者你可以看看IsDBNull方法

        【讨论】:

        • 在这个数据库表中有 15 行。其中 14 个返回数据,但第 15 个(“附加”)并不总是包含数据。 .HasRows 如何处理有效行?
        【解决方案7】:

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

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

        这样你可以写条件来检查字段值是=0。

        【讨论】:

        • 我通常遵循这种模式,因为 NULL 代表数据库中的任何内容。
        【解决方案8】:

        @乔·菲利普斯

        SQlDataReader.IsDBNull(int index) 需要列的序号。有没有办法使用列名而不是序号来检查空值?

        【讨论】:

        • 如果我想使用列名而不是序号,我想我可以使用 if (readerObject["ColumnName"] != DBNull.Value)。虽然我不确定这种方法和 IsDBNull(columnOrdinalNumber) 方法之间是否存在性能改进(或降级)。 -湿婆mycodetrip.com
        【解决方案9】:

        试试这个更简单的等效语法:

        ltlAdditional.Text = (myReader["Additional"] == DBNull.Value) ? "is null" : "contains data";
        

        【讨论】:

          【解决方案10】:

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

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

          使用它,我可以确定该列是否存在于我的查询所具有的结果集中。我也在看 DbDataReader 是否有这个功能。

          【讨论】:

            【解决方案11】:

            这个

            例子:

            objCar.StrDescription = (objSqlDataReader["fieldDescription"].GetType() != typeof(DBNull)) ? (String)objSqlDataReader["fieldDescription"] : "";
            

            【讨论】:

              【解决方案12】:

              AMG - 对不起,有一个金发碧眼的时刻。在我最初设计数据库后,将“附加”字段添加到数据库中。

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

              【讨论】:

                猜你喜欢
                • 2016-02-04
                • 1970-01-01
                • 2011-11-04
                • 1970-01-01
                • 1970-01-01
                • 2023-03-30
                • 2014-03-09
                • 2011-01-23
                相关资源
                最近更新 更多