在PCB业务系统中,数据库中的数据总是被应用端主动连接数据库并操作数据,是否想过可以让数据库主动的将数据推送出去呢! 答应其实是可以的。比如有这样的应用场景! 当SQL SERVER数据库满足某个条件时,可以让数据库主动的将消息发送出去! 例如:数据库中的某个字段的数据发生变化或客户端触发了某个存储过程时(必须有触发点或任务计划),这时数据库可以主动的将信息发送到其它业务系统或监控平台等系统。下面介绍SQL方式用Socket发送消息。
一.C#写SQL SERVER(CLR)实现Socket发送消息
/// <summary> /// Socket /// </summary> /// <param name="Content"></param> /// <returns></returns> [SqlFunction(IsDeterministic = true, DataAccess = DataAccessKind.Read)] public static SqlString ScoketSend(string Content) { string str = ""; var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { socket.Connect("192.168.224.42", 8885); System.Threading.Thread.Sleep(100); var outputBuffer = Encoding.Unicode.GetBytes(Content); socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null); str = "传送成功 " + socket.RemoteEndPoint.ToString(); } catch (Exception e) { str = "传送失败 " + e.Message; } finally { if (socket != null && socket.Connected) { socket.Shutdown(SocketShutdown.Both); System.Threading.Thread.Sleep(100); socket.Close(); } } retu
二.SQL服务器CLR配置(允许SQL调用.net程序)
sp_configure 'show advanced options', 1; RECONFIGURE WITH override GO sp_configure 'clr enabled', 1; RECONFIGURE WITH override GO Sp_changedbowner 'sa',true --sa改为当前登入用户名 alter database [dbname] set trustworthy on --bbname 改为自己的库名
三.注册 CLR 程序集
create ASSEMBLY SQLfunctionAssembly FROM 'D:SQLClr.dll' --改为自己C#写的dll路径填写 WITH PERMISSION_SET = UNSAFE;
创建的.net程序集数据会写入下表:
select * from sys.assemblies select * from sys.assembly_files
四.创建标量函数
CREATE FUNCTION [dbo].[ScoketSend](@Content [nvarchar](max)) RETURNS [nvarchar](max) WITH EXECUTE AS CALLER AS EXTERNAL NAME [SQLfunctionAssembly].[SQLClr.SQLfunction].[ScoketSend] GO
五.测试ScoketSend函数
SELECT dbo.ScoketSend('pcbren ' + CAST(cast( floor(rand()* 10000) as int ) AS VARCHAR(4)));
简单创建了一个Sockect服务端,测试用SQL发送Sockect信息到服务端,查看一下效果