DataReader.Read () пропускает первый ряд набора записей - PullRequest
1 голос
/ 25 ноября 2011

Я пытаюсь проверить значение поля, прежде чем решить, что вводить в раскрывающийся список в 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, или способ остановить его, пропуская первую запись?

Ответы [ 3 ]

4 голосов
/ 25 ноября 2011

Я никогда не видел, чтобы источник данных использовался в качестве источника данных.Я думаю, что происходит, когда ваш первый вызов 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
0 голосов
/ 25 ноября 2011

вы не должны использовать DataReader, как это, выполняя один Read, чтобы получить значение в первой записи, а затем привязывать к нему элемент управления UI, как это:

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

Я бы лично использовал DataTable для привязки к элементу управления пользовательского интерфейса или попытался удалить вызов на dr.Read() и посмотреть, как он работает.

0 голосов
/ 25 ноября 2011

Как насчет изменения хранимой процедуры doGetAllSizesForProduct для возврата двух наборов записей?

Первый набор записей может возвращать одну строку, указывающую, какой тип данных содержится во втором наборе записей, который содержит то же содержимое, что иранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...