有個小項目(后來由另一個小組以Java開發了),內容是監控一個Oracle數據庫。如果其中一個表A有數據變動,則需要將相關內容重組后通過接口發送給B。
通常的解決辦法是定時查詢,時間間隔可以小一點,還可以加上時間戳之類的,減少查詢量。在與經常訪問數據庫的同事聊的過程,發現通過監聽數據庫的變動也是一種可行方案,於是准備嘗試一下。
查了一下,.Net對自己家SQL Server的監聽用的是SQLDependency類,而Oracle的相應實現則是OracleDependency類,這個應該是ODP.Net的一部分。
操作流程如下:
- 安裝Oracle Developer Tools for Visual Studio
下載頁面時https://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html,下載前請確認自己的Visual Studio版本,我的2015;
2. 在VS中創建項目,並利用NuGet包管理器安裝Oracle.ManagedDataAccess
3. 完善配置文件(特別是連接串)
創建ADO.Net實體模型,選擇Oracle 數據庫 (ODP.NET, 托管驅動程序),然后選擇TN或者ET方式鏈接。果是ET方式,輸入服務器、端口、用戶名和密碼,創建成功后,連接字符串就自動設置好了;
4. 創建命令並設置監聽如下
其中Properties.Settings.Default.OracleDevConnStr是連接字符串名字
OracleConnection con1 = new OracleConnection(Properties.Settings.Default.OracleDevConnStr); var sql = "select * from ZQ"; OracleCommand cmd1 = new OracleCommand(sql, con1); con1.Open(); cmd1.AddRowid = true; OracleDependency dep = new OracleDependency(cmd1); cmd1.Notification.IsNotifiedOnce = false; dep.OnChange += OnDbChange;
5. 處理OnDbChange事件
private void OnDbChange(object sender, OracleNotificationEventArgs eventArgs) { //TODO:... }
此外,如果閱讀英文無障礙,可以查看如下鏈接https://www.oracle.com/webfolder/technetwork/tutorials/obe/db/hol08/dotnet/changenotification/odpnetchg_otn.htm。