'当没有数据存在时无效的读取尝试'错误

时间:2016-06-03 15:08:20

标签: c# code-behind

我有这个代码块:

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)

1 个答案:

答案 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;
}