如何通过列的名称检查MySqlDataReader中的NULL?

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

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

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

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

 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 

if(rdr.GetString(“timeOut”)== DBNull.Value)

nullDBNull

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

SqlDataReader确实有强类型的GetString()并为这种情况提供了IsDBNull(int column)

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

null更改为DBNull.Value

你也可以这样做:

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

您可以将从NULL字段中检索的对象与DBNull.Value进行比较 。

这是我喜欢的一个:

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

例如 (原始要求):

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

这是我创建的一个方法,用于读取DBNull并返回default(T)

  private T GetNullable(MySqlDataReader reader, int ordinal, Func 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.的返回值进行解析reader. – 方法。 如果它返回一个字符串,你将收到一个nullDBNull 。 如果是int ,则返回0等。

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