昨天完成了一个最简单的在数据库中创建标量值函数,今天主要完成表值函数,存储过程和用户定义类型在和.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

在SQL Server2005中使用 .NET程序集相关推荐

  1. 在SQL Server2005中进行错误捕捉

    任何程序都可能出现错误,在SQL Server中执行Transact-SQL也不例外.如果在Transact-SQL中发生了错误,一般有两种捕捉错误的方法,一种是在客户端代码(如 c#.delphi等 ...

  2. 使用SQL向SQL Server2005中插入图片

    今天找到了用SQL向SQL Server2005中插入图片的方法,特此记录一下,免得自己忘记. update dbo.BIZ_RPTTL_PTN_M set RPTTL_M_RPT_IMG = (SE ...

  3. Sql server2005中如何格式化时间日期

    执行下面格式化时间和日期的T-SQL脚本,在数据库查询分析器中示范了SQL Server中的大多数可用的时间数据格式.首先我们开始转换sql的一些可用的时间格式.?SELECT convert(var ...

  4. 在SQL Server中调用.NET程序集

    使用到这东西完全是个巧合和无奈之举.不小心在数据库中插入了一些HttpUtility.UrlEncodeUnicode之后的数据.数据库里的一些字段成了%uxxxx%uxxxx这样的结构. 搜索了半天 ...

  5. 转: 利用SQL SERVER2005的XML字段类型实现类似商品扩展属性

    今天自己翻了两页自己的BLOG,发现真是越来越懒了,已经好长时间没有写技术相关的日志了,记得刚开始写BLOG的时候还经常写写自己的技术积累的,现在除了发布ZJ-BLOG的程序更新信息外,好像全成了自己 ...

  6. 细说Sql Server中的视图(下)转载

    原文:细说Sql Server中的视图(下)http://www.cnblogs.com/xbf321/archive/2009/06/19/view_two_in_sqlserver.html 1, ...

  7. sql server2005 无法修改表,超时时间已到 在操作完成之前超时时

    在sql server2005 中,在修改表时,保存的时候显示:无法修改表,超时时间已到 在操作完成之前超时时间已过或服务器未响应  这是执行时间设置过短的原因,可以修改一下设置便能把执行时间加长,以 ...

  8. SQL Server中,with as使用介绍

    一.WITH AS的含义      WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候 ...

  9. SQL Server2005还原数据库攻略

    SQL Server2005还原数据库攻略 Simeon 安天365团队     数据库的安全一直是"兵家"比争之地,数据库是企业公司等信息汇集的核心地带,对于这些数据一旦出现事故 ...

最新文章

  1. java web手动部署_tomcat手动部署web项目的方法
  2. jsp页面生成验证码且验证
  3. 华为云服务器实战 之 Gitlab安装与配置使用
  4. 报错:‘nodemon‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  5. 这是我的第一篇博文,请大家多多关照!~
  6. 微信小程序开发:学习笔记[5]——JavaScript脚本
  7. 数据分析学习总结笔记04:异常值处理
  8. youtube下载视屏和字幕办法
  9. 半导体术语-什么CIM
  10. 集合论中关系矩阵的布尔乘法运算与优化
  11. 与京东物流合作,能不能补全东方甄选的最后一块拼图?
  12. 深度学习21_李宏毅_04_Local Minimum And Saddle Point
  13. IPv6路由信息的序号
  14. python矩阵内积乘_numpy矩阵向量乘法
  15. Windows XP电源管理及注册表分析
  16. python网络-Socket之TCP编程(26)
  17. 谁看谁会的3dMAX游戏建模技巧,学习事半功倍!
  18. Vue Cli4 使用高德地图定位 获取当前经纬度信息以及周边定位
  19. 利用uni-app 开发的iOS app 发布到App Store全流程
  20. 深度学习代码中的希腊字母对应

热门文章

  1. 原生及jq方式使用ajax
  2. 探索式测试的思维模型
  3. Hibernate的数据过滤查询
  4. 全国计算机等级考试题库二级C操作题100套(第99套)
  5. 方法的绑定机制-静态绑定和动态绑定
  6. 数据库:推荐几款 Redis 可视化工具,你都用过吗?
  7. 数据库:SQL 窗口函数知识介绍
  8. 软件测试人员:如何优秀的提Bug?
  9. java if else过多_Spring Boot中如何干掉过多的if else!
  10. c#form+mysql储存读取图片_C#从SQL server数据库中读取l图片和存入图片