温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-07-18 01:20:51 来源:网络 阅读:920 作者:liulang5500 栏目:数据库

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 

在此感谢以上资料的作者

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI