2013-03-05 58 views
12

我在Windows應用程序中使用EF,並且希望我的應用程序在某個表格中插入新記錄時執行一些任務「這些新記錄將由網站使用相同的數據庫「
我的問題是如何看這張表的變化,並得到通知,當新的記錄來了,EF可以幫助我在這種情況下?在sql數據庫中查看錶格新記錄

UPDATE: 我用的SqlDependency類以及DB

ALTER DATABASE UrDb SET ENABLE_BROKER

使用這一點,也創造了數據庫http://screencast.com/t/vrOjJbA1y服務和隊列,但我從來沒有從通知我Windows應用程序。
另外,當我在sql服務器中打開隊列它總是空的http://screencast.com/t/05UPDIwC8ck接縫,有什麼問題,但我不知道。

+0

您可能正在尋找['SqlDependency'](http://msdn.microsoft.com/zh-cn/library/system .data.sqlclient.sqldependency.aspx),並且沒有什麼內建在EF中支持這一點。 – 2013-03-05 13:37:33

+2

您是否嘗試過觸發表 – saeed 2013-03-05 13:37:56

+2

您是否認爲[使用數據庫作爲IPC](http://en.wikipedia.org/wiki/Database-as-IPC)是一種常見的反模式? – Aron 2013-03-14 06:47:08

回答

2

這裏是我的命題:

  1. 如果你能重複表添加到數據庫中,然後在這裏是一個解決方案。你有你的表1表2(副本表1)。當您向表1插入新記錄時,可以將它們與表2中的現有記錄進行比較,從而找到新記錄。經過比較,您應該將所有新記錄添加到表2。這是某種同步。這可以通過存儲過程或編程進行。

  2. 您不需要任何其他表格。您可以將所有數據存儲在應用程序緩存中,並檢查一段時間(例如5秒)是否存在緩存中不存在的任何新事件。如果它們不存在 - 在日誌或其他地方通知它們並將它們添加到緩存中。但是如果記錄太多,處理時間會大大增加+內存消耗。

  3. 如果你能夠改變分貝,那麼你可以添加像'isNew'列到你的表。當一個新的數據來自網站時,該列將是'真',你的程序可以跟蹤這一點,處理後將這個標誌設置爲每個記錄爲false。 (如果網站無法設置此標誌,則可以使用SQL TRIGGER AFTER INSERT將標誌值設置爲true。如果網站不是第三方網站,或者您不想改變什麼有)

  4. 這裏是關於EF文章改變跟蹤: http://blogs.msdn.com/b/adonet/archive/2009/06/10/poco-in-the-entity-framework-part-3-change-tracking-with-poco.aspx

但問題是,你應該檢查全表通過EF會打你的應用程序性能的變化。

下面是關於SQL Server端更改跟蹤和實施概念有用的信息: http://www.mssqltips.com/sqlservertip/1819/using-change-tracking-in-sql-server-2008/ http://msdn.microsoft.com/en-us/library/bb933994.aspx

1

如何您存儲在網站上插入交易的信息的交易表。

在插入表上,您創建一個插入觸發器,將新記錄放入事務表中。

然後你只需要你的Windows應用程序定期檢查事務表,當它發現什麼東西做你想做的事,然後清除事務表上的記錄。

它不是很優雅,但它可能會工作。我不熟悉EF,我不知道它是否有更好的解決方案。

1

請參閱更改數據捕獲,特別是sys.fn_cdc_get_max_lsn。這將創造一個尋找變化的地方。

然後,編寫一個存儲過程來輪詢該視圖。讓它捕獲以前的值,並循環尋找適合您的數據到達率的延遲WAITFOR

當程序發現最高的LSN已經改變時,讓它做一些事情。它可以選擇行(s)。它也可以只打印一條消息。然後它返回到它的投票站(因爲它)。

打印信息可能聽起來很奇怪,並不知道EF的第一件事(並且對這類事情嚴重過敏),我不知道它是否會幫助你。但原則上它應該是因爲潛在的溝通存在。

從您的應用程序調用該過程。當過程執行T-SQL PRINT(或RAISERROR)語句時,會向客戶端發送一條消息。如果它在英孚或我們如何處理它,我不能說,但它應該某處有用,因爲在一般情況下,它會顯示給用戶。在你的情況下,你的應用程序將尋找特定的消息編號或文本,並作出相應的反應。 (其他消息,當然,你想正常處理。)

這種方法非常便宜,非常簡單。它幾乎不使用服務器資源,僅在發生更改時纔將消息發送到客戶端,不使用額外的表,幾乎不依賴用戶編寫的代碼,並且可以通過查看sysprocesses來驗證它是否正在運行。

1

您可以創建一個SQLCLR觸發器用於插入表。該觸發器可以調用可以在應用程序中託管的簡單WCF服務。與觸發器的程序集需要在SQL Server中註冊。請參閱here如何操作。

另一種方法(最簡單的方法):使用普通的SQL觸發器監視表的INSERT並執行xp_cmdshell命令,如「copy nul/Y some_file_with_path.txt」您的應用程序可以使用FileSystemWatcher類來監視修改同一個文件。配置過濾器以僅監視上次訪問此特定文件。請參閱here如何操作。需要在SQL Server上定義xp_cmdshell的代理帳戶。

前段時間我面臨同樣的問題。我也無法使SQl通知工作。

相關問題