zoukankan      html  css  js  c++  java
  • 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信息到服务端,查看一下效果

  • 相关阅读:
    python拆包与装包-*args,**kwargs
    mybatis学习4-CRUD操作
    mybatis学习3-入门案例,注解方式
    mybatis学习1-前置,复习Jdbc
    spring框架学习-aop
    spring学习1-第一个spring项目
    spring概述
    idea的一些个人设置
    maven的一些个人设置
    VBA文件对话框的应用(VBA打开文件、VBA选择文件、VBA选择文件夹,VBA遍历文件夹)
  • 原文地址:https://www.cnblogs.com/pcbren/p/10146270.html
Copyright © 2011-2022 走看看