2010-02-22 44 views
0

我不能得到的SqlCacheDependency與一個簡單的存儲過程(SQL Server 2008中)工作:SQL緩存依賴與存儲過程的工作

create proc dbo.spGetPeteTest 
as 

set ANSI_NULLS ON 
set ANSI_PADDING ON 
set ANSI_WARNINGS ON 
set CONCAT_NULL_YIELDS_NULL ON 
set QUOTED_IDENTIFIER ON 
set NUMERIC_ROUNDABORT OFF 
set ARITHABORT ON 

select Id, Artist, Album 
from dbo.PeteTest 

這是我的ASP.NET代碼(3.5框架):

-- global.asax 
    protected void Application_Start(object sender, EventArgs e) 
{ 
    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString; 
    System.Data.SqlClient.SqlDependency.Start(connectionString); 
} 

-- Code-Behind 
private DataTable GetAlbums() 
{ 
    string connectionString = 
    System.Configuration.ConfigurationManager.ConnectionStrings["UnigoConnection"].ConnectionString; 

    DataTable dtAlbums = new DataTable(); 

    using (SqlConnection connection = 
     new SqlConnection(connectionString)) 
    { 
    // Works using select statement, but NOT SP with same text 
    //SqlCommand command = new SqlCommand(
    // "select Id, Artist, Album from dbo.PeteTest", connection); 
    SqlCommand command = new SqlCommand(); 
    command.Connection = connection; 
    command.CommandType = CommandType.StoredProcedure; 
    command.CommandText = "dbo.spGetPeteTest"; 


    System.Web.Caching.SqlCacheDependency new_dependency = 
     new System.Web.Caching.SqlCacheDependency(command); 


    SqlDataAdapter DA1 = new SqlDataAdapter(); 
    DA1.SelectCommand = command; 

    DataSet DS1 = new DataSet(); 

    DA1.Fill(DS1); 

    dtAlbums = DS1.Tables[0]; 

    Cache.Insert("Albums", dtAlbums, new_dependency); 
    } 

    return dtAlbums; 

} 

任何人都有得到這與SPs合作的運氣? 謝謝!

回答

1

我想通了這一點,需要設置查詢選項之前創建的SP。得到它的工作時,我創建SP如下:

USE [MyDatabase] 
GO 

set ANSI_NULLS ON 
set ANSI_PADDING ON 
set ANSI_WARNINGS ON 
set CONCAT_NULL_YIELDS_NULL ON 
set QUOTED_IDENTIFIER ON 
set NUMERIC_ROUNDABORT OFF 
set ARITHABORT ON 
go 


create proc [dbo].[spGetPeteTest] 
as 

select Id, Artist, Album 
from dbo.PeteTest 

GO 
0

您不是每次都從緩存中返回數據。它應該是這樣的:

if (Cache["Albums"]!=null) 
{ 
    return (DataTable) Cache["Albums"]; 
} 
else 
{ 
    // you need to write coding from database. 
} 
+0

是的,我打電話如下: DataTable dtAlbums =(DataTable)Cache.Get(「Albums」); if(dtAlbums == null) { dtAlbums = GetAlbums(); } GridView1.DataSource = dtAlbums。默認視圖; GridView1.DataBind(); 如果我使用select命令,GetAlbums()方法正在工作,例如從PeteTest中選擇ID,藝術家,專輯。但是,當相同的select語句包裝在SP中時,緩存不起作用。 – pjacko

0

對於我在存儲過程中使用這樣的東西沒有奏效。

select id, name from dbo.tblTable; 

我不得不明確地把這樣的參考文獻。如果你使用select *

select dbo.tblTable.id, dbo.tblTable.name from dbo.tblTable; 
0

SQL緩存將無法正常工作,你也需要確保你把dbo(或相關的架構)在表名的前面。 您還可以檢查SQL事件探查器來驗證,如果你的sql運行,希望會幫助你等等....

0

另一個原因可能是這一個SQL語句:

AND dbo.[PublishDate] <= GetDate() 

的SqlCacheDependency將表現就好像基礎數據已經改變,即使它沒有改變,因爲GetDate()是動態的(同樣如果你通過@parameter傳遞DateTime.Now的話)。

對於我來說,在重新編寫我的proc後,遵循上面的所有好建議,同樣不會忘記同時從proc中刪除「SET NOCOUNT ON」,這對我來說並不明顯。 SQLCacheDependency如果數據更改過期緩存查詢參數值更改,這是有道理的我想。你不能用(NOLOCK)

在存儲過程

或依賴使用

0

注意仍將不斷無效。 這似乎並沒有在文檔中就提到我可以告訴

我意識到,原來的海報沒有做到這一點,但沒有人來這裏已經在標題中所述問題可能已經這樣做了,所以我認爲這值得一提。