SqlDependency проблема с asp.net

Я пытаюсь получить измененные значения из sqlserver с помощью функции server_broker.

мой код похож на ниже

 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);

}

когда я проверяю код через точку останова, которая вносит некоторые изменения в базу данных, он может достигнуть метода с именем 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>

Исходный код, как показано ниже:

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", поля:[{name:"Id"},{name:"Ad"},{name:"Durum"}] }),storeId:"strMasa",autoLoad:true, прокси:{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'}, слушатели: {исключение:{fn:function(прокси, ответ, операция){Ext.Msg.alert("Продукты - загрузка не удалась", operation.getError());}}}},id:"gridMasa",h восемь:580,renderTo:"App.gridMasa_Container", флекс: 1, расположение: "соответствовать", название:"MASALAR", столбцы: {идентификатор:"ColumnMxodel1", флекс: 1, пункты: [{ID:"Column5",xtype:"rownumberer", текст: "Id"}, {идентификатор:"KisxiId", скрытых: правда, флекс: 1, dataIndex: "Id", текст: "Id"}, {идентификатор:"Coluxmn2w", флекс: 1, выровнять: "центр", dataIndex: "Объявление", текст:"Masa Adı"},{id:"Столбец8",flex:1, выровнять: "центр", dataIndex: "Дурум", текст: "Дурум" "}, {идентификатор:"Column11", скрытый: правда, флекс: 1, выравнивать: "центр", dataIndex: "дурум", текст: "Твердый"}]},selModel:window.App.rowSelectioxnModel2=Ext.create("Ext.selection.RowModel",{proxyId:"rowSelectioxnModel2",selType:"rowmodel",selectedData:[{RowIndex:0}]})});});

Обновить

это как включить базу данных (sql server express 2012), которая запускает каждое изменение базы данных.

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

2 ответа

Весь код, который вы показали, является сторонним кодом ASP.Net. Сетка, показанная на клиенте, является HTML-элементом. Вам необходимо уведомить клиента об изменении. Обновление HTTP не является тривиальной проблемой, вам необходимо:

  • использовать таймер клиента и периодически опрашивать на предмет изменений
  • использовать WebSockets
  • использовать отправленные сервером события (Content-Type: text/event-stream) но это не поддерживается IE

Опрос работает, но он может облагаться налогом на сервере, особенно с большим количеством клиентов. Есть бесчисленные примеры опроса ASP.Net с использованием Ajax.

Для WebSockets требуется Windows 8/ Windows Server 2012 и IIS 8, см. Поддержка протокола WebSockets.

Возможно, вам также стоит заглянуть в SignalR, библиотеку ASP.Net, специально разработанную для отправки обновлений клиенту.

Как видите, мой ответ даже не касается темы уведомлений о запросах. Получение уведомления от БД до среднего уровня ASP.Net - это только одна часть уравнения, иSqlDependencyэто действительно правильный ответ. Но вы полностью упускаете вторую часть - отправку уведомлений из промежуточного уровня в браузер. Вам следует только уведомить браузер о том, что произошло обновление, и клиент должен обновить. Позвольте обновлению загрузить данные, используя обычное событие Page_load. использованиеSqlCacheDependency на сервер страницы, это будет автоматически кешировать результаты и обновлять кеш при любом обновлении.

Для приложения ASP.NET вы должны использовать SqlCacheDependency класс в пространстве имен System.Web.Caching; так что вам не нужно OnChange Обработчик в этом сценарии.

В этой статье объясняется, как реализовать SqlCacheDependency для клиента asp.net:

Уведомление о запросе с использованием SqlDependency и SqlCacheDependency

Тем не менее, вы упомянули, что используете SQL Server Express 2012 и в соответствии со страницей Функции, поддерживаемые выпусками SQL Server 2012 и аналогичным случаем в более старой версии SQl Server Express Использование Service Broker с Sql Server Express 2008, поскольку SQL Server 2012 Express делает не поддерживает службу посредника, вы не сможете выполнять уведомление о запросах в SQL Server 2012 Express.

Редактировать: этот абзац неверный (считайте, что страница MSDN, на которой он основан, вводит в заблуждение). Редакции Express поддерживают Service Broker и уведомления о запросах во всех версиях, начиная с SQL Server 2005. Комментарий "Только для клиентов" лучше объяснить на странице " Возможности Express SQL Server Express":

SQL Server Express поддерживает компонент Service Broker, но прямая связь между двумя серверами SQL Server Express не поддерживается.

это ограничение не влияет на уведомления о запросах.

Эти ссылки теперь являются просто информационными Обнаружение изменений с помощью SqlDependency, Создание уведомления о запросе, SqlDependency в приложении ASP.NET.

Другие вопросы по тегам