我已經創建了一個應用程序來將短信文本存儲到數據庫表中。由於我無法預測何時會收到短信,我需要找到一種方法來在數據庫表中添加新行時收到通知。我正在使用MSSQLServer 2005和使用C#的Windows窗體應用程序。有人可以建議我這樣做嗎?謝謝。在插入新數據庫行後獲取警報。
回答
我用c#中的計時器對象來定期檢查新的數據庫更新。謝謝大家的答案。
您可以使用triggers結合DatabaseMail
發送電子郵件以提醒您。
數據庫觸發器是否有害? http://stackoverflow.com/questions/460316/are-database-triggers-evil –
他們有他們的用途,並在當前的情況下,即發送警報,我會認爲他們是有用的。當數據通過它們改變時會出現併發症。 – saj
@DennisTraub:我要在這裏出現一個肢體,並說如果使用得當,觸發器是非常合適的,並且每個說法都不是**惡**。他們可以被濫用嗎?你打賭!但是,一切都可以被濫用,許多情況可以通過遵循http://en.wikipedia.org/wiki/Law_of_the_instrument來實現。遠離這將幫助您找到解決問題的正確技術。 –
是的,使用INSERT觸發器。
這裏是出現StackOverflow文章:SQL Server 2008 - Help writing simple INSERT Trigger
這裏是T-SQL參考:http://msdn.microsoft.com/en-us/library/ms189799.aspx
這個最適合的解決方案是TRIGGER插入
後,您不提供足夠的細節你問題,但我假設你的意思是一行被插入數據庫(以某種方式),你想讓C#應用程序知道它? (否則,就像很多其他人所說的那樣使用觸發器)
在這些情況下,我會考慮讓數據庫通過udp或tcp/ip發送某種「ping」,然後在您的應用程序中寫入相應的偵聽器組件c#應用程序。
我GOOGLE了這一點,一些相關的鏈接顯示爲http://www.codeproject.com/Articles/8973/SQL-Server-extended-stored-procedure-to-send-UDP-m和http://lamahashim.blogspot.co.uk/2009/06/using-c-udpclient-send-and-receive.html
如果採取這種方法,您需要知道這可能會阻止任何通訊科防火牆問題等等,你可能還需要考慮之類的東西等等。「當C#應用程序沒有運行會發生什麼」
不能使用觸發器,儘管絕大多數話音利於這種錯誤的方式,至少不是直接通知應用程序。觸發器根本無法連接到應用程序以通知更改,像'使用套接字'或'使用郵件'這樣的解決方案最多也是天真的,它們在真實世界的條件下失敗了。
你有三個基本的選擇:
池更改。最容易實現,只需定期查詢是否出現新記錄。缺點是1)有時很難檢測到這種變化,這取決於你的數據模型模式和2)在等待時間和負載之間很難實現平衡,你應該多久進行一次輪詢。
通知形成的插入應用程序。這些記錄是通過應用程序插入的,具有插入記錄的代碼也會通知您的應用程序。需要更改通常不受您控制的代碼。
第四個選擇是使用觸發器將消息發送到本地隊列,並在後臺在WAITFOR(RECEIVE...)
應用奉獻等待(這是不一樣的輪詢),但是這更好地利用查詢完成通知和SqlDependency
。
@Pete:tcp/udp的問題有很多種:1.安全性(從客戶端認證和授權,它*是服務器SP發送通知,而不是流氓進程)2. NAT穿越(從服務器連接到客戶端)3.可用性(由於網絡故障導致的SP故障)。你在你的文章中提到了一些這些問題,並認爲這一點。我已經看到了嘗試這種方法,他們*似乎*工作,直到他們開始失敗。添加的耦合引入級聯失敗,並且很難排除故障。 –
@Pete:至少可以考慮使用排隊技術([MSMQ](http://msdn.microsoft.com/en-us/library/windows/desktop/ms711472(v = vs.85).aspx ),[ZeroMQ](http://www.zeromq.org/),[RabbitMQ](http://www.rabbitmq.com/)等等)而不是原始的TCP將服務器與客戶端分離,主要是避免可用性問題。 –
現在我同意了,我是消息傳遞的忠實粉絲,事實上任何有助於將事物彼此分離的東西。事實上,在Oracle環境中,我們存儲過程會觸發由.net監聽器產生的AQ消息 - 這是控制它所屬業務層的一種絕妙方式。 udp中的主要因素,然後隊列中的tcp/ip是輕量級的。 – PeteH
- 1. 更新數據庫的Ajax計數警報或插入新行
- 2. 每次自動創建報警數據庫獲取新數據
- 3. 從輸入警報對話框插入數據到數據庫
- 4. C#插入MDB數據庫獲取最新插入ID
- 5. 獲取最後插入的行ID與Psycopg2和Greenplum數據庫
- 6. 如何獲取不同的行最後插入到數據庫?
- 7. 如何從wordpress數據庫獲取最後插入的行ID?
- 8. 如何在所有記錄插入到數據庫後顯示警報消息
- 9. 插入新行後獲取AUTO_INCREMENT值
- 10. 在向數據庫插入數據時,在WordPress的警報框中獲取「對象對象」錯誤消息
- 11. 數據庫插入後JTable不刷新
- 12. 獲取插入到數據庫表中的數據行
- 13. 插入數據到數據庫,然後得到的回報
- 14. 在將數據插入到數據集後進行數據庫更新
- 15. 如何獲取icinga2警報數據
- 16. Android獲取EditText行數後每插入新行
- 17. 獲取數據庫插入錯誤
- 18. 獲取插入數據庫值
- 19. 插入新數據後在JcomboBox中更新數據和數據庫數據
- 20. 插入一個Access數據庫新行
- 21. 插入新行到mysql數據庫
- 22. 新行未插入數據庫中
- 23. 無法插入新行到數據庫
- 24. 向SQL數據庫插入新行
- 25. 將新行插入數據庫java?
- 26. 如何在向數據庫插入數據後刷新JTable?
- 27. 在MySQL數據庫中插入數據後刷新JTable
- 28. Sqlite數據庫報警
- 29. 獲取有關插入行最後一個ID在Oracle數據庫
- 30. 插入到Mysql數據庫後更新數據集數據
想必當你說「通知」你的意思是C#應用程序? – PeteH
@Pete是的,它意味着C#應用程序。 – MWH
然後查看我的答案。希望鏈接中的代碼片段包含一些對您有用的內容。我爲這些客戶端設計並提供了一個警報組件,並將其用於許多應用程序,其中服務器希望激發客戶端。我最初爲UDP構建它(更輕量級),但它將其擴展到tcp/ip,並將其用於其兩個站點。 – PeteH