探讨SQL Server 2005.NET CLR编程

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:
本文将解释如何在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
相关文章
|
3月前
|
存储 JSON 开发工具
Visual Studio编程效率提升技巧集(提高.NET编程效率)
Visual Studio编程效率提升技巧集(提高.NET编程效率)
Visual Studio编程效率提升技巧集(提高.NET编程效率)
|
2月前
|
大数据 开发工具 开发者
从零到英雄:.NET核心技术带你踏上编程之旅,构建首个应用,开启你的数字世界探险!
【8月更文挑战第28天】本文带领读者从零开始,使用强大的.NET平台搭建首个控制台应用。无论你是新手还是希望扩展技能的开发者,都能通过本文逐步掌握.NET的核心技术。从环境搭建到创建项目,再到编写和运行代码,详细步骤助你轻松上手。通过计算两数之和的小项目,你不仅能快速入门,还能为未来开发更复杂的应用奠定基础。希望本文为你的.NET学习之旅开启新篇章!
29 1
|
2月前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
64 7
|
2月前
|
Java Spring 自然语言处理
Spring 框架里竟藏着神秘魔法?国际化与本地化的奇妙之旅等你来揭开谜底!
【8月更文挑战第31天】在软件开发中,国际化(I18N)与本地化(L10N)对于满足不同地区用户需求至关重要。Spring框架提供了强大支持,利用资源文件和`MessageSource`实现多语言文本管理。通过配置日期格式和货币符号,进一步完善本地化功能。合理应用这些特性,可显著提升应用的多地区适应性和用户体验。
32 0
|
2月前
|
开发框架 监控 .NET
|
2月前
|
SQL 数据库 索引
SQL 编程最佳实践简直太牛啦!带你编写高效又可维护的 SQL 代码,轻松应对数据库挑战!
【8月更文挑战第31天】在SQL编程中,高效与可维护的代码至关重要,不仅能提升数据库性能,还降低维护成本。本文通过案例分析探讨SQL最佳实践:避免全表扫描,利用索引加速查询;合理使用JOIN,避免性能问题;避免使用`SELECT *`,减少不必要的数据传输;使用`COMMIT`和`ROLLBACK`确保事务一致性;添加注释提高代码可读性。遵循这些实践,不仅提升性能,还便于后期维护和扩展。应根据具体情况选择合适方法并持续优化SQL代码。
29 0
|
2月前
|
传感器 数据采集 物联网
探索未来:.NET nanoFramework引领嵌入式设备编程革新之旅
【8月更文挑战第28天】.NET nanoFramework 是一款专为资源受限的嵌入式设备设计的轻量级、高性能框架,基于 .NET Core,采用 C# 进行开发,简化了传统底层硬件操作的复杂性,极大提升了开发效率。开发者可通过 Visual Studio 或 Visual Studio Code 快速搭建环境并创建项目,利用丰富的库和驱动程序轻松实现从基础 LED 控制到网络通信等多种功能,显著降低了嵌入式开发的门槛。
31 0
|
2月前
|
SQL 程序员 数据库
总结查看 .NET EF 生成的 SQL 的 3 种方式,亲测可用
总结查看 .NET EF 生成的 SQL 的 3 种方式,亲测可用
|
2月前
|
SQL
.Net Core EF 日志打印 SQL 语句
.Net Core EF 日志打印 SQL 语句
38 0
|
4月前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
64 3