在SQL Server2005中使用 .NET程序集

昨天完成了一个最简单的在数据库中创建标量值函数,今天主要完成表值函数,存储过程和用户定义类型在和.NET结合下的使用方法.
1,表值函数
所谓表值函数就是说这个函数返回的结果是一个Table,而不是单个的值.
在.NET 中创建这样的函数,返回的结果是一个IEnumerable接口.这个接口非常灵活,所有.NET数组集合等都是实现了该接口的.下面我们举一个简单的例子来说明.
在VS2005中创建一个类Student,这个就是我们要返回的表的内容,类下面有属性int Age,string sName,DateTime Birthday,int SID;
然后在另外一个类UserFunction中写入如下代码:
[SqlFunction(FillRowMethodName="FillRow")]
public static IEnumerable GetStudent()
{
Hashtable hash = new Hashtable();
for(int i=0;i<3;i++)
{
Student s = new Student();
s.SID = i;
...
hash.Add(i, s);
}
return hash.Values;
}
public static void FillRow(object obj, ref SqlInt32 id, ref SqlString name, ref SqlDateTime bir, ref SqlInt32 age)
{
Student s = (obj as Student);
id = s.SID;
name = s.sName;
bir = s.Birthday;
age = s.Age;

}

第一个属性中指定FillRowMethodName就是为了将返回的IEnumerable接口中的数据进行转换,将数据库无法认识的集合转换为数据库人生的字段.下面的函数FillRow就是具体转换的过程.
这样写完成以后,在数据库那边添加好这个程序集,然后就可以创建表值函数了:
create function BuildTable()
returns table(SID int,[sName] nvarchar(100),Birthday datetime,Age int)
as
external name SQLFunction.[SQLFunction.UserFunction].GetStudent

这儿就不用太多的解释了,就是将名为SQLFunction的程序集中的[名字空间.类].方法添加到BuildTable函数中.
这儿需要说明一下就是数据库中的类型和.NET中的类型的对应问题.int,datetime就不说了,主要是.NET中的string,在数据库中没有string类型,在FillRow中指出了类型SqlString,而这个类型的对应是nchar,nvarchar.这儿不能对应char,varchar,我不知道为什么必须是对应nchar的.所以上面我们写的是[sName] nvarchar(100).
大功告成,测试一下,输入语句select * from BuildTable()看看返回你的表没有.
2.存储过程
CLR存储过程和CLR函数非常相似,不过有几点更高的能力:
CLR存储过程可以有一个返回值,也可以写输出参数,可以返回消息给客户程序,可以调用DDL和DML语句.
.NET创建存储过程要编写为静态函数,然后加上SqlProcedure属性.
比如我们写一个简单的存储过程
[SqlProcedure]
public static int Add(int a, int b)
{
return a + b;
}

然后在数据库中写入:
create procedure Add2Num
@a int,@b int
as
external name SQLFunction.[SQLFunction.UserFunction].[Add]

整个代码我就不用解释了,和前面创建函数一样.
我们运行看看结果:
declare @a int
exec @a=Add2Num 10,12
print @a

3.用户定义类型(UDT)
要创建UDT类必须符合"UDT规范",.NET中的约束如下:
他们必须带SqlUserDefinedType 属性
必须带有Serializable属性
必须实现INullable接口
必须博阿訇公开和静态的Parse和ToString方法以用于转换数据类型字符串或逆向转换.
必须暴露数据元素为公开字段或公开属性.
好,那我们就创建一个简单的UDT复数类如下:
[Serializable]
[SqlUserDefinedType(Format.Native)]
[StructLayout(LayoutKind.Sequential)]
public class Complex:INullable
{
bool isNull=false;
double real, imag;
public bool IsNull
{
get { return isNull; }
}
public double Real
{
get { return real; }
set { real = value; }
}
public double Imag
{
get { return imag; }
set { imag = value; }
}
public override string ToString()
{
if (isNull)
{
return "NULL";
}
else
{
return real + "," + imag;
}
}
public static Complex Parse(SqlString s)
{
if (s == null || s.IsNull)
{
return null;
}
else
{
Complex c = new Complex();
string str = Convert.ToString(s);
string[] st = str.Split(',');
c.real = Convert.ToDouble(st[0]);
c.imag = Convert.ToDouble(st[1]);
return c;
}
}
}

编译好,在数据库中添加程序集后,我们运行如下代码:
create type Complex
external name SQLFunction.[SQLFunction.Complex]

这样我们就创建好了用户定义类型Complex.
数据库事例代码中有相关内容,参见:
\Program Files\Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\UserDefinedDataType

时间: 2024-09-20 00:53:52

在SQL Server2005中使用 .NET程序集的相关文章

体验SQL Server2005中T-SQL特性

