DataReader.Read()跳过记录集的第一行

时间:2011-11-25 12:22:18

标签: asp.net vb.net datareader

我想在确定输入到ASP.net下拉列表中的内容之前检查一个字段的值。

我正在使用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

我想是否必须有除Read之外的其他方法或停止跳过第一条记录的方法?

3 个答案:

答案 0 :(得分:4)

我从未见过将datareader用作数据源。我认为正在发生的是,您对dr.Read()的第一次呼叫正按预期跳到第一条记录。但是,当您将阅读器指定为数据源时,它会在其中执行自己的dr.Read()逻辑,该逻辑从下一条记录开始。这可以解释为什么你没有看到第一个项目。尝试修改这样的代码,改为使用DataTable(警告,不测试):

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

你不应该像这样使用DataReader,执行单个Read来获取第一个记录中的值,然后将UI控件绑定到它,如下所示:

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

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