Как получить битовую ценность с SqlDataReader и преобразовать его в bool?

Я извлекаю информацию пользователя из базы данных, используя простой запрос.

select * from dbo.[User] u where u.Email = @email

Затем я попытаюсь получить значение столбца, называемого IsConfirmed (который представлен в виде столбца типа бит в базе данных) и преобразовать его в bool.

bool isConfirmed = int.Parse(sqlDataReader["IsConfirmed"].ToString()) == 1;

Затем я получаю ошибку FormatException, заявляя, что "строка ввода не была в правильном формате".

Я видел подобный вопрос с ответом, предоставляющим этот код:

bool isConfirmed = sqlDataReader.GetBoolean(0);

Но это не сработает с моим делом, потому что я не знаю индекс столбца IsConfirmed, и я не хочу его знать. Я хочу использовать имя столбца.

Ответ 1

Значение, возвращаемое из свойства индексатора чтения данных, относится к типу объекта, но может быть добавлено к типу данных, который он был сохранен как.

Попробуйте следующее:

bool isConfirmed = (bool)sqlDataReader["IsConfirmed"]

Ответ 2

Если вы хотите использовать имя столбца, вы можете использовать

bool isConfirmed = sqlDataReader.GetBoolean(sqlDataReader.GetOrdinal("IsConfirmed"));

Ответ 3

Ваш код должен работать, если у вас нет нулевого значения в столбце IsConfirmed.
Обычно эти бит-столбцы имеют свойство NOT NULL и/или значение по умолчанию 0, но может иметь нулевое значение, и в этом случае ваш код будет терпеть неудачу с указанной ошибкой.

Вы можете исправить это таким образом (вам понадобится позиция столбца для этой проверки)

int colPos = sqlDataReader.GetOrdinal("IsConfirmed");
bool isConfirmed = sqlDataReader.IsDBNull(colPos) ? false : sqlDataReader.GetBoolean(colPos));

Если вам действительно не нравится звонить в позицию столбца, вы можете создать метод расширения, который позволит вам скрыть вызов

public static class ReaderExtensions
{
    public static bool IsDBNull(this SqlDataReader reader, string colName)
    {
        int colPos = reader.GetOrdinal(colName);
         return reader.IsDBNull(colPos);
    }
}

и назовите его

bool isConfirmed = int.Parse((sqlDataReader.IsDBNull("IsConfirmed") 
                    ? "0" : sqlDataReader["IsConfirmed"].ToString())) == 1;