1. 程式人生 > >ASP.NET Core 監聽SQL Server資料庫的實時資訊

ASP.NET Core 監聽SQL Server資料庫的實時資訊

## 1.開發環境: + 開發工具:Visual Studio 2019 + 資料庫:SQL Server2012 + 開發環境:.Net Core 3.1 ## 2.使用技術: + Signalr:實現訊息推送 + SqlDependency:通過它的**OnChangeEventHandler**事件去監聽資料庫的波動【只針對SQL Serer】 + Microsoft.EntityFrameworkCore:連線資料庫 ## 3.業務邏輯(雖然最後沒做成,但是這技術我還學會了) **開發場景:** 客戶需要每一個參加展會的人,簽到時候,需要在展會的大螢幕實時顯示簽到人的資訊。 **思考:** 如果讓以前的我做,一想到就是做AJAX非同步請求資料,設定迴圈間隔時間。但是這樣會有問題,第一如果時間設定太長,無法實現實時,如果時間設定太短,會發送很多無效的請求大量佔用資源,這個時間就無法去定義。 **思路:** 此時,我在想,如果要是【有人盯著】資料庫,當資料有變化的時候,【有人通知】能通知我們,這樣豈不是完美了,敢想就敢幹,Just Doing! ## 4.使用的技術講解 ### 有人盯著: > 通過在百度海洋的搜尋,瞭解到了SqlDependency可以實現這個效果,連線資料庫之後,編寫查詢語句【有注意點,後面講】,然後使用SqlCommand初始化連線物件和執行的語句,在將SqlDependency初始化填入SqlCommand物件,然後給SqlDependency新增事件,然後執行SqlCommand命令。當資料庫的某張表資料變動,就會觸發SqlDependency新增的事件。 ### 有人通知: > Signalr可以實現推送訊息,應用程式啟動之後,瀏覽器和伺服器會建立一個連線(Signalr不懂可以百度看看原理),當伺服器有什麼需要推送的,可以推送指定的人、組,以及所有人。 ## 5.效果展示 ![](https://img2020.cnblogs.com/blog/1400941/202007/1400941-20200730143444325-229553121.gif) ## 6.注意事項 + 編寫的SQL:查詢語句中不能使用 *,表名要加[dbo].[xx] + 在你的資料庫中需要開啟BROKER: ``` ALTER DATABASE [你需要監聽的資料庫的表名稱] SET NEW_BROKER WITH ROLLBACK IMMEDIATE; ALTER DATABASE [你需要監聽的資料庫的表名稱] SET ENABLE_BROKER; ``` 在資料庫執行命上面兩個命令。 + 建立GlobalHubServer服務,使用者獲取例項物件(當我們監聽到資料庫變動的時候,我們需要通知,可以通過GlobalHubServer和我們的ChatHub實現依賴注入,這樣容器給我建立了一個例項,我們只需要注入就行了)。 + Signalr中自定義的方法,注意格式駝峰命令法 + SqlDependency需要提起開啟 ## 7.參考文件 + [利用SignalR實現實時推送資訊功能](https://www.jianshu.com/p/f8a71c0d3eb0) 他是使用ASP.NET MVC開發的,所有他有些東西,我在ASP.NET Core是用不了【GlobalHost】,這個是用來獲取例項物件,我採用是GlobalHubServer代替 + [啟用資料庫的 Service Broker](https://www.cnblogs.com/ianunspace/p/5508208.html) + [GlobalHubServer由來](https://stackoverflow.com/questions/48393429/get-hub-context-in-signalr-core-from-within-another-object) + [Get started with ASP.NET Core SignalR](https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr?view=aspnetcore-3.1&tabs=visual-studio) ## 8.不足的地方 這個只是測試程式碼,如果在實際情況中,不知道會不會出問題,打算使用Redis做快取,處理併發的請求,後面有時間寫個API,進行介面壓力測試一下效果,如果有好的方案,歡迎來探討! ## 9.結尾 為什麼沒貼程式碼了,你看看我給的幾個文件就可以做出來,動手實踐才是硬道理,如果有功能實現不了的,可以給我留言!