仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1049|回复: 7
打印 上一主题 下一主题

[学习教程] MSSQL网页编程之切磋SQL Server 2005.NET CLR编程

[复制链接]
简单生活 该用户已被删除
跳转到指定楼层
#
发表于 2015-1-16 22:18:11 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
支持多线程,充分利用CPU资源
本文将注释怎样在SQLServer2005中以尽量最复杂的办法创立基于.NET的CLR子例程。本文次要针对在服务器端利用SQLServer2005的.NET开辟者。

1、创立SQLServer2005数据库
这一节次要会商创立一个将用于本文中的数据库和表格。详见以下步骤:
·实行"Start->Programs->MicrosoftSQLServer2005->SQLServerManagementStudio",并利用需要的证书毗连到你的SQLServer2005实例。
·一旦创建毗连,利用"ObjectExplorer"翻开SQLServer2005实例,然后右击"databases"并选择"NewDatabase"()。


然后,呈现一个"NewDatabase"对话框。输出数据库名"Sample"并点击"OK"以便在统一个实例内创立新的数据库。
·一旦创立该数据库,你必定可以在"Objectexplorer"中看到不异的了局。
·利用"Objectexplorer"翻开"Sample"数据库,右击"tables"并选择"newtable"()。


·创立以下所示的表格布局,并用"emp"保留表格。


·一旦你创立了表格"emp",翻开它()并利用以下数据举行添补()。




2、创立SQLServer2005数据库.NETCLR存储历程
一旦你创立完数据库和表格,接上去让我们利用以下步骤在SQLServer2005数据库中创立一个.NETCLR存储历程:
·转到"Start->Programs->MicrosoftVisualStudio2005->MicrosoftVisualStudio2005"。
·在"NewProject"对话框内,从"VisualBasic"树的"ProjectType"下选择"database"并选择"SQLServerProject"作为模板,输出名字"SampleAllInOne"。至此,该对话框应当看起来以下所示。


·一旦你点击"OK",将呈现一个"NewDatabaseReference"对话框。输出你本人的实例名,并选择数据库"Sample"(在上一节创立的),而且测试毗连()。


·一旦测试乐成,点击"OK"创立工程。
·然后体系呈现一个对话框,它扣问你是不是启动CLR调试功效。请点击"Yes"()。


·利用"Solutionexplorer",右击"SampleAllInOne"工程,并点击"Add->StoredProcedure"(以创立一个新的存储历程)()。


·以后,呈现"AddNewItem"对话框。在该对话框内,选择"StoredProcedure"作为模板并输出名字"IncSalaries",最初点击"Add"(0)。

0

