ASP.NET Core 監聽SQL Server資料庫的實時資訊
阿新 • • 發佈:2020-07-30
## 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.結尾
為什麼沒貼程式碼了,你看看我給的幾個文件就可以做出來,動手實踐才是硬道理,如果有功能實現不了的,可以給我留言!