數據庫主動式通知編程

數據庫主動式通知編程

 

概述

       當數據庫更新的時候,如插入,刪除,修改了數據記錄,我們的應用程序需要知道些變更,一般情況下我們會採用輪詢的方式.對數據庫不間斷性地查詢,這種方式即不能保證實時性,又非常損耗服務的性能.那麼是否有主動觸發的機制,主動通知應用程序哪些記錄做了更新呢?目前主要有兩種機制:

,採用擴展存儲過程,使用觸發器,觸發器再調用擴展存儲過程,擴展存儲過程再把數據通過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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章