托管 UDT 使您能够扩展 SQL Server 的类型系统

时间:2007-02-12 00:00:00  来源:  作者:

当 IsByteOrdered 为 true 时,SQL Server 无需创建 UDT 的托管实例即可在所有的比较中使用该 UDT 的二进制表示形式。这将允许我前面提到过的功能及其他功能,包括可索引、主键和外键、检查和唯一约束、ORDER BY、GROUP BY 和 PARTITION BY 子句、顺序比较以及比较运算符。www.iTbulo.comR9jWYOn

如果您的 UDT 需要这些功能中的任何一种,则必需把 IsByteOrdered 设置为 true。但是,需要注意的一点是,只有当 UDT 的设计者能够保证序列化的二进制数据完全与信息的语义顺序相同时才能将 IsByteOrdered 设置为 true。为了更好地理解这一点,让我们来看一个例子。www.iTbulo.comR9jWYOn

如果 Point 类代表空间中的一点,X 和 Y(二者都定义为 Int32)是它仅有的属性,它能够作为二进制排序的候选吗? 换句话说,能够认为其中任何一个 Point 小于或大于另外一个 Point 吗? 例如,将 PointA (4, -1) 与 PointB (2, 3) 进行比较,其中哪个更大呢? 对于该问题没有一个简单的答案,正如没有一个简单的方法来存储二进制数据以反映这一顺序一样。因此,Point 不是一个能够实现二进制排序的类。www.iTbulo.comR9jWYOn

Yukon 只有在 UDT 值的序列化表示形式已经是二进制排序时,才支持在其值上使用比较运算符(以及依赖于比较支持的相关功能,如 GROUP BY 和 ORDER BY)。UDT 的设计者通过在类型定义中将 IsByteOrdered 设置为 true 来表明序列化表示形式具有此属性。同样,数据的二进制表示形式的排序必须与类型的语义排序等价。换句话说,在序列化字节上执行比较操作产生的结果与在托管代码中执行比较的结果相同。www.iTbulo.comR9jWYOn

应该注意的是,在本机格式中,如果设置了该属性,SQL Server 将保证二进制表示形式是可比较的。在 UserDefined 格式中,选取一个具有该属性的规范化算法是开发人员的责任。并且,三种序列化格式都支持等于 (=) 以及不等于 (!=) 比较运算符。Native 和 UserDefined 序列化格式另外还支持大于 (>)、小于 (<)、大于或等于 (>=) 以及小于或等于 (<=) 比较运算符。www.iTbulo.comR9jWYOn

返回页首返回页首 为空性

尽管所有的 Yukon UDT 都识别空值,然而为了让 UDT 能够将空值接受为一个有效值,类必须实现 INullable 接口。这将由以下语句完成:www.iTbulo.comR9jWYOn

// C# public class MyClass: INullable ' Visual Basic .NET Public Class MyClass Implements INullable

INullable 包含一个唯一的属性 IsNull,因而类必须这样实现:www.iTbulo.comR9jWYOn

// C# public bool IsNull { get {return is_Null;} } ' Visual Basic .NET Public ReadOnly Property IsNull() As Boolean Implements INullable.IsNull Get Return (is_Null) End Get End Property

is_Null 变量是私有变量,并保存实例的空状态。最后,类必须拥有一个名为 Null 的静态属性,以返回 UDT 的一个空值实例。如果实例确实为空,将允许 UDT 返回一个空值,如图 3 中的代码所示。www.iTbulo.comR9jWYOn

返回页首返回页首 支持的转换

UDT 必须支持到字符串的转换以及来自字符串的转换。为此,类需要在其接口中定义两个公共方法。第一个是静态方法 Parse,允许将字符串值转换为 UDT 实例。以下是该函数的定义:www.iTbulo.comR9jWYOn

// C# public static MyClass Parse(SqlString s) ' Visual Basic .NET Public Shared Function Parse(ByVal s As SqlString) As MyClass

第二个方法是实例方法 ToString 的重写方法,如下所示:www.iTbulo.comR9jWYOn

// C# public override string ToString() ' Visual Basic .NET Public Overrides Function ToString() As String

该方法使 UDT 转换为字符串值。虽然并非强制,不过这两种方法的正确实现应该是互逆的。也就是说,这两种方法应该能够使用 Parse 将字符串转换为 UDT,然后用 ToString 方法将其转换回原始的字符串值。www.iTbulo.comR9jWYOn

返回页首返回页首 其他要求

除了我之前提到的功能之外,您应该知道还有几个其他的要求。由于类需要有一个构造函数,因此需要在 UDT 中实现它。UDT 类需要一个零参数公共构造函数,如下所示:www.iTbulo.comR9jWYOn

// C# public MyClass () { }

另外,可以创建其他的公共构造函数。这是类型的公共成员能够被重载的唯一时机。下面是在创建 UDT 时您应该知道的一些其他限制:www.iTbulo.comR9jWYOn

在 .NET 代码中不允许有可更改的静态数据成员。www.iTbulo.comR9jWYOn

不支持固定长度字符串以及固定长度二进制数据类型。www.iTbulo.comR9jWYOn

所有类名、方法名和属性名必须与 Yukon sysname 系统数据类型相一致,亦即您的公共名称不能超过 128 个字符。www.iTbulo.comR9jWYOn

不支持继承;Yukon 不能使用继承,尽管继承依然能够存在于 .NET 代码中。www.iTbulo.comR9jWYOn




文章评论

共有 0人发表了评论 查看完整内容

推荐教程

最新教程