我有这个代码块:
using (SqlConnection con2 = new SqlConnection(str2))
{
using (SqlCommand cmd2 = new SqlCommand(@"SELECT * FROM VW_MOS_DPL_AccountValidation WHERE CUST_NUM = @CNum", con2))
{
con2.Open();
cmd2.Parameters.AddWithValue("@CNum", TBAccountNum.Text);
using (SqlDataReader DT2 = cmd2.ExecuteReader())
{
// If the SQL returns any records, process the info
if (DT2.HasRows)
{
// If there's a BusinessID (aka Business Type), fill it in
string BizID = (DT2["Business_ID"].ToString());
if (!string.IsNullOrEmpty(BizID))
{
DDLBustype.SelectedValue = BizID;
}
}
}
con2.Close();
}
}
当它到达行
string BizID = (DT2["Business_ID"].ToString());
它会抛出错误:
没有数据时无效尝试读取。
如果没有数据,为什么会超过if (DT2.HasRows)
?
答案 0 :(得分:4)
您需要致电
if(DT2.Read())
....
在尝试从DataReader读取数据之前。
HasRows仅告诉您SqlDataReader包含数据,但SqlDataReader会在连接时加载一条记录。因此,每次尝试从SqlDataReader中提取数据都应该先调用Read,将SqlDataReader放在通过连接返回的第一条记录上。
并且,因为如果调用能够读取记录,则Read方法返回true,您可以使用类似的内容替换对HasRows的调用
using (SqlDataReader DT2 = cmd2.ExecuteReader())
{
// If the SQL returns any records, process the info
while(DT2.Read())
{
// If there's a BusinessID (aka Business Type), fill it in
string BizID = (DT2["Business_ID"].ToString());
if (!string.IsNullOrEmpty(BizID))
{
DDLBustype.SelectedValue = BizID;
}
}
}
顺便说一下,如果BusinessID可能为NULL,那么你需要一个不同的测试来避免异常问题
int bizColIndex = DT2.GetOrdinal("Business_ID");
string BizID = (DT2.IsDBNull(bizColIndex) ? string.Empty : DT2.GetString(bizColIndex));
if (!string.IsNullOrEmpty(BizID))
{
DDLBustype.SelectedValue = BizID;
}