PCB MS SQL 标量函数(CLR) 实现Socket发送消息

在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信息到服务端,查看一下效果

原文地址:https://www.cnblogs.com/pcbren/p/10146270.html

时间: 2024-10-06 08:24:56

PCB MS SQL 标量函数(CLR) 实现Socket发送消息的相关文章

PCB MS SQL 标量函数(CLR) 实现转Json方法

一.准备需转为json的数据 在数据库中执行一段SQL返回的数据 需转换后的JSON字符串的效果 [{"TechName":"开料","ItemName":"综合利用率是否为最高","ItemPara":"/"},{"TechName":"开料","ItemName":"综合利用率","ItemPa

PCB MS SQL表值函数与CLR 表值函数 (例:字符串分割转表)

将字符串分割为表表经常用到,这里 SQL表值函数与CLR  表值函数,两种实现方法例出来如下: SELECT * FROM FP_EMSDB_PUB.dbo.SqlSplit('/','1oz/1.5oz/2oz/3oz') 效果如下: SQL实现表值函数 CREATE FUNCTION [dbo].[splitStr]( @s varchar(max), --待分拆的字符串 @split varchar(10) --数据分隔符 )RETURNS @re TABLE(id int IDENTIT

PCB MS SQL 排序应用---SQL相邻数据区间值求解

其中一篇 博文中有写<PCB MS SQL 排序应用---相邻数据且相同合并处理>此篇有也应相用也同的技巧,实现相邻数据区间值求解 示例: 原数据:处理前 求出区间值:处理后 SQL 代码实现 DECLARE @table table(RowNo INT,FlowTechName VARCHAR(20)) INSERT INTO @table(RowNo,FlowTechName) VALUES(1,'沉铜') INSERT INTO @table(RowNo,FlowTechName) VA

PCB MS SQL 存储过程(CLR) 实现Json转DataTable表的方法

一.准备需转为DataTable的json字符串 原json字符串数据 [{"TechName":"ECN","TechNo":"EC_01","id":"1"},{"TechName":"流程指示","TechNo":"PI_01","id":"2"},{"

SQL 标量函数-----日期函数datediff()、 day() 、month()、year()

select day(createtime) from life_unite_product     --取时间字段的天值 select month(createtime) from life_unite_product   --取时间字段的月值 select year(createtime) from life_unite_product    --取时间字段的年值 select datepart(yy,createtime) from life_unite_product     --取时间

MS SQL系统函数之DATEDIFF

DATEDIFF是常用的计算日期差函数,使用语法如下: DATEDIFF ( datepart , startdate , enddate ) 其中参数datepart有如下选项(只列出常用的参数): datepart 缩写 解释 year yy,yyyy 年 month mm,m 月 day dd,d 天 week wk,w 周 hour hh 小时 minute mi,n 分钟 second ss,s 秒 millisecond ms 毫秒 下面举例说明: 计算两个日期之间有多少年 SELE

SQL 标量函数-----日期函数 day() 、month()、year()

select day(createtime) from life_unite_product     --取时间字段的天值 select month(createtime) from life_unite_product   --取时间字段的月值 select year(createtime) from life_unite_product    --取时间字段的年值 select datepart(yy,createtime) from life_unite_product     --取时间

PCB MS SQL 小写转大写

由于SQL Server允许为小写进入 ,导致数据库中存在小写,在数据集成到MES或ERP时报错,Oracle要求大写导致, 需转换为大写,可通过以下语句,查询所有小写数据,再更新. SELECT * FROM ppeflow WHERE pdctno LIKE '%[a-z]%' COLLATE chinese_prc_bin AND LEN(pdctno) = 10 update ppegeneral SET pdctno = UPPER(pdctno) WHERE pdctno LIKE

PCB MS SQL 行转列(动态拼SQL)

一.原数据: SELECT inman,indate FROM [fp_db].[dbo].[ppezhpbb] WHERE indate > '2016-5-1' AND indate < '2016-6-1' ORDER BY indate 二.转换后(动态拼接SQL): --数据先存临时表 SELECT inman,indate INTO #tab FROM [fp_db].[dbo].[ppezhpbb] WHERE indate > '2016-5-1' AND indate