3 回答

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

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

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