PCB MS SQL 標量函數(CLR) 實現Socket發送消息
阿新 • • 發佈:2018-12-20
call proto returns lec conf cas ms sql system weight
在PCB業務系統中,數據庫中的數據總是被應用端主動連接數據庫並操作數據,是否想過可以讓數據庫主動的將數據推送出去呢! 答應其實是可以的。比如有這樣的應用場景! 當SQL SERVER數據庫滿足某個條件時,可以讓數據庫主動的將消息發送出去! 例如:數據庫中的某個字段的數據發生變化或客戶端觸發了某個存儲過程時(必須有觸發點或任務計劃),這時數據庫可以主動的將信息發送到其它業務系統或監控平臺等系統。下面介紹SQL方式用Socket發送消息。
一.C#寫SQL SERVER(CLR)實現Socket發送消息
/// <summary> /// SocketView Code/// </summary> /// <param name="Content"></param> /// <returns></returns> [SqlFunction(IsDeterministic = true, DataAccess = DataAccessKind.Read)] public static SqlString ScoketSend(string Content) { string str = ""; varsocket = 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
二.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發送消息