首页 > 数据库 > SQL Server > 正文

探讨SQL Server 2005.NET CLR编程

2024-08-31 00:49:43
字体:
来源:转载
供稿:网友

本文将解释如何在sql server 2005中以尽可能最简单的方法创建基于.net的clr子例程。本文主要针对在服务器端使用sql server 2005的.net开发者。

一、创建sql server 2005数据库

这一节主要讨论创建一个将用于本文中的数据库和表格。详见下列步骤:

· 执行"start->programs->microsoft sql server 2005->sql server management studio",并使用必要的证书连接到你的sql server 2005实例。

· 一旦建立连接,使用"object explorer"打开sql server 2005实例,然后右击"databases"并选择"new database"(图1)。

图1

然后,出现一个"new database"对话框。输入数据库名"sample"并点击"ok"以便在同一个实例内创建新的数据库。

· 一旦创建该数据库,你一定能够在"object explorer"中看到相同的结果。

· 使用"object explorer"打开"sample"数据库,右击"tables"并选择"new table"(图2)。

图2

· 创建如下图3所示的表格结构,并用"emp"保存表格。

图3

· 一旦你创建了表格"emp",打开它(图4)并使用下列数据进行填充(图5)。

图4

图5

二、创建sql server 2005数据库.net clr存储过程

一旦你创建完数据库和表格,接下来让我们使用下列步骤在sql server 2005数据库中创建一个.net clr存储过程:

· 转到"start -> programs -> microsoft visual studio 2005 -> microsoft visual studio 2005"。

· 在"new project"对话框内,从"visual basic"树的"project type"下选择"database"并选择"sql server project"作为模板,输入名字"sampleallinone"。至此,该对话框应该看起来如下图6所示。

图6

· 一旦你点击"ok",将出现一个"new database reference"对话框。输入你自己的实例名,并选择数据库"sample"(在上一节创建的),并且测试连接(图7)。

图7

· 一旦测试成功,点击"ok"创建工程。

· 然后系统出现一个对话框,它询问你是否启动clr调试功能。请点击"yes"(图8)。

图8

· 使用"solution explorer",右击"sampleallinone"工程,并点击"add->stored procedure"(以创建一个新的存储过程)(图9)。

图9

· 之后,出现"add new item"对话框。在该对话框内,选择"stored procedure"作为模板并输入名字"incsalaries",最后点击"add"(图10)。

图10

三、.net clr存储过程编码

一旦创建"incsalaries.vb",以下列方法修改你的代码,如下所示:

