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() 跳过记录集的第一行的主要内容,如果未能解决你的问题,请参考以下文章
Asp.net常用开发方法之DataTable/DataReader转Json格式代码