【问题标题】:How to resolve an IndexOutOfRangeException on bit value?如何解决位值上的 IndexOutOfRangeException?
【发布时间】:2016-09-05 04:04:01
【问题描述】:

我正在从 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; }   

}

数据读取器 sn-p -

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
堆栈跟踪:

在 System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName)
在 System.Data.SqlClient.SqlDataReader.GetOrdinal(字符串名称)
在 System.Data.SqlClient.SqlDataReader.get_Item(字符串名称)

数据库架构:(我确实注意到“CHARACTER_MAX_LENGTH”列设置为空):

DB 值:(IsPDLChecked 有值)

【问题讨论】:

    标签: boolean bit sqldatareader indexoutofrangeexception


    【解决方案1】:

    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"]
    

    【讨论】:

      猜你喜欢
      • 2022-01-12
      相关资源
      最近更新 更多