2016-05-13 25 views
0

我正在从SQL表中读取一个位值,并将其转换为布尔值以映射到布尔模型值。如何解决位值上的IndexOutOfRangeException?

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

我抬头异常的定义,我不知道为什么值超出范围,由于它是初始化用假值,即0。所以这不是一个负范围值。

问:

为什么我会得到一个IndexOutOfRange exception虽然位值被读回被转换为bool和init假?

代码:

模型 -

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

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

DB模式:(我也注意到了 “CHARACTER_MAX_LENGTH” 列设置为null在此):

enter image description here

DB值:(IsPDLChecked有一个值)

enter image description here

回答

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"] 
相关问题