如何解决位值的IndexOutOfRangeException?

时间:2016-05-13 13:55:45

标签: boolean bit sqldatareader indexoutofrangeexception

我从SQL表中读取一个位值,并作为布尔值进行转换以映射到布尔模型值。

但当我回读IsPDLChecked位字段并初始化为false时,我得到index out of range exception

我查找了异常的定义,我不确定为什么该值超出范围,因为它是 init并带有错误值,即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
  消息= IsPDLChecked
  来源= System.Data
  StackTrace:

     

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

DB Schema :(我注意到" CHARACTER_MAX_LENGTH"列在此设置为null):

enter image description here

DB值:( IsPDLChecked有值)

enter image description here

1 个答案:

答案 0 :(得分:2)

documentation表示当“指定的名称不是有效的列名称”时,您将获得 IndexOutOfRangeException

您应该做的第一件事是确保C#中的列名与表中的列名匹配(或者如果重新定义,则在查询中):

SELECT ContactDisplayName, ContactEmailAddress, IsPDLChecked FROM table

SELECT * FROM table

将返回与表格中的列名相同的列名,您的读者现在应该没问题。

但如果您的查询如下:

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

你需要在C#中读取这样的结果:

dataReader["Name"]
dataReader["Email"]
dataReader["Checked"]