【问题标题】:How to check for NULL in MySqlDataReader by the column's name?如何通过列名检查 MySqlDataReader 中的 NULL?
【发布时间】:2011-06-11 23:56:17
【问题描述】:

如何检查打开的MySqlDataReader 中的NULL 值?

以下不起作用;它总是打到else

if (rdr.GetString("timeOut") == null)
{
    queryResult.Egresstime = "Logged in";
}
else
{
    queryResult.Egresstime = rdr.GetString("timeOut");
}

rdr.IsDbNull(int i) 只接受列号,不接受名称。

【问题讨论】:

    标签: c# mysql null dbnull mysqldatareader


    【解决方案1】:
        private T GetNullableValue<T>(MySqlDataReader rdr, string parameterName)
        {
            object value = rdr[parameterName];
            if (value is DBNull)
                return default;
    
            return (T)value;
        }
    

    以及用法举例:

    string message = GetNullableValue<string>(rdr, "Message");
    bool flag = GetNullableValue<bool>(rdr, "Flag");
    DateTime startTime = GetNullableValue<DateTime>(rdr, "StartTime");
    

    【讨论】:

      【解决方案2】:

      这是我创建的一种读取DBNull 并返回default(T) incase 的方法:

         private T GetNullable<T>(MySqlDataReader reader, int ordinal, Func<int, T> getValue)
              {
                  if (reader.IsDBNull(ordinal))
                  {
                      return default(T);
                  }
                  return getValue(ordinal);
              }
      

      可以这样使用:

         if (reader.Read())
                  {
                      account = new Account();
                      account.Id = reader.GetInt32(0);
                      account.Name = reader.GetString(1);
                      account.MailVerifiedAt = GetNullable(reader, 2, reader.GetDateTime);
                      account.MailToken = GetNullable(reader, 3, reader.GetString);
                  }
      

      泛型类型T 将根据reader.- 方法的返回值进行解析。如果它返回一个字符串,您将收到一个null incase DBNull。如果是int,它将返回0,等等。

      注意:对于整数值,可能不希望得到0,所以要小心。

      【讨论】:

        【解决方案3】:
        var ordinal = rdr.GetOrdinal("timeOut");
        if(rdr.IsDBNull(ordinal)) {
          queryResult.Egresstime = "Logged in";
        } else {
          queryResult.Egresstime = rdr.GetString(ordinal);
        }//if
        

        if(Convert.IsDBNull(rdr["timeOut"])) {
          queryResult.Egresstime = "Logged in";
        } else {
          queryResult.Egresstime = rdr.GetString("timeOut");
        }//if
        

        【讨论】:

        • 你是赢家 0f 你自己的绿色支票。我用的是第二个。谢谢!
        • 第二个示例中的小错字:将“IsDbNull”更改为“IsDBNull”
        • 这对于空检查来说太长了。
        【解决方案4】:

        这是我喜欢的一个:

        var MyString = rdr["column"] is DBNull ? "It's null!" : rdr.GetString("column");
        

        例如(对于原始要求):

        queryResult.Egresstime = rdr["timeOut"] is DBNull ? "Logged in" : rdr.GetString("timeOut");
        

        【讨论】:

          【解决方案5】:

          您可以比较从 NULL 字段检索的对象与DBNull.Value

          【讨论】:

            【解决方案6】:

            if(rdr.GetString("timeOut") == DBNull.Value)

            nullDBNull不一样

            对不起,错误的答案,Sam B 是对的。我把它误认为是DataRow 的东西。

            SqlDataReader 确实具有强类型 GetString() 并为此案例提供 IsDBNull(int column)

            【讨论】:

            • 我觉得应该是DBNull.Value
            • 这是我得到的错误 1:运算符“==”不能应用于“字符串”和“System.DBNull”类型的操作数
            【解决方案7】:

            您必须调用rdr.IsDBNull(column) 来确定该值是否为DbNull

            【讨论】:

              【解决方案8】:

              你也可以这样做:

              If (string.IsNullOrEmpty(rdr.GetString("timeOut"))

              【讨论】:

              • 和(rdr.GetString("timeOut") == null)效果一样
              • @rd42:那么调试时该字段的实际值是多少?只是好奇?
              • 值为:12/7/2010 10:16:46 AM 感谢您的帮助。
              【解决方案9】:

              null 更改为DBNull.Value

              【讨论】:

              • 这是我得到的错误 1:运算符 '==' 不能应用于类型为 'string' 和 'System.DBNull' 的操作数 –
              猜你喜欢
              • 2011-10-23
              • 2011-08-23
              • 1970-01-01
              • 2016-08-17
              • 1970-01-01
              • 2014-05-29
              • 1970-01-01
              • 2017-03-24
              • 1970-01-01
              相关资源
              最近更新 更多