本文将解释如何在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执行该函数,你应该能够观察到相应的结果。
新闻热点
疑难解答