在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 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1351079

来自:  http://blog.csdn.net/studyzy/archive/2006/10/25/1351079.aspx 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server,可以使用CLR(Common Language Runtime).NET Framework,从而在SQL Server调用.NET程序。这种方式可以让我们在SQL Server使用.NET的各种功能和库,以及自定义.NET程序来扩展SQL Server的功能。 以下是一个简单的示例,演示如何在SQL Server调用.NET程序: 1. 创建一个.NET类库项目,添加一个公共静态方法(例如,MyMethod),该方法接受一个字符串参数并返回一个字符串。 2. 在类库项目,右键单击项目并选择“属性”,在“应用程序”选项卡,选择“程序信息”,勾选“将程序注册为COM互操作程序”,并指定一个程序名称。 3. 将.NET类库编译为DLL。 4. 在SQL Server使用sp_configure命令启用CLR成: ```sql sp_configure 'clr enabled', 1; RECONFIGURE; ``` 5. 在SQL Server,创建一个存储过程,该存储过程调用刚才创建的.NET程序: ```sql CREATE PROCEDURE MyProcedure @input nvarchar(50) AS EXTERNAL NAME MyDll.MyClass.MyMethod; ``` 其,MyDll是刚才编译的.NET程序名称,MyClass是包含MyMethod方法的.NET类的名称。 6. 在SQL Server,执行存储过程: ```sql EXEC MyProcedure 'Hello, World!' ``` 这样就可以在SQL Server调用.NET程序,并且将.NET程序的返回值作为存储过程的返回值返回给SQL Server。需要注意的是,在使用CLR成时,需要考虑安全性和性能问题,以及.NET程序SQL Server的版本兼容性等问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值