Oppure

Loading
05/05/12 9:36
ampeg
Devo notificare tramite SQL Server ad un PC remoto che un campo di una tabella è stato modificato, avrei pensato all'utilizzo della classe SQLDependency supportata dalla versione 2005 di SQl Server ed ho trovato un esempio a questo indirizzo
dreamincode.net/forums/topic/185244-using-sqldependency-to-monitor-sql-database-changes/

niente da dire, fa quello che deve fare, però non è proprio come me l'aspettavo poiché l'evento OnChange della SqlDependency viene invocato di continuo (in loop) e non solo nel caso in cui avvenga effettivamente una modifica nel campo interessato, questo rende praticamente inutilizzabile il metodo perché il datareader viene continuamente aggiornato e l'applicazione va a scatti, quindi mi chiedo che senso possa avere...
ho provato anche l'esempio proposto qua: MSDN msdn.microsoft.com/en-us/library/…(v=vs.80).aspx ma fa lo stesso orrendo effetto

c'è qualche idea per migliorare la situazione?

considerando che vorrei evitare la soluzione di un applicativo client / server per inviare la notifica e vorrei evitare di usare un Timer per verificare se il campo è stato cambiato, anche se vedendo i risultati della SqlDependency sarebbe decisamente meglio il Timer

Ultima modifica effettuata da ampeg 05/05/12 9:38
aaa
05/05/12 10:13
HeDo
secondo me c'è qualcosa di sbagliato nell'approccio al problema, descrivi meglio il tuo scenario in modo che riusciamo a darti una mano.
aaa
05/05/12 10:58
ampeg
lo scenario più o meno è questo:

ci sono 2 PC (ma possono essere di più;), uno in ufficio l'altro è in officina, i 2 PC sono in LAN aziendale

su entrambi gira un mio gestionale che usa un db SQL Server 2008 Express installato su un server, in magazzino l'operaio spara i codici a barre per le commesse che vanno in avanzamento (pre-spedizione) e gli vengono visualizzate a video in una griglia dati

successivamente un impiegato dalla postazione in ufficio emette un documento di uscita selezionando a piacere le commesse messe in avanzamento

nel momento in cui l'impiegato salva il documento si deve aggiornare a video la griglia dati del PC in officina poiché le commesse in avanzamento documentate non vengono incluse nella query

al momento l'operazione di aggiornamento in officina viene fatta manualmente cliccando su un pulsante oppure nel momento in cui viene sparato un nuovo barcode

vorrei fare in modo che l'operazione avvenga automaticamente con una notifica ad esempio immettendo in un campo creato appositamente, la data e ora di emissione del documento, in modo che chiunque si appresti a consultare la griglia dell'avanzamento non sia obbligato ad aggiornare manualmente ogni volta
aaa
05/05/12 14:10
HeDo
questo è quanto più vicino a quello che ti serve che sono riuscito a trovare
social.msdn.microsoft.com/Forums/en/transactsql/thread/…

considera che puoi scriptare il db usando il CLR, un'opzione è sfruttare questo.

il mio consiglio è quello di lasciar fare al DB il DB ed evitare di aggiungere comportamenti di questo tipo nello strato dati.

sarebbe molto più interessante che il server utilizzi un sistema push per notificare ai client l'aggiornamento dei dati. Potresti stabilire delle connessioni persistenti tra i client e il server che vengono utilizzate (dal server) per notificare i cambiamenti nei dati. La sto solo buttando lì, ma in realtà è più semplice di quanto sembri :)
aaa
06/05/12 10:01
ampeg
ho trovato un altro esempio sempre sulla SQLDependency e va alla grande, tramite un delegate viene invocato l'evento solo quando c'è la modifica effettiva

codeproject.com/Articles/12335/…

se può interessare ho riscritto e rivisitato l'esempio in vb.net

la notifica viene ricevuta solo se il dato viene modificato mentre negli esempi precedenti la notifica avveniva a prescindere
Ultima modifica effettuata da ampeg 06/05/12 10:03
aaa