3、.NETCLR存储历程编码
一旦创立"IncSalaries.VB",以以下办法修正你的代码,以下所示:
以下为援用的内容:
ImportsSystem
ImportsSystem.Data
ImportsSystem.Data.SqlClient
ImportsSystem.Data.SqlTypes
ImportsMicrosoft.SqlServer.Server
PartialPublicClassStoredProcedures
<Microsoft.SqlServer.Server.SqlProcedure()>_
PublicSharedSubIncSalaries(ByValIncValAsSqlDouble)
 在此增加你的代码
 UsingcnAsNewSqlConnection("contextconnection=true")
 DimcmdAsNewSqlCommand("updatesample.dbo.empset
 sal=sal+"&IncVal.ToString,cn)
 cmd.Connection.Open()
 cmd.ExecuteNonQuery()
 EndUsing
EndSub
EndClass
下面是一个利用VisualBasic.NET2005编写复杂的基于CLR的存储历程,你能够把它公布到SQLServer2005中。该存储历程名为"IncSalaries",它只吸收一个参数-"IncVal"。下面的存储历程复杂地利用参数中供应的值来进步表格"emp"中每位雇员的人为值。
4、.NETCLR存储历程测试
为了测试下面的存储历程,请遵守以下步骤:
·利用"SolutionExplorer"在"testscripts"中翻开"test.sql"(1)。

1

·转到最初一行,并以下修正代码:
--为运转你的工程,请编纂你的工程的Test.sql文件。
--这个文件位于SolutionExplorer的"TestScripts"文件夹下
execIncSalaries50
·转到"Start->Programs->MicrosoftSQLServer2005->ConfigurationTools->SQLServerSurfaceAreaConfiguration"。
·在窗口内,点击"SurfaceAreaConfigurationforFeatures"(2)。

2

·启动CLR集成,以下所示(3)。

3

·按F5实行全部计划。假如它的实行中呈现任何毛病,统统城市被显现于输入窗口中。
·假如存储历程乐成实行,你应当可以看到一切的人为数增添了50。
5、SQLServer2005数据库中的.NETCLR用户界说函数
如今,我们要在我们现有的计划上增加一个存储函数。
·利用"Solutionexplorer",右击"SampleAllInOne"工程并转到"Add->User-definedFunction"(以创立一个新的存储函数)(4)。

4

·以后,呈现"AddNewItem"对话框。在对话框内,选择"Userdefinedfunction"作为模板,输出名字"getNetSalary",最初点击"Add"(5)。

5

一旦创立"getNetSalary.VB",接上去按以下体例修正你的代码:
以下为援用的内容:
ImportsSystem
ImportsSystem.Data
ImportsSystem.Data.SqlClient
ImportsSystem.Data.SqlTypes
ImportsMicrosoft.SqlServer.Server
PartialPublicClassUserDefinedFunctions
<Microsoft.SqlServer.Server.SqlFunction
(DataAccess:=DataACCESSKind.Read)>_
PublicSharedFunctiongetNetSalary(ByValempnoAsSqlString)
AsSqlDouble
 在此增加你的代码
 DimsalAsDouble
 UsingcnAsNewSqlConnection("contextconnection=true")
 DimcmdAsNewSqlCommand("selectsalfrom
 sample.dbo.empwhereempno="&empno.ToString&"",cn)
 cmd.Connection.Open()
 sal=CType(cmd.ExecuteScalar,Double)
 cmd.Dispose()
 EndUsing
 DimhraAsDouble=sal*10/100
 DimtaAsDouble=200
 DimgrossAsDouble=sal+hra+ta
 DimepfAsDouble=sal*5/100
 DimnetAsDouble=gross-epf
 Returnnet
EndFunction
EndClass
然后,利用以下步骤测试下面的存储历程:
·利用"SolutionExplorer"在"testscripts"中翻开"test.sql"(见前1)。
·转到并修正以下代码:
--为运转你的工程,请编纂你的工程的test.sql文件。
--这个文件位于SolutionExplorer的"TestScripts"文件夹下
--execIncSalaries50
selectdbo.getNetSalary(empno)fromsample.dbo.emp
按F5实行该函数,你应当可以看到响应了局。
6、界说.NETCLR用户界说聚合器
如今,我们入手下手在上一节基本上在我们的现无方案上增加一个聚合函数。
·利用"Solutionexplorer",右击"SampleAllInOne"工程并转到"Add->Aggregate"(以创立一个新的聚合函数)(6)。

6

·以后,呈现"AddNewItem"对话框。在该对话框内,选择"Aggregate"作为模板,输出名字"NetSal"并点击"Add"(7)。

7

一旦创立"NetSal.VB",接上去以以下体例修正你的代码:
以下为援用的内容:
ImportsSystem
ImportsSystem.Data
ImportsSystem.Data.SqlClient
ImportsSystem.Data.SqlTypes
ImportsMicrosoft.SqlServer.Server
<Serializable()>_
<Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.Native)>_
PublicStructureNetSal
PublicSumNetSalAsSqlDouble
PublicSubInit()
在此到场你的代码
SumNetSal=0
EndSub
PublicSubAccumulate(ByValvalueAsSqlDouble)
 在此到场你的代码
 DimsalAsDouble=CType(value,Double)
 DimhraAsDouble=sal*10/100
 DimtaAsDouble=200
 DimgrossAsDouble=sal+hra+ta
 DimepfAsDouble=sal*5/100
 DimnetAsDouble=gross-epf
 SumNetSal+=net
EndSub
PublicSubMerge(ByValobjAsNetSal)
 在此到场你的代码
 SumNetSal+=obj.SumNetSal
EndSub
PublicFunctionTerminate()AsSqlDouble
 在此到场你的代码
 ReturnSumNetSal
EndFunction
EndStructure
为了测试下面的存储历程,遵守以下步骤:
·利用"SolutionExplorer",然后在"testscripts"中翻开"test.sql"。
·转到最初一行并修正以下代码:
--为运转你的工程,请编纂你的工程的test.sql文件。
--这个文件位于SolutionExplorer的"TestScripts"文件夹下
--execIncSalaries50
--selectdbo.getNetSalary(empno)fromsample.dbo.emp
selectdbo.NetSal(sal)fromsample.dbo.emp
按F5实行该函数,你应当可以察看到响应的了局。

因此,我们的第一个“米”,就是二进制日志binlog必须是rowbased的。在rowbase下,二进制日志binlog同时记录了更新前后的整行记录。
海妖 该用户已被删除
7#
发表于 2015-3-26 09:07:02 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
深爱那片海 该用户已被删除
6#
发表于 2015-3-11 11:29:25 | 只看该作者
但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
小女巫 该用户已被删除
5#
发表于 2015-3-3 13:36:13 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
若相依 该用户已被删除
地板
发表于 2015-2-13 03:56:16 | 只看该作者
习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。
再现理想 该用户已被删除
板凳
发表于 2015-2-5 17:23:24 | 只看该作者
作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!
灵魂腐蚀 该用户已被删除
沙发
发表于 2015-1-28 05:33:59 | 只看该作者
如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
只想知道 该用户已被删除
楼主
发表于 2015-1-19 07:20:26 | 只看该作者
原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:21

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表