Странная проблема с ретранслятором и кэшированным набором данных - показана только последняя строка - PullRequest
0 голосов
/ 13 января 2012

У меня есть относительно простой фрагмент кода:

        Dim oShow As DataSet = Nothing
        Dim cacheKey As String = String.Format("AsyncCacheFor_agenda_{0}", ShowID)

        If Not IsNothing(Cache(cacheKey)) Then
            oShow = DirectCast(Cache(cacheKey), DataSet)
        Else
            oShow = DataServers.dsTMW.GetAgenda(ShowID, 0, "", 0, True)
            Cache.Insert(cacheKey, oShow, Nothing, System.Web.Caching.Cache.NoAbsoluteExpiration, New TimeSpan(1, 0, 0))
        End If
        phSearch.Visible = True


        oShowRow = oShow.Tables(0).Rows(0)


        oTracks = oShow.Tables(1)
        oSearchResults = oShow.Tables(5)


        If Not IsNothing(oSearchResults) AndAlso oSearchResults.Rows.Count > 0 Then
            rptSearch.Visible = True
            phNoResults.Visible = False
            rptSearch.DataSource = oSearchResults
            rptSearch.DataBind()
        Else
            rptSearch.Visible = False
            phNoResults.Visible = True

        End If

«rptSearch» - это Repeater, а метод GetAgenda() считывает набор данных из базы данных с помощью хранимой процедуры. Этот набор данных имеет 6 разных таблиц. Когда набор данных считывается из базы данных, Repeater отображает 36 строк, ожидаемый результат. Когда он читается из кэша, он отображает только одну строку, последнюю. Странно то, что при отладке я вижу oSearchResults.Rows.Count = 36 в обоих случаях.

Кто-нибудь знает, почему это может произойти?

Ответы [ 2 ]

0 голосов
/ 16 января 2012

Я разобрался в проблеме.Я делал это в событии ItemDataBound:

Dim dvRows As DataView = oSearchResults.DefaultView
dvRows.RowFilter = String.Format("Submission_id={0} AND speaker_id Is Not Null", oRow("Submission_id"))

Как только я изменил это на:

Dim dvRows As DataView = oSearchResults.Copy().DefaultView

Проблема ушла.Интересно, почему это было проблемой только при кэшировании?

0 голосов
/ 13 января 2012

Чтобы действительно увидеть, имеет ли это какое-либо отношение к кешу, старайтесь всегда использовать набор данных из кеша.На проверке, чтобы увидеть, находится ли он в кеше, вместо того, чтобы взять и получить набор данных, а затем использовать его, возьмите его, поместите в кеш, а затем используйте.

Итак, вместо этого:

If Not IsNothing(Cache(cacheKey)) Then
    oShow = DirectCast(Cache(cacheKey), DataSet)
Else
    oShow = DataServers.dsTMW.GetAgenda(ShowID, 0, "", 0, True)
    Cache.Insert(cacheKey, oShow, Nothing, System.Web.Caching.Cache.NoAbsoluteExpiration, New TimeSpan(1, 0, 0))
End If

Сделайте это:

If IsNothing(Cache(cacheKey)) Then
    oShow = DataServers.dsTMW.GetAgenda(ShowID, 0, "", 0, True)
    Cache.Insert(cacheKey, oShow, Nothing, System.Web.Caching.Cache.NoAbsoluteExpiration, New TimeSpan(1, 0, 0))
End If

oShow = DirectCast(Cache(cacheKey), DataSet)

Это не "исправит" вашу проблему, но сузит проблему,Если вы всегда получаете 1 строку, то вы знаете, что это связано с извлечением набора данных из кэша.Хотя, если бы мне пришлось угадывать, я бы сказал, что за пределами вашего фрагмента кода происходит что-то еще.

...