asp.net的SqlDependency问题

sak*_*kir 6 c# sql-server asp.net sqldependency ext.net

我正在尝试使用server_broker功能从sqlserver获取更改的值.

我的代码如下

 protected void Page_Load(object sender, EventArgs e)
{
    GetData2();

}
private void GetData2()
{
    List<Masa> lst = new List<Masa>();
    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);

}
Run Code Online (Sandbox Code Playgroud)

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

我的页面来源如下:

 <ext:ResourceManager runat="server" ID="mymanager"></ext:ResourceManager>
<ext:GridPanel runat="server"  ID="gridMasa" Title="MASALAR" Height="580" Layout="FitLayout" Flex="1"
                        IDMode="Static">

                        <Store>
                            <ext:Store ID="strMasa" runat="server">

                                <Model>
                                    <ext:Model ID="Model1" runat="server">
                                        <Fields>
                                            <ext:ModelField Name="Id" />
                                            <ext:ModelField Name="Ad" />
                                            <ext:ModelField Name="Durum" />
                                        </Fields>
                                    </ext:Model>
                                </Model>
                                <Listeners>
                                    <Exception Handler="Ext.Msg.alert('Products - Load failed', operation.getError());" />
                                </Listeners>
                            </ext:Store>
                        </Store>

                        <ColumnModel ID="ColumnMxodel1" Flex="1" runat="server">
                            <Columns>

                                <ext:RowNumbererColumn ID="Column5" runat="server" Text="Id" 
                                    >
                                </ext:RowNumbererColumn>

                                <ext:Column ID="KisxiId" runat="server" Hidden="true" Text="Id" DataIndex="Id" 
                                    Flex="1">
                                </ext:Column>
                                <ext:Column ID="Coluxmn2w" runat="server" Text="Masa Ad?" Flex="1" Align="Center" DataIndex="Ad">

                                </ext:Column>
                                   <ext:Column ID="Column8" runat="server" Text="Durum" Flex="1" Align="Center" DataIndex="Durum">

                                </ext:Column>
                                      <ext:Column ID="Column11" Hidden="true" runat="server" Text="Durum" Flex="1" Align="Center" DataIndex="Durum">

                                </ext:Column>

                            </Columns>
                        </ColumnModel>
                        <SelectionModel>
                            <ext:RowSelectionModel ID="rowSelectioxnModel2" ClientIDMode="Static" runat="server">
                                <SelectedRows>
                                    <ext:SelectedRow RowIndex="0"></ext:SelectedRow>
                                </SelectedRows>


                            </ext:RowSelectionModel>
                        </SelectionModel>

                    </ext:GridPanel>
Run Code Online (Sandbox Code Playgroud)

源代码如下:

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 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Rem*_*anu 6

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

  • 使用客户端的计时器并定期轮询更改
  • 使用WebSockets
  • 使用Server-Sent Events(Content-Type: text/event-stream)但IE不支持此功能

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

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

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

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