using Microsoft.SqlServer.Server;
using System;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Net;
using System.Reflection;
using System.Text;
using System.Xml;
using System.Web;
using System.Net.Sockets;
using System.Collections.Generic;
public class CLRService
{
/// <summary>
/// 查看CLR版本
/// </summary>
/// <param name="I_ReturnMessage"></param>
[SqlProcedure]
public static void CLR_Version(out string I_ReturnMessage)
{
I_ReturnMessage = Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
[SqlProcedure]
public static void SocketSend(string ServerIP, int Port, string SenderMessage, out int ReturnValue, out string I_ReturnMessage)
{
ReturnValue = -1;
I_ReturnMessage = "";
Socket mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
////域名解析
//IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com");
//IPAddress ipAddress = ipHostInfo.AddressList[0];
IPAddress ipAddress = IPAddress.Parse(ServerIP);
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, Port);
mySocket.Connect(ipEndPoint);
byte[] byteSend = Encoding.UTF8.GetBytes(SenderMessage);
mySocket.Send(byteSend, byteSend.Length, 0);
byte[] byteReceive = new byte[1024];
int length = mySocket.Receive(byteReceive);
I_ReturnMessage = Encoding.UTF8.GetString(byteReceive, 0, length);
ReturnValue = 0;
mySocket.Close();
}
catch (ArgumentNullException ae)
{
if (mySocket.Connected)
{
mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
}
I_ReturnMessage = "Socket:Fail ArgumentNullException : "+ ae.ToString();
}
catch (SocketException se)
{
if (mySocket.Connected)
{
mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
}
I_ReturnMessage = "Socket:Fail SocketException : "+ se.ToString();
}
catch (Exception e)
{
if (mySocket.Connected)
{
mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
}
I_ReturnMessage = "Socket:Fail Unexpected exception : "+ e.ToString();
}
finally
{
if (mySocket.Connected)
{
mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
}
}
}
}
SQL Server 部署代码:
/*文件名:SqlCLRProcedure
*
*2019年10月22日
*================================================================
* 描述:SQL Server CLR 存储过程
* 内容:1、版本检查
2、发送套接字数据SocketSend
*================================================================
部署脚本:
数据库查询设计器中执行
-- C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\vsdiag_regwcf.exe -u
-- 如不执行以上操作,安装后续服务时将报machine.config的错误
-- 执行上述操作后,服务器需要重启.*/
--部署.NET4.0程序集
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE WITH OVERRIDE;
GO
ALTER DATABASE [OrBitClr] SET Trustworthy ON;
GO
use [OrBitClr];
exec sp_changedbowner 'sa';
GO
CREATE ASSEMBLY [System.Web]
from
'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Web.dll'
with
permission_set = UNSAFE; --Fails if not 64 on 64 bit machines
GO
--部署本程序集
CREATE ASSEMBLY
[SqlCLRProcedure] from
'D:\SqlCLRProcedure.dll'
with permission_set = UNSAFE
GO
--[CLR_Version]
CREATE PROCEDURE [dbo].[CLR_Version]
(
@I_ReturnMessage nvarchar(4000)='' output
)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SqlCLRProcedure].[CLRService].[CLR_Version]
GO
--SocketSend
CREATE PROCEDURE [dbo].[SocketSend]
(
@ServerIP nvarchar(100)='',
@Port int= 8007 ,
@SenderMessage nvarchar(max)='',
@ReturnValue int=0 output,
@I_ReturnMessage nvarchar(4000)='' output
)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SqlCLRProcedure].[CLRService].[SocketSend]
GO