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

Scr*_*ppy 1 vb.net asp.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
Run Code Online (Sandbox Code Playgroud)

我想要么必须有除 Read 之外的另一种方法,要么有一种方法可以阻止它跳过第一条记录?

osc*_*tin 5

我从未见过将数据读取器用作数据源。我认为正在发生的是,您的第一个呼叫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
Run Code Online (Sandbox Code Playgroud)