2012-01-30 155 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