Как проверить NULL в MySqlDataReader по имени столбца? - PullRequest
18 голосов
/ 19 января 2011

Как я могу проверить значение NULL в открытом MySqlDataReader?

Следующее не работает;он всегда набирает else:

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

rdr.IsDbNull(int i) принимает только номер столбца, а не имя.

Ответы [ 8 ]

31 голосов
/ 19 января 2011
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
14 голосов
/ 19 января 2011

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

null не совпадает с DBNull

Извините, неправильный ответ, Сэм Б прав. Я принял это за DataRow материал.

SqlDataReader строго набрал GetString() и предоставляет IsDBNull(int column) для этого случая.

3 голосов
/ 19 января 2011

Вы должны позвонить rdr.IsDBNull(column), чтобы определить, является ли значение DbNull.

1 голос
/ 26 ноября 2013

Вот один, который мне нравится:

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

Например: (для первоначального требования):

queryResult.Egresstime = rdr["timeOut"] is DBNull ? "Logged in" : rdr.GetString("timeOut");
1 голос
/ 11 января 2013

Вы можете сравнить объект, полученный из поля NULL, с DBNull.Value .

1 голос
/ 19 января 2011

Вы также можете сделать:

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

1 голос
/ 19 января 2011

Изменить null на DBNull.Value.

0 голосов
/ 08 августа 2018

Вот метод, который я создал, чтобы прочитать 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, поэтому будьте осторожны.

...