与asp.net的SqlDependency问题

我正在尝试使用server_brokerfunction从sqlserver获取更改的值。

我的代码如下

protected void Page_Load(object sender, EventArgs e) { GetData2(); } private void GetData2() { List lst = new List(); using (SqlConnection con = Baglan.Sql) { string sql = "SELECT [Id],[Ad],[Durum] FROM [dbo].[Masa]"; using (SqlCommand cmd = new SqlCommand(sql, con)) { con.Open(); SqlDependency dependency = new SqlDependency(cmd); dependency.OnChange += new OnChangeEventHandler(dependency_OnDataChangedDelegate); using (IDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { while (reader.Read()) { Masa alt = new Masa { Ad = reader["Ad"].ToString(), Id = reader["Id"].ToString(), Durum = reader["Durum"].ToString() }; lst.Add(alt); } gridMasa.GetStore().DataSource = lst; gridMasa.GetStore().DataBind(); } } } } public void dependency_OnDataChangedDelegate(object sender, SqlNotificationEventArgs e) { GetData2(); SqlDependency dependency = sender as SqlDependency; dependency.OnChange -= new OnChangeEventHandler(dependency_OnDataChangedDelegate); } 

当我通过断点检查代码时,我对数据库进行了一些更改,它可以到达名为dependency_OnDataChangedDelegate的方法,但我的数据网格没有看到变化。 我在哪里做错了?

我的页面来源如下:

                                          

源代码如下:

Ext.net.ResourceMgr.init({ID: “mymanager”,aspForm: “form1中”}); Ext.onReady(function(){Ext.create(“Ext.grid.Panel”,{store:{model:Ext.define(“App.Model1”,{extend:“Ext.data.Model”,fields:[ {name:“Id”},{name:“Ad”},{name:“Durum”}}}),storeId:“strMasa”,autoLoad:true,proxy:{data:[{“Id”:“8 “,”Ad“:”44448989“,”Durum“:”2“},{”Id“:”9“,”Ad“:”MASA 55i“,”Durum“:”1“},{”Id“ :“12”,“Ad”:“MASA 3”,“Durum”:“1”},{“Id”:“44”,“Ad”:“MASA 4”,“Durum”:“1”}, {“Id”:“45”,“Ad”:“MASA 5”,“Durum”:“1”},{“Id”:“46”,“Ad”:“MASA 6”,“Durum”:“ -1“},{”Id“:”47“,”Ad“:”MASA 7“,”Durum“:” – 1“},{”Id“:”48“,”Ad“:”MASA 8“ ,“Durum”:“ – 1”},{“Id”:“49”,“Ad”:“MASA 9”,“Durum”:“1”},{“Id”:“51”,“Ad” :“MASA 10”,“Durum”:“2”},{“Id”:“52”,“Ad”:“MASA 11”,“Durum”:“ – 1”},{“Id”:“53 “,”Ad“:”MASA 12“,”Durum“:” – 1“},{”Id“:”54“,”Ad“:”MASA 13“,”Durum“:” – 1“},{ “Id”:“55”,“Ad”:“MASA 14”,“Durum”:“ – 1”},{“Id”:“56”,“Ad”:“MASA 15”,“Durum”:“ -1“},{”Id“:”57“,”Ad“:”MASA 166“,”Durum“:” – 1“}],输入:’memory’},听众:{exception:{fn:function (代理,响应,操作){Ext.Msg.alert(’Products – Load failed’,operation.getError());}}}},id:“gridMasa”,h 八:580,renderTo: “App.gridMasa_Container”,软硬度:1,布局: “适合”,标题: “MASALAR”,列:{ID: “ColumnMxodel1”,软硬度:1,项目:[{ID: “Column5” ,的xtype: “rownumberer”,文: “ID”},{ID: “KisxiId”,隐藏的:真正的,柔性:1,dataIndex: “ID”,文: “ID”},{ID: “Coluxmn2w”,柔性:1,align:“center”,dataIndex:“Ad”,text:“MasaAdı”},{id:“Column8”,flex:1,align:“center”,dataIndex:“Durum”,text:“Durum “},{ID:” Column11″ ,隐藏的:真,挠曲:1,对齐: “中心”,dataIndex: “硬粒”,文字: “硬粒”}]},selModel:window.App.rowSelectioxnModel2 = Ext.create ( “Ext.selection.RowModel”,{proxyId: “rowSelectioxnModel2”,selType: “rowmodel”,selectedData:[{rowIndex位置:0}]})});});

更新

这是如何启用数据库(sql server express 2012)哪些triger每次更改发生的数据库。

 alter database [Your database name here] set enable_broker with rollback immediate select name, is_broker_enabled from sys.databases 

在此处输入图像描述

您显示的所有代码都是ASP.Net端代码。 网格显示在客户端上,是一个HTML元素。 您需要通知客户更改。 HTTP刷新不是一个小问题,您必须:

  • 使用客户端的计时器并定期轮询更改
  • 使用WebSockets
  • 使用服务器发送事件 ( Content-Type: text/event-stream )但IE不支持此function

轮询工作但它可能会对服务器造成负担,特别是对于大量客户端。 有无数使用Ajax的ASP.Net支持轮询的例子。

WebSockets需要Windows 8 / Windows Server 2012和IIS 8,请参阅支持WebSockets协议

您可能还应该查看SignalR ,它是一个ASP.Net库,专门用于将更新推送到客户端的开发人员。

如您所见,我的答案甚至没有涉及查询通知的主题。 从数据库到ASP.Net中间层获取通知只是方程式的一部分,而SqlDependency确实是正确的答案。 但是你完全错过了第二部分,即从中间层向浏览器推送通知。 您应该只通知浏览器更新发生且客户端应该刷新。 让刷新使用通常的Page_load事件加载数据。 使用SqlCacheDependency来服务页面,这将自动缓存结果并刷新任何更新的缓存

对于ASP.NET应用程序,您必须在名称空间System.Web.Caching使用SqlCacheDependency类; 所以在这种情况下你不需要OnChange处理程序。

本文介绍如何为asp.net客户端实现SqlCacheDependency:

使用SqlDependency和SqlCacheDependency查询通知

但是,您已经提到过您正在使用SQL Server Express 2012并根据SQL Server 2012版本支持的页面function以及旧SQl Server Express版本中使用Service Broker和Sql Server Express 2008的类似情况,因为SQL Server 2012 Express 确实如此不支持代理服务 ,您将无法在SQL Server 2012 Express中执行查询通知。

编辑:此段落不正确(因为MSDN页面基于误导性而导致)。 在SQL Server 2005之后的所有版本上,Express版本都支持Service Broker和Query Notifications。在“Express SQL Server Expressfunction”页面上可以更好地解释“仅客户端”注释:

SQL Server Express支持Service Broker,但不支持两个SQL Server Express服务器之间的直接通信

此限制不会影响查询通知。

这些引用现在仅仅是在ASP.NET应用程序中 使用SqlDependency , 创建查询通知 , SqlDependency等信息检测更改 。