[.NET] 使用C#开发SQL Function来提供服务 - 简讯发送

范例下载

范例程序代码:点此下载

问题情景

在「使用C#开发SQL Function来提供数据 - 天气预报」这篇文章中,介绍如何将系统服务封装成为SQL Function来提供数据。而在另外一些特殊的开发案例中,将系统服务封装成为SQL Function不是用来提供数据、而是单单用来提供服务,也是一种很常见的设计。只不过这种设计所服务的目标用户,不是负责开发系统的RD、而会是偏向负责维运系统的MIS与FAE。

在目前的职场环境中,MIS与FAE已经可以称做是全能的工作人员,像是系统运转维护、数据库备份管理...等等维运工作,都是交由MIS与FAE来一肩扛下。而这两者在维运的工作流程中常常会需要各种系统服务的支持,例如:系统发生问题时发送简讯告知维护人员、每个月定时发送报表到主管信箱...等等。

为了满足这类使用者的需求,开发人员可以选择将系统服务(简讯发送、报表发送)封装成为SQL Function并且布署到SQL数据库;后续MIS与FAE只要透过SQL语法来定义Trigger、Job,就可以在这些Trigger、Job中使用系统服务所提供的服务,大幅降低MIS与FAE使用系统服务的技术门坎。

本篇文章介绍如何将系统服务封装成为SQL Function来提供服务,为自己留个纪录也希望能帮助到有需要的开发人员。

数据源

为了降低范例的复杂度,后续范例使用CLK.KotsmsAPIs套件中的KotsmsAPI类别做为系统服务,来示范如何将系统服务封装成为SQL Function。

这个CLK.KotsmsAPIs套件可以由NuGet取得,套件中的KotsmsAPI类别透过HTTP通讯协议来使用简讯王(http://www.kotsms.com.tw/)所提供的服务,用来提供简讯发送相关功能给开发人员使用。

而在使用CLK.KotsmsAPIs套件之前,记得要先到简讯王(http://www.kotsms.com.tw/)申请测试账号,取得相关的账号、密码、点数,才能实际使用简讯发送的相关功能。

功能开发

接着依照「使用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.SQL语法使用

在SQL Server中,C#开发SQL Function与原生的SQL Function是同等级的存在,可以透过SQL语法来使用。

EXEC dbo.KotsmsAPI_SendMessage @username = '***********',
@password = '***********',
@phoneNumber = '28825252',
@message = '测试发送:许盖功Ab123'

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.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

[.NET] 使用C#开发SQL Function来提供服务 - 简讯发送的更多相关文章

  1. [.NET] 使用C#开发SQL Function来提供数据 - 天气预报

    [.NET] 使用C#开发SQL Function来提供数据 - 天气预报 范例下载 范例程序代码:点此下载 问题情景 开发人员在设计一些数据汇整的系统服务时,可能会选择WCF.WebAPI.Sign ...

  2. 开发板通过UART向主机发送数据

    /********************************* 代码功能:开发板通过UART向主机发送数据 使用函数: Serial.begin(数据传输的波特率); Serial.printl ...

  3. SNF开发平台WinForm之十二-发送手机短信功能调用-金笛-SNF快速开发平台3.3-Spring.Net.Framework

    1.调用前组装参数 2.调用发送信息服务脚本   .调用前组装参数: BaseSendTaskEntity entity = new BaseSendTaskEntity(); entity.Mess ...

  4. Django---Blog系统开发之注册页面(验证码&ajax发送文件)

    前端页面及渲染: 静态文件的配置:setting.py: static 文件放在app下 STATIC_URL = '/static/' STATIC_ROOT = ( os.path.join(BA ...

  5. SQL Function 自定义函数

    目录 产生背景(已经有了存储过程,为什么还要使用自定义函数) 发展历史 构成 使用方法 适用范围 注意事项 疑问   内容 产生背景(已经有了存储过程,为什么还要使用自定义函数) 与存储过程的区别(存 ...

  6. 大型系统开发sql优化总结(转)

    Problem Description: 1.每个表的结构及主键索引情况 2.每个表的count(*)记录是多少 3.对于创建索引的列,索引的类型是什么?count(distinct indexcol ...

  7. SQL开发——SQL语法

    文档资料参考: 参考:http://www.w3school.com.cn/sql/sql_syntax.asp 参考:http://wiki.jikexueyuan.com/project/sql/ ...

  8. 后台商品搜索功能开发SQL

    在做后台的商品搜索功能开发时遇到了一些问题记录下来 版本一 <select id="SelectByNameAndParentId resultMap="Base_resul ...

  9. sql:function

    --查询权限函数 --1 declare @names varchar(3000) set @names='' select @names=@names+isnull(AdminPermissForm ...

随机推荐

  1. nginx server_name

    在我的机子了nginx的  server_name要配制成127.0.0.1才能用,否则就报错,刚试用nginx还不知道为什么,先记下来

  2. 再谈LRU双链表内存管理

    N年前我写了个双链表也发了博客,还添了代码.但是那个代码不但复杂,而且还有有问题的,一直懒得整理,放在空间误导别人.最近在写服务端,今天抽点空补一篇. 关于LRU网上随便搜,有过后端经验的人应该很多都 ...

  3. POJ 2524 Ubiquitous Religions

    Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 20668   Accepted:  ...

  4. C#多线程管理代码

    /// <summary> /// 多线程执行 /// </summary> public class MultiThreadingWorker { /// <summa ...

  5. JAVA多线程编程之生产者消费者模式

    Java中有一个BlockingQueue可以用来充当堵塞队列,下面是一个桌面搜索的设计 package net.jcip.examples; import java.io.File; import ...

  6. JavaScript备忘录(3)——正则表达式

    正则表达式是用来进行字符串匹配的. 定义正则表达式有两种方法:/wor/或者new RegExp("wor"). 使用方法 在JS中,使用正则表达式的方法有: 字符串的search ...

  7. 审核流(2)流程设计-SNF.WorkFlow功能使用说明--SNF快速开发平台3.1

    流程设计 图形化的流程设计,更方便.直观 1.打开“流程设计“程序,如上.点击”新建“如下: 2.红色部分为必填项,审批对象是选择要审批的程序菜单,单据名称是在审核流流转时用于提示的单据名称,还要选择 ...

  8. 在redhat上搭建redmine

    搞个项目管理的东西 找了下还是redmine比较合适,行动action: 1.ruby 额 是的你没有看错 需要先安装一个ruby的环境.话说这个安装起来很是纠结,本来想用yum 结果咩有成功,于是乎 ...

  9. 关于js中的回收机制,通俗版

    在前面的几篇文章中,我讲解过了js中的回收机制,但是对于当时的我来说,我自己对回收机制的这个概念也有些懵懵懂懂,现在对回收机制有了更深入的理解,所以特此发布此文给于总结,也好加深记忆. 如果你想学习闭 ...

  10. Cwinux源码解析(二)

    我在我的个人博客上发表了第二篇解析文章.欢迎各位读者批评指正. Cwinux源码解析(二)