SQL触发器调用.NET的类方法续SQLCLR应用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL触发器调用.NET的类方法续SQLCLR应用相关的知识,希望对你有一定的参考价值。

SQL CLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出现的新功能,它将.NET Framework中的CLR服务注入到 SQL Server 中,使得.NET代码可在SQL Server服务器进程中执行。

通过在 Microsoft SQL Server 中托管 CLR(称为 CLR 集成),开发人员可以在托管代码中编写存储过程、触发器、用户定义函数、用户定义类型和用户定义聚合函数, 改变了以前只能通过T-SQL语言来实现这些功能的局面。因为托管代码在执行之前会编译为本机代码,所以,在有些方案中可以大大提高性能。

本文记录这两天SQLCLR的研究使用过程,实现调用函数传入GUID,通过命名管道发送到目标应用。数据库是SQL Server2008R2

实现方式是将.NET DLL类库注册到SQL Server,从SQL Server中用户定义函数调用.NET类库中的方法。

★DLL类库

namespace SQLCLRlib
{
    public class ControlActive
    {
        /// <summary>
        /// send command
        /// </summary>
        /// <param name="MBID">目标ID</param>
        /// 1:发送成功 0:发送失败
        public static string sendControlCommand(string MBID)
        {
            try
            {
                NamedPipeClient npc = new NamedPipeClient("localhost", "jc-pipe");
                return npc.Query(MBID);
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
    }
}

若方法中需要访问数据库等则需要添加方法的声明:[Microsoft.SqlServer.Server.SqlFunction(SystemDataAccess = SystemDataAccessKind.Read,DataAccess = DataAccessKind.Read)]

否则报异常:在此上下文中不允许访问数据。此上下文可能是不带 DataAccessKind.Read 或 SystemDataAccessKind.Read 标记的函数或方法,也可能是从表值函数的 FillRow 方法为获取数据而进行的回调,还可能是 UDT 验证方法。

VS中也有专门的CLR项目模板:添加新建项目,选择模板"数据库"->SQL Server,选择CLR数据库项目

★SQL Server中的配置

--选择使用哪个数据库

--USE DBname

--查看CLR是否开启
--sp_configure ‘clr enabled‘
--更改安装CLR 1:开启 0:关闭
--exec sp_configure ‘clr enabled‘,1
--reconfigure
--注册DLL,SQL2008R2支持3.5,类库项目的目标框架必须对应SQL Server的支持版本

--TRUSTWORTHY:SQL实例是否信任数据库的内容,默认OFF

--ALTER DATABASE DBname SET TRUSTWORTHY ON;
--create assembly asmSQLCLRlib from ‘D:\...\SQLCLRlib.dll‘ WITH PERMISSION_SET = UNSAFE;
--创建自定义函数
--create function dbo.clrControlActive
--(
-- @MBID as nvarchar(36)
--)
--returns nvarchar(max) as EXTERNAL NAME [asmSQLCLRlib].[程序集.类名].[方法名]
--使用自定义函数
select dbo.clrControlActive(‘58A3D48E-A713-49C3-8FC6-76C8DF0DFA34‘)

参考资料

http://www.cnblogs.com/hsrzyn/archive/2013/05/28/1976555.html

http://www.cnblogs.com/wshcn/archive/2011/12/02/2271630.html

http://www.tuicool.com/articles/fANVzmn 

在此感谢以上资料的作者

本文出自 “xiao宇宙” 博客,请务必保留此出处http://5460095.blog.51cto.com/5450095/1774910

以上是关于SQL触发器调用.NET的类方法续SQLCLR应用的主要内容,如果未能解决你的问题,请参考以下文章

SQL CLR 存储过程调用 Web 服务接收 System.Net.WebException:请求失败,HTTP 状态 415:不支持的媒体类型

访问从 SQL Server 中的 SQLCLR 存储过程返回的 SqlXml

引用 SQL 数据库项目 (SQLCLR) 引发“找不到类型或命名空间”错误

bug统计分析续基于SQL的Bug统计方法

Asp.Net Core 3.1 控制器方法未调用

PL/SQL 编程(三 )程序包和包体,触发器,视图,索引