您需要的是启用 SqlCacheDependency 正如@RenusRusanu 提到的那样。
我的 Github 网站上有几个工作示例,请随意浏览
我的 LearningProjects 下的代码(第 3 方编辑)
您需要先配置数据库才能使用 SqlCacheDependency:
为了使用 SQL Dependency,我们需要在数据库中基本配置两件事:
创建包含在表上的数据库基础结构并存储过程,要对其进行配置,我们使用aspnet_regsql.exe
如下:
/* For SQL Server authentication... */
aspnet_regsql.exe -S server -U user -P password -d database -ed
/* For Windows Authentication... */
aspnet_regsql.exe -S server -E -d database -ed
创建轮询信息,其中包括指定要监视的表和对该表的触发器以填充所需的基础结构表
/* For SQL Server authentication... */
aspnet_regsql.exe -S server
-U user -P password -d database -t tableName -et
/* For Windows Authentication... */
aspnet_regsql.exe -S server
-E -d database -t tableName -et
代码配置
var s = new SqlCacheDependency("AdventureWorks", "Product");
HttpContext.Current.Cache.Insert(
"products",
h,
s,
Cache.NoAbsoluteExpiration,
Cache.NoSlidingExpiration);
AdventureWorks
名称为web.config文件中配置的sql依赖的名称
<caching>
<sqlCacheDependency enabled="true" pollTime="30000" >
<databases>
<add
name="AdventureWorks"
connectionStringName="AdventureWorksPolling" />
</databases>
</sqlCacheDependency>
</caching>
pollTime
可以在元素中配置,并将<add ...
覆盖全局polltime
或者,您可以依赖 SqlDataSource 控件
为了在使用此控件时启用缓存,您需要将DataSourceMode
属性设置为DataSet
. 在这种情况下,您不需要像前面解释的那样配置数据库
我刚刚上传了这个例子(完整的工作例子)
ASPX
<asp:SqlDataSource runat="server" ID="sds"
ConnectionString="<%$ConnectionStrings:pubsConnectionString %>"
CacheDuration="30"
EnableCaching="true"
SelectCommand="select * from jobs"
DataSourceMode="DataSet"
OnSelecting="sds_Selecting">
</asp:SqlDataSource>
<div>
<asp:Literal runat="server" ID="msg" Mode="Encode"></asp:Literal>
</div>
<asp:GridView runat="server" DataSourceID="sds"></asp:GridView>
编辑 1
为了在使用 SqlCacheDependency 时有选择地触发触发器,您需要更新手动生成的触发器。
使用该aspnet_regsql -t -et...
命令配置表时,会在指定表中添加触发器。此触发器负责填充AspNet_SqlCacheTablesForChangeNotification
SqlCacheDependency 对象使用的表,以轮询数据库中的数据。
触发器看起来像:
ALTER TRIGGER [dbo].[jobs_AspNet_SqlCacheNotification_Trigger] ON [dbo].[jobs]
FOR INSERT, UPDATE, DELETE AS BEGIN
SET NOCOUNT ON
EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'jobs'
END
dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedureN'jobs'
当您感兴趣的行更新时,您可以更新触发器以仅调用存储过程
我不是 SQL 专家,但我认为很容易找到一种干净的方法来检测已更改的行,例如,谷歌搜索我刚刚找到了这个链接
在 MS SQL Server 中检测列更改的最有效方法