[訊息論壇]ICE
Messaging Forum 徐萬里
DB Adaptor 實作篇 - 如何讓資料在寫入資料庫時,同時透過
iPush 傳送
在很多系統整合的實際例子中,如何連接已經建置好的資料庫,並從中接取資料,是非常常見的需求。
照以前的做法,只能定時向資料庫下達查詢指令撈資料,或者用定時資料複製的方式,這兩種方式都會大大降低資料庫的工作效能,也會耗費掉許多寶貴的頻寬。
在這裡,我要以 MS SQL Server 為例,向各位說明:如何利用 MS-SQL 的觸發程序 (Trigger),讓資料在寫入資料庫時同時透過
iPush® Server 傳送出來。這樣的做法,不僅可以讓資料庫的效能不至降低,也可以節省許多寶貴的網路頻寬。
好的,假設大家都已經把 MS SQL Server、 iPush® Server
都安裝好了,我們現在就開始進行實驗。
使用 iPush® Server 的管理介面 Backoffice,建立一個測試用的帳號,資料包括:
company name、 product name 、登錄 id 、登錄 password 、 read permission
(接收權限,設定 ch43 為可接收頻道)等,在後續的步驟裡面會用到這些資料。
| Step 1:準備好檔案
iPushStoredProc.dll 置於您指定的目錄下 |
接下來,將預先準備好的 iPushStoredProc.dll 檔案存放在您指定的目錄下,就可以進行下一動作。如果手邊沒有,您可以在ICE
Developer Center的Download區取得。(當然了,您得先註冊成為會員~~)
| Step 2:設定預存程序
(Stored Procedure) |
在 master 資料庫裡頭新增一個「延伸預存程序」(Extended Stored Procedure)(如圖一)
|

|
| (圖一) |
接著畫面會變成如圖二所示,出現一個對話視窗,要求您填入這個延伸預存程序的名稱和執行程式:
|

|
| (圖二) |
在圖二的畫面裡
- 名稱欄位填入 myStoredProc (請注意不可任意變更此名稱)
- 路徑請選取 iPushStoredProc.dll 所在的路徑
最後點擊「確定」按鈕,我們就成功的建立了這個延伸預存程序。到目前為止,我們已經完成了一半的工作。
|

|
| (圖三) |
接下來,準備待會兒要使用的測試資料庫 (test) 以及資料庫內的表單 (measure), schema 如下:
| 欄位名稱 |
資料型別 (資料長度: bytes ) |
| eqid |
int(4) |
| name |
varchar(50) |
| amount |
float(8) |
| status |
int(4) |
接下來是重頭戲,我們要為這個測試資料表 measure 編寫一個觸發程序。當有資料嘗試寫入 measure 時,這個觸發程序就會自動被呼叫執行:
|

|
| (圖四) |
首先如圖四所示:
- 選取資料表 (measure)
- 按下滑鼠右鍵,選取「管理觸發程序」,準備輸入一觸發程序。
此時畫面上會出現一個編輯視窗,如圖五所示:
|

|
| (圖五) |
接著,開始編輯觸發程序,編輯完成之後點擊「確定」即可。觸發程序內容如下:
CREATE trigger iTrigger on dbo.measure
For insert
as
declare @Str1 varchar(16)
declare @Str2 varchar(16)
declare @Str3 varchar(16)
declare @Str4 varchar(16)
Select @Str1 = eqid from Inserted
Select @Str2 = name from Inserted
Select @Str3 = amount from Inserted
Select @Str4 = status from Inserted
Exec master..myStoredProc 4, iceps,
8000, ‘ICE’, ‘ICE’,
‘ice’, ‘ice’,
ch43, @Str1, @Str2, @Str3, @Str4
<<說明>>
在此不對觸發程序的每一個指令去做解釋,有興趣的讀者請參考相關書籍會有更詳細的說明。我們直接看最後一行程序:
Exec master..myStoredProc 4, iceps, 8000, ‘ICE’, ‘ICE’, ‘ice’,
‘ice’, ch43, @Str1, @Str2, @Str3, @Str4
這代表此觸發程序會呼叫 master 資料庫裡頭的延伸預存程序 myStoredProc ,參數說明如下
- 參數一:4代表要送到 iPush® 的資料個數,在這個例子裡頭就是 @Str1、@Str2、@Str3、@Str4
- 參數二:要連結的 iPush® Server (IP 位址或 domain
name)
- 參數三:連結的 iPush® Server port
- 參數四:連結 iPush® Server 的 company name
- 參數五:連結 iPush® Server 的 product name
- 參數六:連結 iPush® Server 的登錄 id
- 參數七:連結 iPush® Server 的登錄 password
- 參數八:要透過 iPush® Server 傳送資料的 channel id
- 參數九~:實際要傳送的資料
[註] MS
SQL Server 對於任何觸發程序有一個共同限制:觸發程序的參數長度總和不可超過 162 bytes 。以前面的觸發程序為例,前
8 個參數已經用掉了 29 個bytes,所以後面 Str1~Str4 參數只能傳遞 133 bytes 長度的資料。
不管多小的系統或程式,最後總是要經過測試才能宣布大功告成,我們這個實驗也不例外。接下來就是測試:
|

|
| (圖六) |
- 開啟接收端 (使用艾揚提供的測試接收端 TestAgent.exe )
- 連線並登入 iPush®
- 訂閱 ch43 頻道 (因為剛才傳送時是用 ch43 頻道來傳送)
- 勾選「將收到的資料解壓」 (unpack)
[註1]
觸發程序所呼叫的 DLL 會把資料以逗號隔開,並且一律 pack 包裝起來,再傳送出去,因此接收端必須勾選「將收到的資料解壓」,才能收到原始的資料。
[註2]:這裡的
iPush® 連線資訊以及所使用的頻道以使用者實際訂定為主,此處提供的是一個連線範例。
|

|
| (圖七) |
- 使用 MS-SQL 的指令輸入介面,下一道 SQL 指令。 Insert 一筆資料進表單 measure :
Insert into measure (eqid, name, amount, status) values (3,’john’,1000,5)
- 此時表單啟動觸發程序,將資料送進 iPush®。測試接收端此時便接收到
iPush 主動傳送過來的資料,如圖八左邊的畫面。
|

|
| (圖八) |
至此整個觸發程序的測試已經完成。是不是很容易呢?趕快下載回去試試看吧!
|