以下为引用的内容:
imports system
imports system.data
imports system.data.sqlclient
imports system.data.sqltypes
imports microsoft.sqlserver.server
partial public class storedprocedures
<microsoft.sqlserver.server.sqlprocedure()> _
public shared sub incsalaries(byval incval as sqldouble)
 '在此添加你的代码
 using cn as new sqlconnection("context connection=true")
 dim cmd as new sqlcommand("update sample.dbo.emp set
 sal = sal + " & incval.tostring, cn)
 cmd.connection.open()
 cmd.executenonquery()
 end using
end sub
end class

上面是一个使用visual basic.net 2005编写简单的基于clr的存储过程,你可以把它发布到sql server 2005中。该存储过程名为"incsalaries",它只接收一个参数-"incval"。上面的存储过程简单地使用参数中提供的值来提高表格"emp"中每一位雇员的工资值。

四、.net clr存储过程测试

为了测试上面的存储过程,请遵循下列步骤:

· 使用"solution explorer"在"test scripts"中打开"test.sql"(图11)。

图11

· 转到最后一行,并如下修改代码:

--为运行你的工程,请编辑你的工程的test.sql文件。

--这个文件位于solution explorer的"test scripts"文件夹下

exec incsalaries 50

· 转到"start->programs->microsoft sql server 2005->configuration tools->sql server surface area configuration"。

· 在窗口内,点击"surface area configuration for features"(图12)。

图12

· 启动clr集成,如下所示(图13)。

图13

· 按f5执行整个方案。如果它的执行中出现任何错误,一切都会被显示于输出窗口中。

· 如果存储过程成功执行,你应该能够看到所有的工资数增加了50。

五、sql server 2005数据库中的.net clr用户定义函数

现在,我们要在我们现有的方案上添加一个存储函数。

· 使用"solution explorer",右击"sampleallinone"工程并转到"add->user-defined function"(以创建一个新的存储函数)(图14)。

图14

· 之后,出现"add new item"对话框。在对话框内,选择"user defined function"作为模板,输入名字"getnetsalary",最后点击"add"(图15)。

图15

一旦创建"getnetsalary.vb",接下来按下列方式修改你的代码:

以下为引用的内容:
imports system
imports system.data
imports system.data.sqlclient
imports system.data.sqltypes
imports microsoft.sqlserver.server
partialpublic class userdefinedfunctions
<microsoft.sqlserver.server.sqlfunction
(dataaccess:=dataaccesskind.read)> _
public shared function getnetsalary(byval empno as sqlstring)
as sqldouble
 '在此添加你的代码
 dim sal as double
 using cn as new sqlconnection("context connection=true")
 dim cmd as new sqlcommand("select sal from
 sample.dbo.emp where empno='" & empno.tostring & "'", cn)
 cmd.connection.open()
 sal = ctype(cmd.executescalar, double)
 cmd.dispose()
 end using
 dim hra as double = sal * 10 / 100
 dim ta as double = 200
 dim gross as double = sal + hra + ta
 dim epf as double = sal * 5 / 100
 dim net as double = gross - epf
 return net
end function
end class

然后,使用下列步骤测试上面的存储过程:

· 使用"solution explorer"在"test scripts"中打开"test.sql"(见前图11)。

· 转到并修改如下代码:

--为运行你的工程,请编辑你的工程的test.sql文件。

--这个文件位于solution explorer的"test scripts"文件夹下

--exec incsalaries 50

select dbo.getnetsalary(empno) from sample.dbo.emp

按f5执行该函数,你应该能够看到相应结果。

六、定义.net clr用户定义聚合器

现在,我们开始在上一节基础上在我们的现有方案上添加一个聚合函数。

· 使用"solution explorer",右击"sampleallinone"工程并转到"add->aggregate"(以创建一个新的聚合函数)(图16)。

图16

· 之后,出现"add new item"对话框。在该对话框内,选择"aggregate"作为模板,输入名字"netsal"并点击"add"(图17)。

图17

一旦创建"netsal.vb",接下来以下列方式修改你的代码:

以下为引用的内容:
imports system
imports system.data
imports system.data.sqlclient
imports system.data.sqltypes
imports microsoft.sqlserver.server
<serializable()> _
<microsoft.sqlserver.server.sqluserdefinedaggregate(format.native)> _
publicstructure netsal
public sumnetsal as sqldouble
public sub init()
'在此加入你的代码
sumnetsal = 0
end sub
public sub accumulate(byval value as sqldouble)
 '在此加入你的代码
 dim sal as double = ctype(value, double)
 dim hra as double = sal * 10 / 100
 dim ta as double = 200
 dim gross as double = sal + hra + ta
 dim epf as double = sal * 5 / 100
 dim net as double = gross - epf
 sumnetsal += net
end sub
public sub merge(byval obj as netsal)
 '在此加入你的代码
 sumnetsal += obj.sumnetsal
end sub
public function terminate() as sqldouble
 '在此加入你的代码
 return sumnetsal
end function
endstructure

为了测试上面的存储过程,遵循下列步骤:

· 使用"solution explorer",然后在"test scripts"中打开"test.sql"。

· 转到最后一行并修改如下代码:

--为运行你的工程,请编辑你的工程的test.sql文件。

--这个文件位于solution explorer的"test scripts"文件夹下

--exec incsalaries 50

--select dbo.getnetsalary(empno) from sample.dbo.emp

select dbo.netsal(sal) from sample.dbo.emp

按f5执行该函数,你应该能够观察到相应的结果。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表