[.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. xml和xsd架构文档相关知识

    1.使用架构(XSD)验证XML文件 2.使用自动生成工具: 工具目录:C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4. ...

  2. oracle create table(转)

    //建测试表 create table dept( deptno number(3) primary key, dname varchar2(10), loc varchar2(13) ); crea ...

  3. 安卓开发笔记——重识Activity

    Activity并不是什么新鲜的东西,老生常谈,这里只是随笔记录一些笔记. 每当说起Activity,感觉最关注的还是它的生命周期,因为要使我们的应用程序更加健壮,客户体验更加良好,如果对生命周期不熟 ...

  4. 使用EntityFramwork[6.1]进行级联保存的时候出现异常

    出现的异常:System.InvalidOperationException: Multiplicity constraint violated. The role 'IncomeItem_Creat ...

  5. IIS6.0下 Asp.Net 拦截jpg请求

    之前用mvc写了一个接口,访问格式 http://ip:port/{id}-{type}.jpg来获取一个图片,在IIS7.0+运行毫无障碍,但是在IIS6.0下,直接提示文件不存在或者已删除. 经过 ...

  6. LitePal + Gson + Volley的ORM框架尝试方案

    为了紧跟技术潮流,目前的项目开始采用ORM的思想进行重新设计. 数据库采用轻量级ORM框架LitePal,Json解析采用Gson,网络框架采用Volley. 如果只是单纯的将这些第三方框架引进来,事 ...

  7. 参数嗅探(Parameter Sniffing)(1/2)

    这个问题会在参数话的SQL语句(例如存储过程)与SQL Server里的计划缓存机制结合的时候会出现.这个文章分为2个部分,第1部分会介绍下参数嗅探(Parameter Sniffing)的概况,第2 ...

  8. iOS实现图像素描效果

    使用GPUImageSketchFilter对象实现图像素描效果 NSString *const kGPUImageSketchFragmentShaderString = SHADER_STRING ...

  9. mysql 在row模式下truncate 与 delete 二进制日志记录的差异

    二进行日志的格式为row mysql> show variables like 'binlog_format'; +---------------+-------+ | Variable_nam ...

  10. [团队项目] Scrum 项目 3.0 SCRUM 流程的步骤2: Spring 计划

      SCRUM 流程的步骤2: Spring 计划 1. 确保product backlog井然有序.(参考示例图1) 2. Sprint周期,一个冲刺周期,长度定为两周,本学期还有三个冲刺周期. 3 ...