一、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;
数据库端:
服务端: