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

  • 相关阅读:
    视频学习网站
    保存文章
    maven常见命令总结
    Eclipse vs IDEA快捷键对比大全(win系统)
    JS调用android逻辑方法
    【原创】不用封装jar包 直接引入工程使用的方法(类似android的 is Library功能)
    windows下eclipse+hadoop2
    Solaris用户管理(一):用户与组管理
    jquery 操作 checkbox
    模拟用户登录的操作
  • 原文地址:https://www.cnblogs.com/pcbren/p/10146270.html
Copyright © 2020-2023  润新知