如何解决位值的 IndexOutOfRangeException?

How to resolve an IndexOutOfRangeException on bit value?

我正在从 SQL table 中读回一个位值,并将其转换为布尔值以映射到布尔模型值。

但是当我读回 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; }   

}

数据reader片段-

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

错误详细信息:

System.IndexOutOfRangeException was caught
HResult=-2146233080
Message=IsPDLChecked
Source=System.Data
StackTrace:

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

DB 架构:(我确实注意到 "CHARACTER_MAX_LENGTH" 列在此设置为空):

数据库值:(IsPDLChecked 有一个值)

documentationIndexOutOfRangeException 是在 "the name specified is not a valid column name".

时抛出的

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

SELECT ContactDisplayName, ContactEmailAddress, IsPDLChecked FROM table

SELECT * FROM table

将 return 列名称与 table 中的列名称相同,您的 reader 应该没问题。

但是如果您的查询是这样的:

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

您需要在 C# 中像这样读取结果:

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