ms sqlserver clr应用(一)

mssql 的存储过程和函数的功能已经很强大了,但要做一些涉及IO操作的处理时,还是需要clr的帮忙。本文主要阐述创建clr的过程及注意事项。 
一、CLR 程序的创建前对数据库的准备工作:
  • 允许数据库使用clr:
                    
                exec sp_configure 'show advanced options', '1';
                go
                reconfigure;
                go
                exec sp_configure 'clr enabled', '1'
                go
                reconfigure;
              
               
  • 数据库设为值得依赖。
                    
                ALTER DATABASE test SET TRUSTWORTHY ON;
                
                
 二、用C#编写clr
        
    using System;
    using System.Data.SqlTypes;
    namespace  gym
    {
        public class gymtest
        {
           //用于创建函数
            public static string todate( string cstr)  //要用static
            {
                DateTime d;
                if (!DateTime.TryParse(c, out d))  
                    d = DateTime.Now;
                if (d < DateTime.Parse("1900-01-01")) 
                    d = DateTime.Now;
                return d;
                //C#中的日期范围是从1-1-1开始,而sql server中是从1753-1-1开始
            }
           //用于创建存储过程
            public static SqlInt32 div(SqlInt32 i, ref SqlInt32 j, out SqlInt32 k)
            {
                if (i.IsNull || j.IsNull) { k = SqlInt32.Null; return 1; }
                k = i.Value % j.Value;
                j = i / j;
                return 0;
            }
          //用于创建触发器
          [SqlTrigger(Name = @"send_sms", Target = "[dbo].[sms]", Event = "FOR INSERT")]
          unsafe public static void send_sms()
           {
           ...// 下一篇讲如何利用触发器通过短信猫发送短信 
           }
        }
    }
            
            
 三、编译成dll文件
        
    //注意.net版本,sql2008还是用.net 2.0编译
     csc /t:library /out:c:\gym.dll   c:\gym.cs /unsafe
    
    
 四、创建程序集
        
    create assembly gym from 'c:\gym.dll' with PERMISSION_SET=UNSAFE
        //如果C#中涉及到unsafe代码的,要设PERMISSION_SET=UNSAFE
    
    
 五、创建clr存储过程或触发器
  • 建立函数
                    
                  create FUNCTION [dbo].[ctod](@c nvarchar(10))  //ctod函数名
                  RETURNS datetime WITH EXECUTE AS CALLER
                  AS
                  EXTERNAL NAME [gym].[gymtest].[todate]  //依次:namespace.class.function
            
            
  • 建立存储过程
                    
                create proc mydiv @i int,@j int output,@k int output  //参数及属性要一一对应
                as 
                external name [gym].[gymtest].[div]  //依次:namespace.class.function      
                
            
  • 建立触发器
                    
                CREATE TRIGGER smstrigger 
                ON sms FOR INSERT  //sms表名
                AS
                EXTERNAL NAME gym.gymtest.send_sms //依次:namespace.class.function 
                                    
                
            

注:能用SQL存储过程解决的事情最好不用CLR,CLR的效率远远低于sql的存储过程,特别是查询表之类的操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值