我想在确定输入到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之外的其他方法或停止跳过第一条记录的方法?
答案 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()
的调用,看看它是如何工作的。