【问题标题】:DataReader.Read() skips first row of recordsetDataReader.Read() 跳过记录集的第一行
【发布时间】: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 之外的其他方法,要么有办法阻止它跳过第一条记录?

【问题讨论】:

    标签: asp.net vb.net datareader


    【解决方案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() 的调用,看看它是如何工作的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-20
        • 1970-01-01
        • 1970-01-01
        • 2014-06-07
        • 2013-08-17
        • 2013-03-08
        相关资源
        最近更新 更多