zoukankan      html  css  js  c++  java
  • [.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

  • 相关阅读:
    Path文件操作实例
    Cache缓存对象缓存对象
    Session对象实例
    移动端适配问题
    webpack4 优化性能
    webpack源码分析
    wepack源码解析1
    webpack面试题
    asnyc await
    node 知识
  • 原文地址:https://www.cnblogs.com/clark159/p/3627470.html
Copyright © 2011-2022 走看看