2012-01-30 154 views
1

有人可以告訴我爲什麼這不會工作嗎?如果我把測試函數放到後面的代碼中,它可以正常工作。如果我把它放到測試類中,數據總是一無所獲。緩存共享類中的數據

Partial Class _Default 
Inherits System.Web.UI.Page 

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load 
    ASPxGridView1.DataSource = TestClass.Test() 
    ASPxGridView1.DataBind() 
    ASPxLabel1.Text = Now 
End Sub 
End Class 

Public Class TestClass 
Public Shared Function Test() As DataTable 
    Test = DirectCast(HttpContext.Current.Cache("Test"), DataTable) 
    If Test Is Nothing Then 
     Dim sql As String = "SELECT field1,field2,field3 FROM test " 
     Using conn As New SqlConnection(Materials.Conn) 
      Using cmd As New SqlCommand(sql, conn) 
       Dim dep As New SqlCacheDependency(cmd) 
       Test = New DataTable 
       conn.Open() 
       Test.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
       HttpContext.Current.Cache.Insert("Test", Test, dep, Cache.NoAbsoluteExpiration, TimeSpan.FromHours(24)) 
      End Using 
     End Using 
    End If 
End Function 
End Class 
+0

你嘗試過傳遞null而不是那個「dep」嗎? – 2012-01-30 16:54:28

+0

HttpContext對象是否存在於測試類中的任何有意義的意義上,即那些存在於非常難以測試的ASP.NET WebForms中的醜陋框架對象之一。 – 2012-01-30 16:57:27

+0

這工作,但我想有依賴。我想那麼我的問題是爲什麼不會在共享函數緩存依賴工作。 – jocoder 2012-01-30 16:59:40

回答

1

您必須返回一些DataTable值!

更新:我加了SqlDependency.Start(connstring)在沒有這條線的情況下你應該看到錯誤。這表明測試是沒有什麼

Public Class TestClass 
Public Shared Function Test() As DataTable 
    Test = DirectCast(HttpContext.Current.Cache("Test"), DataTable) 
    If Test Is Nothing Then 
     Dim sql As String = "SELECT * from categories" 
     Dim constring As String = ConfigurationManager.ConnectionStrings("HalloweenConnectionString").ConnectionString 
     Using conn As New SqlConnection(constring) 
      Using cmd As New SqlCommand(sql, conn) 
       Dim dep As New SqlCacheDependency(cmd) 
       SqlDependency.Start(constring) 
       Test = New DataTable 
       conn.Open() 
       Test.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
       HttpContext.Current.Cache.Insert("Test", Test, dep, Cache.NoAbsoluteExpiration, TimeSpan.FromHours(24)) 
      End Using 
     End Using 
    End If 
End Function 

末級

+0

返回數據不是問題。如果將函數本身視爲表格,則不必返回。即Test.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection)) – jocoder 2012-01-30 17:13:26

+0

@ jocoder-你是對的,我認爲這是一個變量! – Mubarek 2012-01-30 17:28:46

+0

更新,試試吧! – Mubarek 2012-01-30 17:42:43

0

這是我怎麼會做這件事。我還不清楚爲什麼我必須通過sqlcachedepency。

Partial Class _Default 
Inherits System.Web.UI.Page 
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load 
    Dim dep As SqlCacheDependency = Nothing 
    ASPxGridView1.DataSource = TestClass.Test(dep) 
    ASPxGridView1.DataBind() 
    ASPxLabel1.Text = Now 
End Sub 
End Class 

Public Class TestClass 
Public Shared Function Test(ByRef dep As SqlCacheDependency) As DataTable 
    Test = DirectCast(HttpRuntime.Cache("Test"), DataTable) 
    If Test Is Nothing Then 
     Dim sql As String = "SELECT field1,field2,field3 FROM test " 
     Using conn As New SqlConnection(Materials.Conn) 
      Using cmd As New SqlCommand(sql, conn) 
       dep = New SqlCacheDependency(cmd) 
       Test = New DataTable 
       conn.Open() 
       Test.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
       HttpRuntime.Cache.Insert("Test", Test, dep, Cache.NoAbsoluteExpiration, TimeSpan.FromHours(24)) 
      End Using 
     End Using 
    End If 
End Function 
End Class