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

Posted pcbren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
View Code

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

 

以上是关于PCB MS SQL 标量函数(CLR) 实现Socket发送消息的主要内容,如果未能解决你的问题,请参考以下文章

PCB MS SQL CLR聚合函数(函数作用,调用顺序,调用次数) CLR说明

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

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

.NET CLR sql 标量函数 DataTypes

sql MS SQL简单标量函数

SQLServer系统视图sysobjects中type字段说明