2012-01-13 10 views
0

を示す次のようにIコードの比較的単純な部分を有する:奇妙な問題 - 最後の行が

 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」はRepeaterGetAgenda()方法を介してデータベースからデータセットを読み出しますストアドプロシージャ。このデータセットには6つの異なるテーブルがあります。データセットがデータベースから読み取られると、Repeaterは36行、予想される結果を表示します。キャッシュから読み取ると、最後の1行しか表示されません。奇妙なのは、私がデバッグするとき、私は両方の場合でoSearchResults.Rows.Count = 36を見ることです。

なぜこのようなことが起こるのでしょうか?

+0

リピータのコードを入力できますか? – ivowiblo

答えて

0

問題を見つけました。私は、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

キャッシュと何か関係があるかどうかを確かめるには、常にキャッシュからデータセットを使用してみてください。キャッシュ内にあるかどうかを確認するには、データセットを取得して使用するのではなく、取得してキャッシュに入れてから使用します。むしろ、これよりもそう

、:

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) 

これはあなたの問題を "解決" ではないだろうが、それはisueを絞り込むます:

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 

はこれを行います。常に1行を取得する場合は、キャッシュからデータセットを引き出すことと関係していることがわかります。私が推測しなければならないのであれば、あなたのコードスニペットの外側に何か他のものがあると言えます。

+0

あなたのコードでさえ、すべてが最初に表示されますが、後は​​表示されません。しかし、キャッシュを完全に削除すると、毎回すべてが表示されます。 –

+0

このコードを実行した後にキャッシュを変更するものは何ですか? –