开发CLR数据库对象:CLR存储过程(上)

日期: 2009-10-22 作者:McGraw-Hill翻译:冯昀晖 来源:TechTarget中国 英文

存储过程是最常见的数据库对象之一,你可以使用某一种.NET语言创建存储过程。CLR存储过程的最大价值之一是替换现存的扩展存储过程。T-SQL只可以访问数据库的资源。为了访问外部系统资源,微软已经在SQL Server中提供了支持,叫做扩展存储过程(extended stored procedure)。

扩展存储过程是不受管理的动态库,运行在SQL Server进程空间,基本上可以做到任何标准可执行程序能做到的事,包括访问数据库外部的系统资源,比如读写文件系统,读写注册表和访问网络。   然而,因为扩展存储过程与SQL Server数据库引擎运行在相同的进程空间,所以在扩展存储过程中的程序bug,……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

存储过程是最常见的数据库对象之一,你可以使用某一种.NET语言创建存储过程。CLR存储过程的最大价值之一是替换现存的扩展存储过程。T-SQL只可以访问数据库的资源。为了访问外部系统资源,微软已经在SQL Server中提供了支持,叫做扩展存储过程(extended stored procedure)。扩展存储过程是不受管理的动态库,运行在SQL Server进程空间,基本上可以做到任何标准可执行程序能做到的事,包括访问数据库外部的系统资源,比如读写文件系统,读写注册表和访问网络。

  然而,因为扩展存储过程与SQL Server数据库引擎运行在相同的进程空间,所以在扩展存储过程中的程序bug,内存非法使用和内存泄露都可能潜在地影响SQL Server数据库引擎。CLR存储过程解决了这一问题,因为它们是用受管理的代码实现的,运行在CLR的范围之内。CLR存储过程的另一个优势是取代包含复杂逻辑和包括业务规则的现有T-SQL存储过程,这些存储过程难以用T-SQL实现。

  CLR存储过程可以利用.NET Framework类库提供的内建功能,使得添加像复杂数学运算或者数据加密这类功能变得相对比较容易。另外,既然CLR存储过程是编译执行的,而不是像T-SQl那样是解释执行的,那么他们对于那些执行多次的代码,可以带来巨大的性能优势。然而,CLR存储过程本身并不是专门为取代T-SQL存储过程而设计的。T-SQL存储过程仍然是数据为中心的存储过程的最佳选择。

  要在Visual Studio 2005中创建CLR存储过程,首先选择“新建|项目”选项,然后选择“SQL Server项目”模版,如下图3-3所示:

  图3-3:创建一个新的SQL Server存储过程项目

  给项目指定一个名称,然后点击确定创建项目。在本例中,你可以看到我使用“usp_ImportFile”作为我的存储过程名称。这个存储过程展示了你怎样用CLR存储过程取代扩展存储过程。在本例中,CLR存储过程将读取一个文件的内容,然后把内容存储到SQL Server数据库的列中。在给项目命名之后,点击确定。在Visual Studio生成项目代码之前,它会显示新建数据库引用对话框,如下图3-4所示。

  图3-4:新建数据库引用对话框

  Visual Studio 2005使用“新建数据库引用”对话框创建指向SQL Server 2005系统的连接。该连接将用来调试和部署完成后的项目。拉开“服务器名称”下拉列表,选择你想在本项目中使用的SQL Server服务器名称。然后选择你想使用的认证类型,选择用来部署CLR存储过程的数据库。在图3-4中你可以看到我已经选择了名为SQL2005的SQL Server系统。该项目将使用Windows集成身份验证连接,存储过程会被部署到“AdventureWorks”数据库。你可以通过点击测试连接按钮验证连接属性。连接属性按照你的意图设置好了以后,点击确定。所有需要的引用会自动添加到SQL Server项目中,Visual Studio 2005会生成一个SQL Server启动项目。

  接下来,创建CLR存储过程。你可以选择“项目|添加存储过程”选项,显示“Visual Studio已安装模版”对话框。如下图3-5所示。

  图3-5:添加一个CLR存储过程

  在“添加新项目”对话框中,从模版中显示的模版列表里选择“存储过程”选项,然后在对话框底部的名称文本框中指定存储过程的名称。这里你可以看到存储过程将用“usp_ImportFile.vb”源文件创建。Visual Studio 2005将为给存储过程给你的项目中添加一个新类。生成的类文件在你的存储过程名之后命名,而且所有需要的导入目录和该存储过程的启动代码都会自动添加。你可以看到SQL Server CLR存储过程模版,如图3-6所示。

  图3-6:CLR存储过程模版

  默认情况下,SQL Server .NET数据提供器会自动作为引用添加进来,同时包括 System.Data.SqlServer命名空间的声明。另外,你还可以看到 System.Data引用,它提供了对ADO.NET的支持和对它面向数据的对象(例如DataSet)的支持,你还可以看到System.Data.SqlTypes命名空间,它提供对SQL Server数据类型的支持。

  接下来您就可以填写剩下的代码,来使存储过程工作了。下面的例子展示了创建一个简单的CLR存储过程需要的源代码,该存储过程的功能是把一个文件中的内容导入到数据库中的一个varchar类型或者text类型的字段列中:

  Imports System
  Imports System.Data
  Imports System.Data.Sql
  Imports System.Data.SqlTypes
  Imports Microsoft.SqlServer.Server
  Imports System.IO
  Partial Public Class StoredProcedures
  _
  Public Shared Sub usp_ImportFile _
  (ByVal sInputFile As String, ByRef sColumn As String)
  Dim sContents As String
  Try
  Dim stmReader As New StreamReader(sInputFile)
  sContents = stmReader.ReadToEnd()
  stmReader.Close()
  sColumn = sContents
  Catch ex As Exception
  Dim sp As SqlPipe = SqlContext.Pipe()
  sp.Send(ex.Message)
  End Try
  End Sub
  End Class

  在这段代码中,第一个要注意的要点是导入Microsoft.SqlServer.Server命名空间的指令。它使得“usp_ImportFile”项目使用SQL Server .NET数据提供器时不需要引用完整的限制名称。第二点要注意的是方法名之前的属性;它告诉编译器该方法将会编译为一个SQL Server存储过程。接下来,你可以看到这个存储过程默认的类名被设置为“StoredProcedures”。这个类包含了一个名为“usp_ImportFile”的共享方法,该方法接受两个参数:一个字符串参数,用来指定待导入文件的文件名;第二个输入参数指定用来存储文件内容的数据库字段列名。在C#语言中,该方法必须定义为静态(static)类型。在VB.NET代码中,该方法需要被定义为共享(Shared)的。

  在“usp_ImportFile”方法内部,声明了一个名为“sContents”的字符串对象,它用来存储文件的内容。接下来,Try-Catch代码段用来捕获在文件导入过程中可能出现的任何异常。在Try-Catch代码段内,创建了一个新的名为“stmReader”的StreamReader ,用来从操作系统中读取文件。待读取文件的文件名参数会被传递到StreamReader的实例调用中。然后使用“stmReader”的 “ReadToEnd”方法读取文件的整个内容到字符串变量“sContent”中。在文件内容被读取之后,流读取变量“stmReader”被关闭,“sContents”变量的内容会被赋到SQL Server的字段列中。

  如果在输入文件读取过程中出现了任何错误,Try-Catch结构中的Catch代码段会被执行。在Catch代码段中,创建有一个名为“sp”的SqlPipe对象,它用来把错误信息送回到存储过程的调用者那里。这段代码使用了SqlPipe对象,它是在CLR和调用代码之间传递信息的管道。这里,SqlPipe对象使存储过程可以传递信息给外部调用者。

相关推荐