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;
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的存储过程,特别是查询表之类的操作