[.NET] 使用C#開發SQL Function來提供服務 - 簡訊發送

本篇文章介紹如何將系統服務封裝成為SQL Function來提供服務。

[.NET] 使用C#開發SQL Function來提供服務 - 簡訊發送

範例下載

範例程式碼:點此下載

問題情景

在「使用C#開發SQL Function來提供資料 - 天氣預報」這篇文章中,介紹如何將系統服務封裝成為SQL Function來提供資料。而在另外一些特殊的開發案例中,將系統服務封裝成為SQL Function不是用來提供資料、而是單單用來提供服務,也是一種很常見的設計。只不過這種設計所服務的目標使用者,不是負責開發系統的RD、而會是偏向負責維運系統的MIS與FAE。

功能情景01

在目前的職場環境中,MIS與FAE已經可以稱做是全能的工作人員,像是系統運轉維護、資料庫備份管理...等等維運工作,都是交由MIS與FAE來一肩扛下。而這兩者在維運的工作流程中常常會需要各種系統服務的支援,例如:系統發生問題時發送簡訊告知維護人員、每個月定時發送報表到主管信箱...等等。

為了滿足這類使用者的需求,開發人員可以選擇將系統服務(簡訊發送、報表發送)封裝成為SQL Function並且佈署到SQL資料庫;後續MIS與FAE只要透過SQL語法來定義Trigger、Job,就可以在這些Trigger、Job中使用系統服務所提供的服務,大幅降低MIS與FAE使用系統服務的技術門檻。

本篇文章介紹如何將系統服務封裝成為SQL Function來提供服務,為自己留個紀錄也希望能幫助到有需要的開發人員。

功能情景02

資料來源

為了降低範例的複雜度,後續範例使用CLK.KotsmsAPIs套件中的KotsmsAPI類別做為系統服務,來示範如何將系統服務封裝成為SQL Function。

這個CLK.KotsmsAPIs套件可以由NuGet取得,套件中的KotsmsAPI類別透過HTTP通訊協定來使用簡訊王(http://www.kotsms.com.tw/)所提供的服務,用來提供簡訊發送相關功能給開發人員使用。

資料來源01

而在使用CLK.KotsmsAPIs套件之前,記得要先到簡訊王(http://www.kotsms.com.tw/)申請測試帳號,取得相關的帳號、密碼、點數,才能實際使用簡訊發送的相關功能。

資料來源02

資料來源03

功能開發

接著依照「使用C#開發SQL Function來提供資料 - 天氣預報」這篇文章的開發步驟,就可以將CLK.KotsmsAPIs套件中的KotsmsAPI類別封裝成為下列的SQL Function,並且發行到資料庫。

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlInt32 KotsmsAPI_SendMessage(string username, string password, string phoneNumber, string message)
    {
        return new KotsmsAPI(username, password).SendMessage(phoneNumber, message);
    }
}

功能開發01

功能使用

01.SQL語法使用

在SQL Server中,C#開發SQL Function與原生的SQL Function是同等級的存在,可以透過SQL語法來使用。

EXEC dbo.KotsmsAPI_SendMessage @username = '***********',
                               @password = '***********',
                               @phoneNumber = '28825252',
                               @message = '測試發送:許蓋功Ab123'

功能使用01

功能使用02

02.Trigger使用

一些既有系統在運作中,會將系統中所發生的事件、警報...等等資料寫入資料庫。

在某些無法修改系統原始碼的維護情景中,負責維護系統的MIS或FAE,可以為這些紀錄事件、警報...等等資料的表格定義Trigger,並在Trigger中使用封裝成為SQL Function的系統服務。透過這樣的方式,就能在系統發生事件、警報的同時,同步透過系統服務來通知相關的負責人員。例如下列範例:就是透過警報紀錄表格(AlarmHistory)的Trigger,在發生警報的時候,同步發送簡訊來通知相關的負責人員。

-- 建立Trigger
CREATE TRIGGER [dbo].[AlarmHistory_Transmit] on [dbo].[AlarmHistory] AFTER INSERT
AS
BEGIN  
    DECLARE @AlarmMessage as nvarchar(MAX)

    SELECT @AlarmMessage = AlarmMessage FROM Inserted

    EXEC dbo.KotsmsAPI_SendMessage @username = '***********',
                                   @password = '***********',
                                   @phoneNumber = '28825252',
                                   @message = @AlarmMessage
END

功能使用03

功能使用04

03.Stored Procedure使用

也有一些既有系統在開發時,會特別將SQL語法全部封裝成為SQL內的Stored Procedure,系統內所有資料操作都是透過這些Stored Procedure來讀寫資料庫。

在某些無法修改系統原始碼的維護情景中,負責維護系統的MIS或FAE,可以在這些Stored Procedure中插入封裝成為SQL Function的系統服務。透過這樣的方式,就能在系統操作資料庫的同時,同步透過系統服務來通知相關的負責人員。例如下列範例:就是透過修改記錄溫度的Stored Procedure,在溫度過高的時候,同步發送簡訊來通知相關的負責人員。

-- 建立Procedure
CREATE PROCEDURE Insert_TemperatureHistory @Temperature as int
AS
BEGIN

    -- 既有Stored Procedure
    INSERT INTO dbo.TemperatureHistory (Temperature)
                                VALUES (@Temperature);

    -- 插入SQL Function
    IF(@Temperature>50)
    BEGIN
        EXEC dbo.KotsmsAPI_SendMessage @username = '***********',
                                       @password = '***********',
                                       @phoneNumber = '28825252',
                                       @message = '溫度過高'
    END

END

功能使用05

功能使用06

期許自己
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。