欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > SQLserver通过CLR调用TCP接口

SQLserver通过CLR调用TCP接口

2026/2/14 14:46:58 来源:https://blog.csdn.net/lqbz456/article/details/139500267  浏览:    关键词:SQLserver通过CLR调用TCP接口

一、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;

数据库端:
在这里插入图片描述
服务端:
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com