Problema SqlDependency con asp.net

Sto cercando di ottenere i valori modificati da sqlserver utilizzando la funzione server_broker.

il mio codice è come sotto

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

quando controllo il codice tramite breakpoint che apporto alcune modifiche al database, può raggiungere il metodo chiamato dependency_OnDataChangedDelegate, ma non ho visto modifiche sul mio datagrid. dove sto sbagliando ??

la mia origine della pagina è la seguente:

                                          

il codice sorgente è il seguente:

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”, campi: [ {name: “Id”}, {nome: “Annuncio”}, {nome: “Durum”}]}), storeId: “strMasa”, autoLoad: true, proxy: {dati: [{“Id”: “8 “,” Annuncio “:” 44448989 “,” Durum “:” 2 “}, {” Id “:” 9 “,” Annuncio “:” MASA 55i “,” Durum “:” 1 “}, {” Id ” : “12”, “Annuncio”: “MASA 3”, “Durum”: “1”}, {“Id”: “44”, “Annuncio”: “MASA 4”, “Durum”: “1”}, {“Id”: “45”, “Annuncio”: “MASA 5”, “Durum”: “1”}, {“Id”: “46”, “Annuncio”: “MASA 6”, “Durum”: ” -1 “}, {” Id “:” 47 “,” Annuncio “:” MASA 7 “,” Durum “:” – 1 “}, {” Id “:” 48 “,” Annuncio “:” MASA 8 ” , “Durum”: “- 1”}, {“Id”: “49”, “Annuncio”: “MASA 9”, “Durum”: “1”}, {“Id”: “51”, “Annuncio” : “MASA 10”, “Durum”: “2”}, {“Id”: “52”, “Annuncio”: “MASA 11”, “Durum”: “- 1”}, {“Id”: “53 “,” Annuncio “:” MASA 12 “,” Durum “:” – 1 “}, {” Id “:” 54 “,” Annuncio “:” MASA 13 “,” Durum “:” – 1 “}, { “Id”: “55”, “Annuncio”: “MASA 14”, “Durum”: “- 1”}, {“Id”: “56”, “Annuncio”: “MASA 15”, “Durum”: ” -1 “}, {” Id “:” 57 “,” Annuncio “:” MASA 166 “,” Durum “:” – 1 “}], digitare:” memoria “}, ascoltatori: {eccezione: {fn: funzione (proxy, risposta, operazione) {Ext.Msg.alert (‘Prodotti – Caricamento fallito’, operation.getError ());}}}}, id: “gridMasa”, h otto: 580, renderTo: “App.gridMasa_Container”, flex: 1, il layout: “fit”, titolo: “MASALAR”, le colonne: {id: “ColumnMxodel1”, flex: 1, gli elementi: [{id: “Column5” , xtype: “rownumberer”, il testo: “Id”}, {id: “KisxiId”, nascosto: vero, flex: 1, DataIndex: “Id”, il testo: “Id”}, {id: “Coluxmn2w”, flex : 1, allineare: “center”, dataIndex: “Annuncio”, testo: “Masa Adı”}, {id: “Column8”, flex: 1, allineare: “center”, dataIndex: “Durum”, testo: “Durum” “}, {id:” Column11″ , nascosto: vero, flex: 1, allineare: “centro”, DataIndex: “duro”, il testo: “duro”}]}, selModel: window.App.rowSelectioxnModel2 = Ext.create ( “Ext.selection.RowModel”, {proxyid: “rowSelectioxnModel2”, selType: “rowmodel”, selectedData: [{rowIndex: 0}]})});});

aggiornare

questo è come abilitare il database (sql server express 2012) che triga ogni modifica avvenuta nel database.

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

inserisci la descrizione dell'immagine qui

Tutto il codice che hai mostrato è il codice side ASP.Net. La griglia è mostrata sul client, è un elemento HTML. è necessario notificare al cliente la modifica. L’aggiornamento HTTP non è un problema banale, devi:

  • utilizzare un timer del client e interrogare periodicamente per le modifiche
  • utilizzare WebSockets
  • usa Eventi inviati dal server ( Content-Type: text/event-stream ) ma questo non è supportato da IE

Il polling funziona ma può essere tassato sul server, specialmente con un numero elevato di client. Esistono innumerevoli esempi di polling supportato da ASP.Net utilizzando Ajax.

WebSockets richiede Windows 8 / Windows Server 2012 e IIS 8, vedere Supporto per il protocollo WebSockets

Probabilmente dovresti anche cercare SignalR , che è una libreria ASP.Net specificamente sviluppata per spingere gli aggiornamenti al client.

Come puoi vedere, la mia risposta non tocca nemmeno l’argomento delle notifiche di query . Ottenere la notifica dal DB al livello medio ASP.Net è solo una parte dell’equazione e SqlDependency è davvero la risposta giusta. Ma ti manca completamente la seconda parte, la spinta della notifica dal mid-tier al browser. È necessario comunicare al browser che si è verificato l’aggiornamento e che il client deve essere aggiornato. Lascia che l’aggiornamento carichi i dati usando il solito evento Page_load. Utilizzare SqlCacheDependency per il server della pagina, questo memorizzerà automaticamente i risultati nella cache e aggiornerà la cache su qualsiasi aggiornamento.

Per un’applicazione ASP.NET è necessario utilizzare la class SqlCacheDependency nello spazio dei nomi System.Web.Caching ; quindi non hai bisogno del gestore di OnChange in questo scenario.

Questo articolo spiega come implementare SqlCacheDependency per un client asp.net:

Notifica delle query utilizzando SqlDependency e SqlCacheDependency

Tuttavia, hai menzionato che stai usando SQL Server Express 2012 e in base alle caratteristiche della pagina Supportato dalle edizioni di SQL Server 2012 e casi simili nella precedente versione di SQl Server Express Utilizzo di Service Broker con Sql Server Express 2008 , poiché SQL Server 2012 Express non non supporta il servizio broker , non sarà ansible eseguire la notifica delle query in SQL Server 2012 Express.

Modifica: questo paragrafo non è corretto (calcolare a causa della pagina MSDN su cui si basa è fuorviante). Le edizioni Express supportano Service Broker e le notifiche delle query, su tutte le versioni da SQL Server 2005. Il commento “Solo client” è spiegato meglio nella pagina delle caratteristiche di Express SQL Server Express :

SQL Server Express supporta Service Broker, ma la comunicazione diretta tra due server SQL Server Express non è supportata.

queste restrizioni non influiscono sulle notifiche di query.

Questi riferimenti ora sono semplicemente informazioni Rilevamento di modifiche con SqlDependency , Creazione di una notifica di query , SqlDependency in un’applicazione ASP.NET .