2012-09-11 37 views
1

我已經創建了一個應用程序來將短信文本存儲到數據庫表中。由於我無法預測何時會收到短信,我需要找到一種方法來在數據庫表中添加新行時收到通知。我正在使用MSSQLServer 2005和使用C#的Windows窗體應用程序。有人可以建議我這樣做嗎?謝謝。在插入新數據庫行後獲取警報。

+1

想必當你說「通知」你的意思是C#應用程序? – PeteH

+0

@Pete是的,它意味着C#應用程序。 – MWH

+0

然後查看我的答案。希望鏈接中的代碼片段包含一些對您有用的內容。我爲這些客戶端設計並提供了一個警報組件,並將其用於許多應用程序,其中服務器希望激發客戶端。我最初爲UDP構建它(更輕量級),但它將其擴展到tcp/ip,並將其用於其兩個站點。 – PeteH

回答

0

我用c#中的計時器對象來定期檢查新的數據庫更新。謝謝大家的答案。

2

您可以使用triggers結合DatabaseMail發送電子郵件以提醒您。

+0

數據庫觸發器是否有害? http://stackoverflow.com/questions/460316/are-database-triggers-evil –

+2

他們有他們的用途,並在當前的情況下,即發送警報,我會認爲他們是有用的。當數據通過它們改變時會出現併發症。 – saj

+1

@DennisTraub:我要在這裏出現一個肢體,並說如果使用得當,觸發器是非常合適的,並且每個說法都不是**惡**。他們可以被濫用嗎?你打賭!但是,一切都可以被濫用,許多情況可以通過遵循http://en.wikipedia.org/wiki/Law_of_the_instrument來實現。遠離這將幫助您找到解決問題的正確技術。 –

0

這個最適合的解決方案是TRIGGER插入

0

後,您不提供足夠的細節你問題,但我假設你的意思是一行被插入數據庫(以某種方式),你想讓C#應用程序知道它? (否則,就像很多其他人所說的那樣使用觸發器)

在這些情況下,我會考慮讓數據庫通過udp或tcp/ip發送某種「ping」,然後在您的應用程序中寫入相應的偵聽器組件c#應用程序。

我GOOGLE了這一點,一些相關的鏈接顯示爲http://www.codeproject.com/Articles/8973/SQL-Server-extended-stored-procedure-to-send-UDP-mhttp://lamahashim.blogspot.co.uk/2009/06/using-c-udpclient-send-and-receive.html

如果採取這種方法,您需要知道這可能會阻止任何通訊科防火牆問題等等,你可能還需要考慮之類的東西等等。「當C#應用程序沒有運行會發生什麼」

1

不能使用觸發器,儘管絕大多數話音利於這種錯誤的方式,至少不是直接通知應用程序。觸發器根本無法連接到應用程序以通知更改,像'使用套接字'或'使用郵件'這樣的解決方案最多也是天真的,它們在真實世界的條件下失敗了。

你有三個基本的選擇:

  • 池更改。最容易實現,只需定期查詢是否出現新記錄。缺點是1)有時很難檢測到這種變化,這取決於你的數據模型模式和2)在等待時間和負載之間很難實現平衡,你應該多久進行一次輪詢。

  • 通知形成的插入應用程序。這些記錄是通過應用程序插入的,具有插入記錄的代碼也會通知您的應用程序。需要更改通常不受您控制的代碼。

  • 使用Query Notifications

第四個選擇是使用觸發器將消息發送到本地隊列,並在後臺在WAITFOR(RECEIVE...)應用奉獻等待(這是不一樣的輪詢),但是這更好地利用查詢完成通知和SqlDependency

+0

@Pete:tcp/udp的問題有很多種:1.安全性(從客戶端認證和授權,它*是服務器SP發送通知,而不是流氓進程)2. NAT穿越(從服務器連接到客戶端)3.可用性(由於網絡故障導致的SP故障)。你在你的文章中提到了一些這些問題,並認爲這一點。我已經看到了嘗試這種方法,他們*似乎*工作,直到他們開始失敗。添加的耦合引入級聯失敗,並且很難排除故障。 –

+0

@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將服務器與客戶端分離,主要是避免可用性問題。 –

+0

現在我同意了,我是消息傳遞的忠實粉絲,事實上任何有助於將事物彼此分離的東西。事實上,在Oracle環境中,我們存儲過程會觸發由.net監聽器產生的AQ消息 - 這是控制它所屬業務層的一種絕妙方式。 udp中的主要因素,然後隊列中的tcp/ip是輕量級的。 – PeteH

相關問題