C# 如何通过列';她叫什么名字?

C# 如何通过列';她叫什么名字?,c#,mysql,null,dbnull,mysqldatareader,C#,Mysql,Null,Dbnull,Mysqldatareader,如何在打开的MySqlDataReader中检查NULL值 以下方法不起作用;它总是按其他: if (rdr.GetString("timeOut") == null) { queryResult.Egresstime = "Logged in"; } else { queryResult.Egresstime = rdr.GetString("timeOut"); } rdr.IsDbNull(int i)只接受列号,不接受名称。if(rdr.GetString(“timeO

如何在打开的
MySqlDataReader
中检查
NULL

以下方法不起作用;它总是按
其他

if (rdr.GetString("timeOut") == null)
{
    queryResult.Egresstime = "Logged in";
}
else
{
    queryResult.Egresstime = rdr.GetString("timeOut");
}
rdr.IsDbNull(int i)
只接受列号,不接受名称。

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

null
DBNull

对不起,回答错了,山姆B是对的。我把它误认为是数据行的东西


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

null
更改为
DBNull.Value

您还可以执行以下操作:


If(string.IsNullOrEmpty(rdr.GetString(“timeOut”))
必须调用
rdr.IsDBNull(column)
以确定值是否为
DbNull

var ordinal = rdr.GetOrdinal("timeOut");
if(rdr.IsDBNull(ordinal)) {
  queryResult.Egresstime = "Logged in";
} else {
  queryResult.Egresstime = rdr.GetString(ordinal);
}//if


您可以将从空字段检索的对象与进行比较。

这里有一个我喜欢的对象:

var MyString = rdr["column"] is DBNull ? "It's null!" : rdr.GetString("column");
例如(对于原始要求):


下面是我创建的一个方法,用于读取
DBNull
,并返回
default(T)
以防万一:

   private T GetNullable<T>(MySqlDataReader reader, int ordinal, Func<int, T> getValue)
        {
            if (reader.IsDBNull(ordinal))
            {
                return default(T);
            }
            return getValue(ordinal);
        }
泛型类型
T
将根据
读取器的返回值进行解析。
-方法。如果它返回字符串,则在
DBNull
的情况下,您将收到
null
。如果它是
int
则返回
0
,以此类推

注意:对于整数值,可能不需要获取
0
,因此请小心。

私有的T GetNullableValue(MySqlDataReader rdr,字符串参数名称)
    private T GetNullableValue<T>(MySqlDataReader rdr, string parameterName)
    {
        object value = rdr[parameterName];
        if (value is DBNull)
            return default;

        return (T)value;
    }
{ 对象值=rdr[parameterName]; if(值为DBNull) 返回默认值; 返回(T)值; }
以及用法,例如:

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

我认为应该是
DBNull.Value
以下是我得到的错误1:运算符“==”不能应用于类型为“string”和“System.DBNull”的操作数,其效果与(rdr.GetString(“timeOut”)==null)相同@rd42:那么,当您调试时,该字段中的实际值是多少?只是好奇而已?值是:12/7/2010 10:16:46谢谢您的帮助。下面是我得到的错误1:运算符“==”不能应用于“string”和“System.DBNull”类型的操作数–您是自己绿色检查的赢家。我使用了第二个。谢谢!中的小错误第二个示例:将“IsDbNull”更改为“IsDbNull”,这对于空检查来说太长了。
   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);
            }
    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");