[.NET] 使用C#开发SQL Function来提供服务 - 简讯发送
[.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来提供服务 - 简讯发送的更多相关文章
- [.NET] 使用C#开发SQL Function来提供数据 - 天气预报
[.NET] 使用C#开发SQL Function来提供数据 - 天气预报 范例下载 范例程序代码:点此下载 问题情景 开发人员在设计一些数据汇整的系统服务时,可能会选择WCF.WebAPI.Sign ...
- 开发板通过UART向主机发送数据
/********************************* 代码功能:开发板通过UART向主机发送数据 使用函数: Serial.begin(数据传输的波特率); Serial.printl ...
- SNF开发平台WinForm之十二-发送手机短信功能调用-金笛-SNF快速开发平台3.3-Spring.Net.Framework
1.调用前组装参数 2.调用发送信息服务脚本 .调用前组装参数: BaseSendTaskEntity entity = new BaseSendTaskEntity(); entity.Mess ...
- Django---Blog系统开发之注册页面(验证码&ajax发送文件)
前端页面及渲染: 静态文件的配置:setting.py: static 文件放在app下 STATIC_URL = '/static/' STATIC_ROOT = ( os.path.join(BA ...
- SQL Function 自定义函数
目录 产生背景(已经有了存储过程,为什么还要使用自定义函数) 发展历史 构成 使用方法 适用范围 注意事项 疑问 内容 产生背景(已经有了存储过程,为什么还要使用自定义函数) 与存储过程的区别(存 ...
- 大型系统开发sql优化总结(转)
Problem Description: 1.每个表的结构及主键索引情况 2.每个表的count(*)记录是多少 3.对于创建索引的列,索引的类型是什么?count(distinct indexcol ...
- SQL开发——SQL语法
文档资料参考: 参考:http://www.w3school.com.cn/sql/sql_syntax.asp 参考:http://wiki.jikexueyuan.com/project/sql/ ...
- 后台商品搜索功能开发SQL
在做后台的商品搜索功能开发时遇到了一些问题记录下来 版本一 <select id="SelectByNameAndParentId resultMap="Base_resul ...
- sql:function
--查询权限函数 --1 declare @names varchar(3000) set @names='' select @names=@names+isnull(AdminPermissForm ...
随机推荐
- WindowsServer2012桌面图标设置
1.win+R调出运行窗口 2.输入:rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0 即可
- 同程旅游网开放平台SDK开发完成
最近利用业余时间,使用了同程旅游网的开放平台,并对大部分的方法进行了调用,发现有很多不好用的地方,比如 1.同一个开放平台居然有几个调用地址,景区调用http://tcopenapi.17usoft. ...
- 【Thinking in Java-CHAPTER 3】操作符
优先级 赋值 对象在使用c=d,那么c和d都指向原本只有d指向的那个对象. 方法调用中的别名问题:当一个对象作为参数传递到一个函数中,函数改变了这个参数,则改变了传递进来的对象: 自增和自减 浮点型的 ...
- AssetBundle系列——打包前进行平台检测
在生成AssetBundle的时候,如果目标平台和当前平台不一致,Unity3D会自动将当前平台转换为目标平台. 如果项目中资源量比较大,这个转换过程是相当漫长的,并且不能够强行中止. 所以最好在Bu ...
- 谈mvc开发中gzip压缩的应用
压缩view的内容,可加过滤器 public class GzipFilter : ActionFilterAttribute { public override void O ...
- NPM使用详解(上)
1.NPM是什么? NPM是JavaScript的包管理工具,在安装NodeJS(什么?你不知道node?来,我们合计合计:https://nodejs.org/)的时候,会自动安装上npm. 要查看 ...
- Git 分支合并
理解核心 Git最初只有一个分支,所有后续分支都是直接或间接的从这个分支切出来的. 在任意两个分支上,向前追溯提交记录,都能找到一个最近的提交同时属于这两个分支,这个提交就是两个分支的分叉节点 分支合 ...
- Keepalived 使用指南
Keepalived 使用指南 1. 简介 负载均衡是虚拟服务的一种好的处理方案.当设计一种负载均衡的拓扑时一定要考虑到如下两点: 真实服务器的可用性使用健康检测机制. 负载均衡器的可用性使用故 ...
- 推荐几款很棒的 JavaScript 表单美化和验证插件
表单元素让人爱恨交加.作为网页最重要的组成部分,表单几乎无处不在,从简单的邮件订阅.登陆注册到复杂的需要多页填写的信息提交功能,表单都让开发者花费了大量的时间和精力去处理,以期实现好用又漂亮的表单功能 ...
- iOS-微信支付(订单号重复的问题)
1. 官方文档中说过同一笔交易不能多次提交,出现这个错误让核实商户订单号是否重复提交,但是有些情况下是需要重复提交的,比如:用户微信支付的时候没有付款,直接取消了,那么订单如果已经创建了,在订单中心就 ...