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

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資訊到服務端,檢視一下效果