[.NET] 使用C#开发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

posted @ 2014-03-27 08:01  Clark159  阅读(629)  评论(0编辑  收藏  举报