數據庫主動式通知編程
概述
當數據庫更新的時候,如插入,刪除,修改了數據記錄,我們的應用程序需要知道些變更,一般情況下我們會採用輪詢的方式.對數據庫不間斷性地查詢,這種方式即不能保證實時性,又非常損耗服務的性能.那麼是否有主動觸發的機制,主動通知應用程序哪些記錄做了更新呢?目前主要有兩種機制:
一,採用擴展存儲過程,使用觸發器,觸發器再調用擴展存儲過程,擴展存儲過程再把數據通過UDP的通訊方式,發送到應用程序,這樣應用程序就會收到數據庫更新的通知.
二,SQL Server2005以後的版本,其中Service Broker機制可實現此功能.
一擴展存儲過程
此方法的原理大概是這樣的:通過觸發器調用擴展存儲過程,擴展存儲過程再通過UDP的通訊方式,把信息發送到應用程序.
說詳細些,就是說,數據庫能通過觸發器來探知數據庫中某些表的增、刪、改動作,然後再調用存儲過程,存儲過程中調用寫好的擴展存儲過程,擴展存儲過程通過UDP通信方式,把數據庫發生的事情通知UDP服務端,原理就是這麼簡單。
1.創建擴展存儲過程
啓動VC++6.0-->新建VC++項目-->擴展存儲過程DLL,如圖:
點擊”OK”,在下圖的輸入框輸入擴展存儲過程名,如圖:
這裏創建完成,在工程中你將看到如下接口:
在此接口中編寫你想要的操作.大概如下:
注:把動態庫從內存中卸載的方法,執行SQL命令:DBCC動態庫名 ( FREE )//動態庫名不要帶擴展名
詳細細節見代碼,到此擴展存儲過程動態庫創建完畢.爲簡單起見,可把創建好的動態庫放在System32目錄下,這樣就是默認路徑了。
2.測試動態庫
動態庫創建好了,那麼先測試一下,在數據庫中創建擴展存儲過程,然後調用存儲過程,測試存儲過程對動態庫的調用是否成功。以下是所有創建,測試,與卸載的方法。
創建擴展存儲過程,SQL命令如下:
sp_addextendedproc ‘接口名稱,上一步驟中第二個圖片窗口輸入的名稱’, '動態庫所在路徑,可絕對路徑亦可相對路徑'
use master
go
sp_addextendedproc 'TerminalFlagSynchro','.\\TerminalFlagSynchro.dll'
//刪除過程:
sp_dropextendedproc 'TerminalFlagSynchro'
//把動態庫從內存中卸載
DBCC TerminalFlagSynchro ( FREE )
測試:
TerminalFlagSynchro 23554, '13427960374',3
3.創建觸發器
測試成功後,創建觸發器調用此過程即可.以下爲創建觸發器示例:
USESTATIC_DB
GO
/****** Object: Trigger [dbo].[CarInfoChange] Script Date: 12/09/2011 20:14:18 ******/
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
-- =============================================
-- Author: <Mingo>
-- Create date: <2011-12-10>
-- Description:<Car_info表修改觸發>
-- =============================================
alterTRIGGER[dbo].[CarInfoChange]
ON [dbo].[CAR_INFO]
forINSERT,UPDATE,DELETE
AS
BEGIN
SETNOCOUNTON;
declare@TempCarIDint;
declare@SIM varchar(20);
declare@Flagint;
Set@Flag= 3;
ifnot exists(select 1frominserted)--delete
begin
select @TempCarID=CARID,@SIM=GSM_NUMBERfromdeleted
Set@Flag= 3;
end
elseifnotexists(select 1fromdeleted)--add
begin
select @TempCarID=CARID,@SIM=GSM_NUMBERfrominserted
Set@Flag= 1;
end
else--update
begin
select @TempCarID=CARID,@SIM=GSM_NUMBERfrominserted
Set@Flag= 2;
end
execmaster.dbo.TerminalFlagSynchro@TempCarID,@SIM,@Flag
END
以上只是簡要說明,如果有不懂的,可以聯繫我。本人QQ:1148824289
源碼下載鏈接:http://download.csdn.net/detail/mingojiang/4526362
轉載請註明出處:http://blog.csdn.net/mingojiang