错误处理一直是T-SQL开发的一个棘手部分.你曾经需要在基于逐个场景的基础上运行每一个语句和处理他们之后手动检查错误.事务管理也很烦琐,因为你得指出你的事务的状态,并恰当的回滚或提交.在SQL Server2005中,微软通过增加Try...Catch块到T-SQL中,提供了一个更新.更强大的错误处理能力. 异常处理很简单;在执行你的代码过程中有意外发生时,例如一个异常,你需要有一个例行方式去处理这个异常.要怎么处理这个异常是由作为开发者的你来决定的.为了增加一个异常处理到你的T-SQL代码中,

[转]在SQL Server2005中进行错误捕捉

原文:http://www.cnblogs.com/nokiaguy/archive/2008/05/09/1190551.html    任何程序都可能出现错误,在SQL Server中执行Transact-SQL也不例外.如果在Transact-SQL中发生了错误,一般有两种捕捉错误的方法,一种是在客户端代码(如 c#.delphi等)中使用类似try...catch的语句进行捕捉:另外一种就是在Transact-SQL中利用Transact-SQL本身提供的错误捕捉机制进行捕捉.如果是因为

完美解决SQL server2005中插入汉字变成问号的问题_MsSql

关于SQL server2005中插入汉字变成问号的解决办法 1.右击你所建的数据库,点击"属性",选择"选项"并点击.将其中的排序规则设置为:Chinese_PRC_CI_AS(选择下拉列表框即可设置),然后"确定". 2.在表中将你的汉字字段的数据类型设置为nvarchar型或ntext型,设置前最好先将表中的数据全部删除.(不要使用varchar或text型,因为它们只会继续使你的数据乱码). 3.设置好后,关闭服务器,再重新启动,就可生效

完美解决SQL server2005中插入汉字变成问号的问题

关于SQL server2005中插入汉字变成问号的解决办法 1.右击你所建的数据库,点击"属性",选择"选项"并点击.将其中的排序规则设置为:Chinese_PRC_CI_AS(选择下拉列表框即可设置),然后"确定". 2.在表中将你的汉字字段的数据类型设置为nvarchar型或ntext型,设置前最好先将表中的数据全部删除.(不要使用varchar或text型,因为它们只会继续使你的数据乱码). 3.设置好后,关闭服务器,再重新启动,就可生效

SQL Server2005杂谈(4):在SQL Server2005中按列连接字符串的三种方法

本文为原创,如需转载,请注明作者和出处,谢谢! 上一篇:SQL Server2005杂谈(3):四个排名函数(row_number.rank.dense_rank和ntile)的比较 最近做一个项目,遇到一个在分组的情况下,将某一列的字段值(varchar类型)连接起来的问题,类似于sum函数对int型字段值求和. 如有一个表t_table,结构和数据如图1                                           图1     其中要按着xh字段分组,并且将每一组na

在SQL Server2005中进行错误捕捉

任何程序都可能出现错误,在SQL Server中执行Transact-SQL也不例外.如果在Transact-SQL中发生了错误,一般有两种捕捉错误的方法,一种是在客户端代码(如C#.Delphi等)中使用类似try...catch的语句进行捕捉:另外一种就是在Transact-SQL中利用Transact-SQL本身提供的错误捕捉机制进行捕捉.如果是因为Transact-SQL语句的执行而产生的错误,如键值冲突,使用第一种和第二种方法都可以捕捉,但是如果是逻辑错误,使用客户端代码进行捕捉就不太

SQL Server2005中的SMO编程

SMO是SQL Mangagement Objects的简称.与之相对应的是ADO.Net,不过不同的地方是ADO.Net是用于数据访问的,而SMO是用于设计的,虽然SMO能够再服务器上执行任意的SQL语句.另外一个不同的地方是ADO.Net可以访问计算机中任意数据源,而SMO对象是专门针对SQL Server而设计的. 在SMO中最重要的一个类就是Server.其他大多数对象都是Server对象的后代.比如Database,Table,View等等对象都是通过Server属性不断向下检索到的.

SQL Server2005 中的数据类型总结

 SQL Server 2005 中的数据类型归纳为下列类别:精确数字 bigint decimal int numeric smallint money tinyint smallmoney bit   近似数字 float real 日期和时间 datetime smalldatetime 字符串 char text varchar   Unicode字符串 nchar ntext nvarchar   二进制字符串 binary image varbinary   其他数据类型 curso

SQL Server2005中触发器的运用

编写过存储过程的人,再编写触发器时会发现:他们的语法.格式是非常类似的.其实触发器就是一种特殊类型的存储过程.他们都是预编译的,在程序正式编译前就由编译器进行编译,存储在服务器端. 不过,触发器与一般的存储过程也有些区别.触发器主要是通过对数据库的增删改的操作,或者是一个触发动作的触发作用等事件触发而被执行:而存储过程则是通过像传递SQL语句一样,传递存储过程的名字来被程序调用,实现功能. 触发器一共分为五种类型:Update触发器,Insert触发器.Delete触发器.Instead of触