一、SQLserver啟用CLR
- 查看是否開啟CRL,如果run_value=1,則表示開啟
EXEC sp_configure 'clr enabled';
GO
RECONFIGURE;
GO
- 如果未啟用,則執行如下命令啟用CLR
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
二、創建 CLR 程序集
-
創建新項目
打開 Visual Studio,創建一個新的類庫項目,命名為TcpClientWrapper,目標框架選擇 .NET Framework 3.5。
-
編寫 TCP 通信代碼
在Class1.cs文件中添加如下代碼
using System;
using System.Data.SqlTypes;
using System.IO;
using System.Net.Sockets;
using Microsoft.SqlServer.Server;public class TcpClientWrapper
{private static TcpClient client;[SqlFunction]public static SqlString CallTcpService(SqlString host, SqlInt32 port, SqlString message){try{if (client == null || !client.Connected){client = new TcpClient(host.Value, port.Value);}using (NetworkStream stream = client.GetStream()){using (var writer = new StreamWriter(stream))using (var reader = new StreamReader(stream)){// Send the message to the TCP server.writer.Write(message.Value);writer.Flush();// Read the response from the TCP server.int response = reader.Read();char character = Convert.ToChar(response);//string response = reader.ReadToEnd();return new SqlString(response + "_" + character);}}}catch (Exception ex){return new SqlString("Error: " + ex.Message);}}
}
- 編譯項目
會在 {項目路徑}/bin/debug 下生成DLL文件,
三、部署程序集到SQLserver
- 將生成的dll文件上傳到SQLserver服務器上,記錄文件路徑
- 執行以下命令將程序集加載到 SQL Server
-- 因為程序中使用了靜態成員變量,所以需要UNSAFE模式,否則會報錯,建議使用SAFE、EXTERNAL_ACCESS模式
CREATE ASSEMBLY TcpClientWrapper FROM 'C:\test\TcpClientWrapper.dll' WITH PERMISSION_SET = UNSAFE;-- 刪除 ASSEMBLY
DROP ASSEMBLY TcpClientWrapper;
- 創建函數以調用程序集中的方法
CREATE FUNCTION dbo.CallTcpService(@host NVARCHAR(255), @port INT, @message NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS EXTERNAL NAME TcpClientWrapper.[TcpClientWrapper].CallTcpService;
四、調用TCP接口
DECLARE @response NVARCHAR(MAX);
SET @response = dbo.CallTcpService('127.0.0.1', 8899, '好');
PRINT @response;
數據庫端:
服務端: