3 回答

TA貢獻2080條經驗 獲得超4個贊
using 的一般用例SqlDependency
是檢測您希望緩存的不經常更改的數據更改,但還需要知道它是否確實更改,以便您可以刷新緩存而無需輪詢數據庫。您的情況略有不同,因為您真的不想知道該查詢的結果何時發生變化......您想知道某個查詢何時包含要處理的結果。當狀態代碼從“NEW”更改為 AND 時您收到通知的原因是因為這兩種類型的更改都會改變查詢結果。它根據兩種變化添加和減去整行。
如果您只使用狀態代碼“NEW”和“DONE”,并且保證它們始終啟動為“NEW”并且只前進到“DONE”(并且永遠不會返回),那么解決方法可能是使用此查詢:
SELECT [OrderID] FROM [JJ].[Orders] WHERE [Status] <= 'NEW'
這樣,在狀態“NEW”中添加的新項目將更改查詢結果......但是當它移動到“DONE”時,它仍然會OrderID
在查詢中返回,并且不應觸發更改事件。如果你有更多的狀態值,你會進步……你可以考慮在你的狀態欄中使用一個整數來表示進步。例如 0 表示新的,1 表示進行中,2 完成...等。
聽起來您正在嘗試創建某種待完成的工作隊列,并且還有其他方法可以執行此類操作。有 SQL Server 更改跟蹤和數據更改跟蹤、觸發器、Service Broker 隊列和許多其他隊列技術。您可能會檢查它們以及您的體系結構的選項。

TA貢獻1780條經驗 獲得超5個贊
請問您為什么要在 c# 中為上下文重新發明 SQL 觸發器? https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-2017
最簡單的解決方案是在表本身捕獲它,而不是通過會產生誤報的查詢。
或者,如果您通過存儲庫層運行所有代碼,那么您應該能夠將 INSERT 與 UPDATE 區分開來,并從那里選擇它。

TA貢獻1868條經驗 獲得超4個贊
我認為只要表中有任何插入/更新/刪除,就會觸發 SqlDependency 事件。
沒有辦法阻止它。
您可以在事件中捕獲適當的通知類型并開始工作。
void OnDependencyChange(object sender,
SqlNotificationEventArgs e)
{
if (e.Info == SqlNotificationInfo.Insert)
}
我沒有嘗試過的其他方式,
創建另一個表OrdersCopy ,它是[JJ].[Orders]
在訂單表中創建插入觸發器。
只要在 Order 表中有插入,觸發器就會觸發。將新記錄插入OrdersCopy
這里做如下改動,把表名改成OrderCopy
string sqlCommandText = "SELECT [Symbol] FROM [JJ].[OrdersCopy] WHERE [Status] = 'NEW'";
對于實驗搖晃,您可以嘗試一次。
OnDependencyChange事件只會在插入的情況下觸發。
- 3 回答
- 0 關注
- 133 瀏覽
添加回答
舉報