我从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):
DB值:( IsPDLChecked有值)
答案 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"]