与.NET CLR整合给SQL Server 2005带来的另一个新特性是提供了用户定义类型(UDT)的功能。使用用户定义类型UDT,你可以扩展SQL Server提供的原始类型,增加你的应用或者环境特有的数据类型。 在下面的例子中,你将看到怎样创建一个代表了性别代码的用户定义类型:“M”代表男性,“F”代表女性。因为你可以把该数据存储在一个标准的一个字节的字符字段里,使用用户定义类型可以确保该字段只能接受这两种值,不需要额外的触发器,限制条件或者其他数据校验技术。
使用Visual Studio 2005创建用户定义类型,需要先选择“新建|项目”选项,指定你的项目名称,然后点击确定创……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
![TechTarget微信公众号二维码](/wp-content/uploads/res/images/spriteimg/ttweixin.jpg)
TechTarget
官方微博
![TechTarget中国官方微博二维码](/wp-content/uploads/res/images/spriteimg/ttweibo.jpg)
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 |
像其他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’”。
作者
翻译
相关推荐
-
云端SQL Server高可用性最佳做法
与内部部署相比,在云端运行SQL Server可为数据库软件用户提供更多的灵活性和可扩展性,也可能更省钱。但云 […]
-
绘制数据关系图的利器:SQL Server 图像数据库工具
SQL Server 2017新增了图形数据库功能,你可以使用图结构来表示不同数据元素之间的关系。
-
如何在Azure部署时选择合适的SQL Server?
想要在Azure上运行SQL Server,企业一般会面临两种选择:在Azure虚拟机上安装SQL Server或使用Azure SQL Database。
-
Linux支持的引入 推动了SQL Server 2016集成服务的发展
随着SQL Server的不断发展,集成服务也在发生相应的变化。在最新的SSIS更新中,增加Linux支持和SQL Server 2016升级向导。