1. 程式人生 > >PCB MS SQL 標量函數(CLR) 實現Socket發送消息

PCB MS SQL 標量函數(CLR) 實現Socket發送消息

call proto returns lec conf cas ms sql system weight

在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發送消息