如何通过列的名称检查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)
null
与DBNull
对不起,错误的回答,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.
– 方法。 如果它返回一个字符串,你将收到一个null
的DBNull
。 如果是int
,则返回0
等。
注意:对于整数值,可能不希望得到0
所以要小心。