开发CLR数据库对象:用户定义类型(上)

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

与.NET CLR整合给SQL Server 2005带来的另一个新特性是提供了用户定义类型(UDT)的功能。使用用户定义类型UDT,你可以扩展SQL Server提供的原始类型,增加你的应用或者环境特有的数据类型。   在下面的例子中,你将看到怎样创建一个代表了性别代码的用户定义类型:“M”代表男性,“F”代表女性。因为你可以把该数据存储在一个标准的一个字节的字符字段里,使用用户定义类型可以确保该字段只能接受这两种值,不需要额外的触发器,限制条件或者其他数据校验技术。

  使用Visual Studio 2005创建用户定义类型,需要先选择“新建|项目”选项,指定你的项目名称,然后点击确定创……

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

与.NET CLR整合给SQL Server 2005带来的另一个新特性是提供了用户定义类型(UDT)的功能。使用用户定义类型UDT,你可以扩展SQL Server提供的原始类型,增加你的应用或者环境特有的数据类型。

  在下面的例子中,你将看到怎样创建一个代表了性别代码的用户定义类型:“M”代表男性,“F”代表女性。因为你可以把该数据存储在一个标准的一个字节的字符字段里,使用用户定义类型可以确保该字段只能接受这两种值,不需要额外的触发器,限制条件或者其他数据校验技术。

  使用Visual Studio 2005创建用户定义类型,需要先选择“新建|项目”选项,指定你的项目名称,然后点击确定创建项目。在本项目中,我给新建的用户定义类型起名为“Gender”。在给项目指定名称,并点击“确定”以后,为了部署项目到指定的SQL Server数据库服务器,我用需要的连接值在“新建数据库引用”对话框填好。接下来,我点击“项目|添加用户定义类型”选项,显示“添加新项目”对话框。如图3-11所示:

  图3-11:创建.NET SQL Server用户定义类型

  表3-1:需要的用户定义类型方法

  从SQL Server模板列表中选择“用户定义类型”。输入你想定义的类名称,点击打开,让Visual Studio给用户定义类型生成启动项目文件。启动项目文件实现了所有用户定义类型SQL Server 2005需要的四个方法。这些方法需要实现SQL Server用户定义类型的接口契约需求(你可以添加代码,让用户定义类型执行有意义的操作)。需要的这四个用户定义类型方法显示在了表3-1中。你可以看到为“M(男性)”和“F(女性)”实现的用户定义类型的完整“Gender”类。代码如下:

  Imports System
  Imports System.Data
  Imports System.Data.Sql
  Imports System.Data.SqlTypes
  Imports Microsoft.SqlServer.Server
  Imports System.IO
  _
  _
  Public Structure Gender
  Implements INullable, IBinarySerialize
  Public Sub Read(ByVal r As BinaryReader) _
  Implements IBinarySerialize.Read
  m_value = r.ReadString.ToString()
  End Sub
  Public Overrides Function ToString() As String
  If m_value.IsNull = False Then
  Return m_value.Value
  Else
  Return Nothing
  End If
  End Function
  Public ReadOnly Property IsNull() As Boolean _
  Implements INullable.IsNull
  Get
  If m_value.IsNull = True Then
  Return True
  Else
  Return False
  End If
  End Get
  End Property
  Public Shared ReadOnly Property Null() As Gender
  Get
  Dim h As Gender = New Gender
  h.m_Null = True
  Return h
  End Get
  End Property
  Public Shared Function Parse(ByVal s As SqlString) As Gender
  If s.IsNull Then
  Return Null
  End If
  Dim u As Gender = New Gender
  u.Value = s
  Return u
  End Function
  ' Create a Value Property
  Public Property Value() As SqlString
  Get
  Return m_value
  End Get
  Set(ByVal value As SqlString)
  If (value = "M" Or value = "F") Then
  m_value = value
  Else
  Throw New ArgumentException _
  ("Gender data type must be M or F")
  End If
  End Set
  End Property
  ' Private members
  Private m_Null As Boolean
  Private m_value As SqlString
  End Structure
  要创建用户定义类型,代码必须遵从一定的规则。类的属性必须是“serializable”的。类必须实现“INullable”接口,类名必须设置为用户定义类型的名称。你可以根据需要增加实现“IComparable”接口。在本例中,“Gender”是类名。在代码中靠近结尾的部分,你可以看到一个私有变量名为“m_value”,它是为保存数据类型的值而声明的。

  像其他CLR数据库对象一样,属性在CLR用户定义类型的构建过程中扮演者着重要角色。SQL Server用户定义类型属性可接受的属性值已列举在表3-2中。

  代码中要注意的第一件事就是这里实现了“INullable”和“IBinarySerialize”接口。“INullable”接口是用户定义类型必须实现的。“IBinarySerialize”接口是用户定义类型使用“Format.UserDefined”属性所必须的。因为本例中使用了字符串数据类型,所以需要使用“Format.UserDefined”属性,这意味着这个用户定义类型还需要编写代码处理用户定义类型的序列化。在实现上来说,这意味着该类必须实现“IBinarySerialize”的“Read”方法和“Write”方法,你可以在它随后的代码段中看到这一点。

  一开始,你对于使用“IBinarySerialize”接口可能似乎有一些恐惧,但是,一旦你看了“Read”和“Write”方法,它实际上就很简单了。“Read”方法简单地使用了“ReadString”方法把值赋给用户定义类型的“m_value”变量(包含了用户定义类型的值)。同样,“Write”方法使用“Write”方法序列化“m_value”变量的内容。

  表3-2:用户定义类型Attribute属性

  “ToString”方法检查看“m_value”变量的内容是否为null。如果是null的话,那么就会返回字符串“null”。否则,“m_value”的“ToString”方法返回内容的字符串值。

  接下来的代码段定义了“IsNull”属性。该属性的get方法检查“m_value”变量的内容,如果“m_value”为“null”,则返回值true。否则,get方法返回false。接下来,你可以看到Null方法,它是模板为满足用户定义类型对null的需求而生成的。

  “Parse”方法接受字符串参数,它存储在对象的Value属性中。你可以看到在下面一点的代码中看到Value属性的定义。“Parse”方法必须声明为静态static的,或者如果你用的是VB.NET,它必须声明为共享Shared属性。

  “Value”属性是本示例实现特有的。在本例中,“Value”属性用来存储和查询用户定义类型的值。它还负责编辑容许值。在set方法中,你可以看到只有值“M”和“F”是允许的。如果使用了其他值,会引发并抛出异常通知调用者“Gender数据类型的值只能是‘M’或者‘F’”。

相关推荐