如何解决位值的 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 有一个值)
documentation 说 IndexOutOfRangeException 是在 "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"]
我正在从 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 有一个值)
documentation 说 IndexOutOfRangeException 是在 "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"]