Как проверить на наличие NULL в MySQldatareader по имени колонн?

StackOverflow https://stackoverflow.com/questions/4739641

Вопрос

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

Следующее не работает; это всегда бьет 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

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

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

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

Вы можете сравнить объект, который отслеживает с нулевого поля с Dbnull.value.

Изменять null к DBNull.Value.

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

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

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

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<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 в случае DBNull. Анкет Если это int он вернется 0, так далее.

Примечание. Для целочисленных значений не желательно получить 0 так что будьте осторожны.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top