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

Posted

技术标签:

【中文标题】DataReader.Read() 跳过记录集的第一行【英文标题】:DataReader.Read() skips first row of recordset 【发布时间】:2011-11-25 12:22:18 【问题描述】:

在决定将什么输入到 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 之外的其他方法,要么有办法阻止它跳过第一条记录?

【问题讨论】:

【参考方案1】:

我从未见过将数据读取器用作数据源。我认为正在发生的事情是您对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

【讨论】:

oscilatingcretin,这与我需要的非常接近,唯一的问题是,如果行颜色 =“无”,它不能逐行计算,只有您选择的行。我将如何让它逐行解决这个问题,感谢您到目前为止的帮助 我不确定你的意思。上面的代码基本上与您的代码完全相同,但使用的是数据表而不是阅读器。您的原始代码仅对dr.Read() 进行了一次调用,因此无论如何它只能用于一次迭代。对于初学者,我的解决方案是否至少用所有数据填充您的下拉列表? 上面的代码确实填充了我的下拉菜单。但是,如果例如第一个值是“中红色”,那么它会显示每次迭代的大小和颜色,所以即使第二个值是“中无”,它也会显示“中无”而不仅仅是“中”,因为它不会对每次迭代都进行检查。同样,如果第一个值为“Medium None”,那么它将显示为“Medium”,但“Medium Red”的第二个值也只会显示为“Medium”。我基本上只需要在每次迭代时评估它,而不仅仅是第 0 行。感谢您到目前为止的帮助,非常感谢 恐怕我现在收到这个:“重载解析失败,因为没有可访问的‘添加’接受这个数量的参数。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于DataReader.Read() 跳过记录集的第一行的主要内容,如果未能解决你的问题,请参考以下文章

如何跳过有效载荷的第一行-常规

Highcharts 跳过大型数据集的共享工具提示点

基于查询结果集的PHP跳过for循环迭代

Asp.net常用开发方法之DataTable/DataReader转Json格式代码

为什么我无法将数组的第一个和最后一个记录记录到Firestore

如何跳过 CSV 中的第一行项目?