Как разрешить исключение IndexOutOfRangeException для битового значения?

Я считываю битовое значение из таблицы SQL и использую логическое значение для сопоставления с логическим значением модели.

Но когда я считываю битовое поле IsPDLChecked и инициализирую его как false, я получаю index out of range exception.

Я просмотрел определение исключения и не понимаю, почему значение выходит за пределы допустимого диапазона из-за инициализации с ложным значением, т. е. 0. Так что это не отрицательное значение диапазона.

Вопрос:

Почему я получаю IndexOutOfRange exception, хотя считываемое обратно битовое значение приводится к bool, а init к false?

Код:

Модель -

public partial class EmailContact
{
    public int ContactID { get; set; }
    public bool IsPDLChecked { get; set; }
    public string ContactDisplayName { get; set; }
    public string ContactEmailAddress { get; set; }   

}

Фрагмент чтения данных -

while (dataReader.Read())
{
    statusList.Add(new EmailContact(dataReader["IsPDLChecked"] as bool? ?? false,dataReader["ContactDisplayName"].ToString(), dataReader["ContactEmailAddress"].ToString()));
}

Сведения об ошибке:

System.IndexOutOfRangeException было перехвачено
HResult=-2146233080
Message=IsPDLChecked
Source=System.Data
StackTrace:

в System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName)
в System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)
в System.Data.SqlClient.SqlDataReader.get_Item(String name)

Схема БД: (я заметил, что для столбца «CHARACTER_MAX_LENGTH» установлено значение null):

введите здесь описание изображения

Значения БД: (IsPDLChecked имеет значение)

введите здесь описание изображения


person Brian J    schedule 13.05.2016    source источник


Ответы (1)


документация говорит, что IndexOutOfRangeException вы получаете, когда "указанное имя не является допустимым именем столбца".

Первое, что вы должны сделать, это убедиться, что имена столбцов в C# совпадают с именами столбцов в таблице (или в запросе, если они переопределены):

SELECT ContactDisplayName, ContactEmailAddress, IsPDLChecked FROM table

or

SELECT * FROM table

вернет имена столбцов, которые будут такими же, как в таблице, и ваш читатель должен быть в порядке, как сейчас.

Но если ваш запрос выглядит так:

SELECT ContractDisplayName as Name,
       ContactEmailAddress as Email,
       IsPDLChecked as Checked
  FROM table

вам нужно будет прочитать такой результат на С#:

dataReader["Name"]
dataReader["Email"]
dataReader["Checked"]
person PhilDulac    schedule 13.05.2016