亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

僅當具有特定列值的新行插入到 MS SQL 中時才觸發 C# 依賴關系

僅當具有特定列值的新行插入到 MS SQL 中時才觸發 C# 依賴關系

C#
繁花不似錦 2022-11-13 14:45:07
當使用特定列值將新行插入到 MS SQL 中時,我想收到一個“更改”事件。下面是我目前使用的代碼,它工作得很好,除了它會在 [Status] 列中的任何行值更改為/或從“NEW”時觸發一個事件。public void InitialiseDependencyWORK(Action onDependencyMethod){    this.onDependencyMethod = onDependencyMethod;    string sqlCommandText = "SELECT [Symbol] FROM [JJ].[Orders] WHERE [Status] = 'NEW'";    using (SqlCommand command = new SqlCommand(sqlCommandText, conn))    {        Dependency = new SqlDependency(command);        Dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);        using (SqlDataReader reader = command.ExecuteReader())        {            // Process the DataReader.        }    }}void OnDependencyChange(object sender,   SqlNotificationEventArgs e){    // Handles NEW rows}我只對使用 [Status] = "NEW" 插入新行感興趣,但是當沒有新插入但 [Status] 已從“NEW”更改為其他任何內容時,此事件也會觸發。如何只有在有新的插入時才得到觸發事件?我想在插入新聞行時收到觸發事件,如下面的第 2 行:OrderID, Status 1,Done 2,NEW 我不希望它觸發,因為第 2 行剛剛更新了其狀態 - 實際上沒有要處理的新行:OrderID, Status1,Done2,Done我怎樣才能做到這一點?
查看完整描述

3 回答

?
犯罪嫌疑人X

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 隊列和許多其他隊列技術。您可能會檢查它們以及您的體系結構的選項。


查看完整回答
反對 回復 2022-11-13
?
翻閱古今

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 區分開來,并從那里選擇它。


查看完整回答
反對 回復 2022-11-13
?
MYYA

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事件只會在插入的情況下觸發。


查看完整回答
反對 回復 2022-11-13
  • 3 回答
  • 0 關注
  • 133 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號