探讨SQL Server 2005.NET CLR编程

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
本文将解释如何在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)。

64nd3zv12614.jpg
图1.

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

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

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

19bf99wd3efz.jpg
图2.

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

cv7c0315798n.jpg
图3.

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

vp39hlqvec7k.jpg
图4.
4h7m625m9v95.jpg
图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所示。

12914113drs0.jpg
图6.

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

aapnv8w8qtor.jpg
图7

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

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

d1s4yo23ub07.jpg
图8

  · 使用"Solution explorer",右击"SampleAllInOne"工程,并点击"Add->Stored Procedure"(以创建一个新的存储过程)(图9)。

58q5h82023o3.jpg
图9

  · 之后,出现"Add New Item"对话框。在该对话框内,选择"Stored Procedure"作为模板并输入名字"IncSalaries",最后点击"Add"(图10)。

8u409hu1587v.jpg
图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)。

xv4t4m7nz38k.jpg
图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)。

cu2o7a46an70.jpg
图12.

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

4sy2k88t7i99.jpg
图13.

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

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

五. SQL Server 2005数据库中的.NET CLR用户定义函数

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

· 使用"Solution explorer",右击"SampleAllInOne"工程并转到"Add->User-defined Function"(以创建一个新的存储函数)(图14)。

t9se11md9556.jpg
图14

· 之后,出现"Add New Item"对话框。在对话框内,选择"User defined function"作为模板,输入名字"getNetSalary",最后点击"Add"(图15)。

w194331p7a02.jpg
图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)。

1jm870iep979.jpg
图16

· 之后,出现"Add New Item"对话框。在该对话框内,选择"Aggregate"作为模板,输入名字"NetSal"并点击"Add"(图17)。

2uwesr959r7t.jpg
图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执行该函数,你应该能够观察到相应的结果。

















本文转自朱先忠老师51CTO博客,原文链接:http://blog.51cto.com/zhuxianzhong/59803  ,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
26天前
|
SQL Perl
PL/SQL编程基本概念
PL/SQL编程基本概念
13 0
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
62 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
4月前
|
SQL 存储 算法
数据库编程大赛:一条SQL计算扑克牌24点
参加NineData举办的数据库编程大赛,展示你的技术才华!用一条SQL语句解决扑克牌24点的计算表达式。这场比赛面向数据库爱好者、开发者、程序员、DBA等,展示你的编程技能,并有机会赢得丰厚奖励。欢迎大家来挑战!
194 0
数据库编程大赛:一条SQL计算扑克牌24点
|
29天前
|
SQL Go
SQL编程
SQL编程
9 0
|
1月前
|
Windows
windows server 2019 安装NET Framework 3.5失败,提示:“安装一个或多个角色、角色服务或功能失败” 解决方案
windows server 2019 安装NET Framework 3.5失败,提示:“安装一个或多个角色、角色服务或功能失败” 解决方案
|
6月前
|
SQL Java 数据库连接
JSP网上相亲交友系统myeclipse开发sql数据库bs框架java编程jdbc
JSP 网上相亲交友系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为sqlserver2008,使用java语言开发,系统主要采用B/S模式开发。
69 0
|
2月前
|
SQL 开发框架 .NET
ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能
ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能
32 0
|
4月前
|
SQL 关系型数据库 MySQL
SQL编程【MySQL 01】拆分列字段为行并根据类型翻译字段 > 1305 - FUNCTION x.help_topic_id does not exist 报错问题
SQL编程【MySQL 01】拆分列字段为行并根据类型翻译字段 > 1305 - FUNCTION x.help_topic_id does not exist 报错问题
33 0
|
4月前
|
SQL 关系型数据库 MySQL
【SQL编程】Greenplum 与 MySQL 数据库获取周几函数及函数结果保持一致的方法
【SQL编程】Greenplum 与 MySQL 数据库获取周几函数及函数结果保持一致的方法
37 0
|
4月前
|
SQL JSON 关系型数据库
【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)
【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)
50 0