Guarda per una tabella nuovi record nel database sql

Sto usando EF in un’applicazione Windows e voglio che la mia applicazione esegua alcune attività quando un nuovo record viene inserito in una determinata tabella “questi nuovi record verranno inseriti da un sito Web utilizzando lo stesso db”
La mia domanda è come guardare questo tavolo per le modifiche e ricevere una notifica quando arriva un nuovo record e EF può aiutarmi in questo caso?

AGGIORNAMENTO: ho usato la class SqlDependency e l’ ho usata nel db

ALTER DATABASE UrDb SET ENABLE_BROKER

E anche creato un servizio e una coda nel database http://screencast.com/t/vrOjJbA1y ma non ho mai ricevuto notifiche dalla mia applicazione Windows.
Anche quando apro la coda in SQL Server è sempre vuoto http://screencast.com/t/05UPDIwC8ck sembra che ci sia qualcosa di sbagliato ma non lo so.

Ecco le mie proposte:

  1. Se sei in grado di aggiungere una tabella duplicata al database, ecco una soluzione. Hai il tuo table1 e table2 (Copy of table1 ). Quando si inseriscono nuovi record nella tabella1 , è ansible confrontarli con i record esistenti nella tabella2 e quindi trovare nuovi record. Dopo aver confrontato, devi aggiungere tutti i nuovi record a table2 . Questa è una sorta di sincronizzazione. Questo può essere fatto tramite stored proc o programmaticamente.

  2. Non hai bisogno di altri tavoli. Puoi archiviare tutti i tuoi dati nella cache dell’app e controllare con un certo periodo di tempo (ad esempio 5 secondi) ci sono nuovi eventi, che non sono presenti nella tua cache. Se non esistono, avvisali nel tuo registro o da qualche altra parte e aggiungili alla cache. Ma se ci sono troppi record, il tempo di elaborazione sarà notevolmente aumentato + consumo di memoria.

  3. Se sei in grado di cambiare db, puoi aggiungere qualcosa come la colonna ‘isNew’ al tuo tavolo. Quando un nuovo dato proviene dal sito web, la colonna sarà “true”, il tuo programma può tracciarlo e, dopo l’elaborazione, imposta questo flag su false per ogni record. (Se il sito Web non può impostare questo flag, è ansible utilizzare SQL TRIGGER AFTER INSERT per impostare il valore flag su true. Il sito Web non può nemmeno conoscere questa funzione se si tratta di un sito Web di terze parti o se non si desidera cambia qualcosa lì)

  4. Ecco l’articolo sul monitoraggio delle modifiche EF: http://blogs.msdn.com/b/adonet/archive/2009/06/10/poco-in-the-entity-framework-part-3-change-tracking-with- poco.aspx

Ma il problema è che dovresti controllare l’intera tabella per le modifiche tramite EF che colpiranno il rendimento della tua app.

Di seguito sono riportate informazioni utili sul monitoraggio delle modifiche laterali e sui concetti di implementazione di SQL Server: http://www.mssqltips.com/sqlservertip/1819/using-change-tracking-in-sql-server-2008/ http://msdn.microsoft. com / it-it / library / bb933994.aspx

Vedi Change Data Capture , in particolare sys.fn_cdc_get_max_lsn . Questo creerà un posto dove cercare cambiamenti.

Quindi, scrivere una stored procedure per eseguire il polling di quella vista. È necessario acquisire il valore precedente e cercare un cambiamento con un ritardo WAITFOR appropriato alla frequenza di arrivo dei dati.

Quando la procedura rileva che il LSN più alto è cambiato, fallo fare qualcosa. Potrebbe selezionare la riga (s). Potrebbe anche solo stampare un messaggio. Quindi torna al suo seggio elettorale (per così dire).

Stampare un messaggio può sembrare strano e, non sapendo la prima cosa su EF (ed essere gravemente allergici a queste cose) non so se ti aiuterà qui. Ma in linea di principio dovrebbe perché è presente la comunicazione di base.

Dalla tua applicazione, richiama la procedura. Quando l’istruzione T-SQL PRINT (o RAISERROR ) viene eseguita dalla procedura, un messaggio verrà inviato al client. Dove va in EF o come lo gestiresti, non posso dire, ma dovrebbe andare da qualche parte utile perché in circostanze normali sarebbe visualizzato all’utente. Nel tuo caso, la tua applicazione cercherà quel particolare numero o testo di messaggio e reagirà di conseguenza. (Altri messaggi, naturalmente, dovresti gestirli normalmente).

Questo approccio è molto economico e molto semplice. Non utilizza quasi risorse del server, invia messaggi al client solo quando si verificano cambiamenti, non utilizza tabelle aggiuntive, fa affidamento su quasi nessun codice scritto dall’utente e può essere verificato eseguendo il processo sysprocesses .

È ansible creare un trigger SQLCLR PER INSERIRE nella tabella. Questo trigger può chiamare un semplice servizio WCF che è ansible ospitare nella propria applicazione. L’assembly con il trigger deve essere registrato in SQL Server. Guarda qui come si fa.

Un altro approccio (il più semplice): usa un trigger SQL ordinario che monitora INSERT alla tabella ed esegue xp_cmdshell con un comando qualcosa come “copy nul / Y some_file_with_path.txt” L’applicazione può utilizzare la class FileSystemWatcher per controllare le modifiche allo stesso file. Configura il filtro per vedere solo l’ultimo accesso a questo particolare file. Guarda qui come si fa. L’account proxy per xp_cmdshell deve essere definito su SQL Server.

Ho affrontato lo stesso problema qualche tempo fa. Inoltre non ero in grado di far funzionare le notifiche SQl.

Un altro suggerimento è quello di utilizzare gli hook in cui si sostituiscono le SaveChanges e si esegue la logica personalizzata.

https://stackoverflow.com/a/7654423/989679 , https://github.com/kmckelvin/EFHooks/blob/master/EFHooks/HookedDbContext.cs http://thedatafarm.com/blog/data-access/objectcontext -savechanges-is-now-virtual-overridable-in-ef4 / ( archivio )

Che ne dici di una tabella delle transazioni in cui memorizzi le informazioni della transazione inserite dal sito web.

Nella tabella di inserimento viene creato un trigger per l’inserimento che inserisce un nuovo record nella tabella delle transazioni.

Quindi hai solo bisogno dell’app di Windows per controllare periodicamente la tabella delle transazioni, quando trova qualcosa che fa ciò che vuoi e poi cancella il record sulla tabella delle transazioni.

Non è molto elegante, ma potrebbe funzionare. Non ho familiarità con EF e non so se ha una soluzione migliore per questo.

O utilizzare SqlTableDependency: https://tabledependency.codeplex.com/ . Questo componente open source ti invia un evento con informazioni dettagliate sui dettagli della nuova riga nella tabella