C # SqlDataReader, возвращающий значения DBNull и String Empty - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть две записи в базе данных: запись 1 и запись 2. Хранилище данных вернет {} для записи 1, и код работает нормально. Но на записи 2 читатель вернется "". У меня вопрос: как я могу добавить String Empty в свой код, когда я пытаюсь сделать это в Immediate Windows, он возвращает false

Немедленно Windows

?dr["PhoneNumberId"].GetType()
{Name = "String" FullName = "System.String"}

Record 1
    ?dr["Id"]
    {}
Record 2    
    ?dr["Id"]
    ""
    ?(dr["Id"]) == DBNull.Value
    false
    ?(dr["Id"]) == string.Empty
    false
    ?(dr["Id"]) == ""
    false
    ?(dr["Id"])
    ""
    ?(dr["Id"]) == DBNull.Value
    false
    ?(dr["Id"]) == String.Empty
    false

Код работает только для возврата {}, но он не работает с ""

while (dr.Read())
{
Id = (dr["Id"]) == DBNull.Value ? '\0' : Convert.ToInt32(dr["Id"]);
}

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Для IDataReader существует метод проверки на нулевые значения. Вы можете заключить это в метод расширения. Я вдали от своего компьютера, поэтому извиняюсь за любые ошибки, но это выглядит примерно так ...

public static class DataReaderExtensions
{
    public static string GetNullableString(this SqlDataReader dataReader, int ordinal)
    {
        return dataReader.IsDBNull(ordinal))
            ? (string)null
            : dataReader.GetString(ordinal);
    }
}

И вам нужен один для int, который был бы таким:

public static int? GetNullableInt32(this SqlDataReader dataReader, int ordinal)
{
    return dataReader.IsDBNull(ordinal))
        ? (int?)null
        : dataReader.GetInt32(ordinal);
}

Вы можете использовать это так ...

int idOrdinal=dr.GetOrdinal("Id");
while (dr.Read())
{
    Id = dr.GetNullableInt32(idOrdinal);
}
0 голосов
/ 14 ноября 2018

Исправлены ли порядковые позиции столбцов в запросе?Если это так, используйте SqlDataReader.GetString вместо строкового индексатора , который возвращает System.Object.Затем вы можете использовать string.IsNullOrEmpty или сделать прямое сравнение с string.Empty или "", если результат не равен нулю.Вы также можете позвонить SqlDataReader.IsDBNull, чтобы проверить DBNull.Value.

// assuming the ordinal position of "id" is 0
var isDbNull = dr.IsDBNull(0);
var isEmpty = dr.GetString(0) == "";
var isEmptyOrWhitespace = string.IsNullOrWhiteSpace(dr.GetString(0));
...