马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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同时记录了更新前后的整行记录。 |