2011-11-25 147 views
1

我试图在决定将什么输入到ASP.net下拉列表中之前检查字段的值。DataReader.Read()跳过记录集的第一行

我正在使用datareader.Read()为了读取记录集,所以我可以做到这一点。但是,这会跳过第一行数据。 。下拉框基本上是大小和颜色的列表。 。 。所以目前我缺少第一个尺寸。

下面是代码:

Using cmd As New SqlCommand("doGetAllSizesForProduct", oConn) 
    cmd.CommandType = CommandType.StoredProcedure 
    cmd.Parameters.AddWithValue("@id", CType(Request.QueryString("id"), Integer)) 
    oConn.Open() 
    Using dr As SqlDataReader = cmd.ExecuteReader() 
    If dr.HasRows() = True Then 
     dr.Read() 
     ddlSize.Visible = True 
     pnlSize.Visible = True 
     pnlNoStock.Visible = False 
     If dr("colour") = "None" Then 
     ddlSize.DataTextField = "size" 
     Else 
     ddlSize.DataTextField = "sizeColour" 
     End If      
     ddlSize.DataValueField = "mapperid" 
     ddlSize.DataSource = dr 
     ddlSize.DataBind() 
    Else 
    End If 
    dr.Close() 
    End Using 
End Using 

我想要么必须有比读或其他方式的另一种方法来阻止它跳过第一个记录?

回答

3

我从来没有见过一个datareader被用作数据源。我认为正在发生的事情是,您的第一个电话dr.Read()正在跳至第一个记录,如预期的那样。但是,当您将阅读器指定为数据源时,它将执行自己的dr.Read()逻辑,其内部从下一条记录开始。这可以解释为什么你没有看到第一个项目。尝试修改这样的代码中使用数据表,而不是(警告,没有测试这一点):

using dr as SqlDataReader = cmd.ExecuteReader() 
    if dr.HasRows() then 
     ddlSize.Visible = True 
     pnlSize.Visible = True 
     pnlNoStock.Visible = False 

     While dr.Read() 
      dim Value as string = dr("mapperid") 
      dim Text as string = if(dr("colour") = "None",dr("size"),dr("sizeColour")) 
      ddlSize.Items.Add(New ListItem(Text, Value)) 
     End While 
    end if 
    dr.Close() 
end using 
+0

oscilatingcretin,这是非常接近我所需要的,唯一的问题是,它不工作排排找出行颜色=“无”,只有你选择的行。我将如何使它在逐行的基础上解决这个问题,感谢您的帮助至今 – Scrappy

+0

我不确定你的意思。上面的代码基本上和你的代码完全一样,但是用一个数据表而不是一个阅读器。你原来的代码只能对'dr.Read()'进行一次调用,所以它只能用于一次迭代。对于初学者,我的解决方案是否至少用所有数据填充下拉菜单? – oscilatingcretin

+0

上面的代码确实填充了我的下拉菜单。但是,例如,如果第一个值是“Medium Red”,那么它会显示每个迭代的大小和颜色,因此即使第二个值为“Medium None”,它也将显示“Medium None”,而不是“Medium”,因为它没有对每一次迭代进行检查。同样,如果第一个值为“中等无”,则它将显示为“中”,但“中红”的第二个值也只会显示为“中”。我基本上只需要在每一次迭代中对它进行评估,而不仅仅是第0行。感谢您的帮助,非常感谢 – Scrappy

0

如何更改doGetAllSizesForProduct存储过程以返回两个记录集?

第一个记录集可以返回单个行,指示第二个记录集中包含的数据类型与之前包含的内容相同。

0

你不应该使用DataReader这样,执行单个Read得到的第一条记录的值,那么UI控件绑定到它:

ddlSize.DataValueField = "mapperid" 
ddlSize.DataSource = dr 
ddlSize.DataBind() 

我会亲自使用DataTable绑定到UI控件,或尝试删除对dr.Read()的调用并查看它是如何工作的。