托管 UDT 使您能够扩展 SQL Server 的类型系统
2007-11-11 04:48:09 来源:WEB开发网创建程序集
为了在 .NET 中创建可用于 Yukon 的程序集,有几点要求需要注意。这里,我先不讲述创建 .NET 程序集的基本内容。有关此问题的更多信息,请参阅 asp" target="_blank">Microsoft .NET tutorials 中的文章。
您将利用在 UDT 开发中用到的几个命名空间。为了使您的开发工作更为容易,加入如下指令:
using System.Data.Sql;using System.Data.SqlTypes;
System.Data.SqlTypes 命名空间包含能够在程序集中使用的代表 sql server(WINDOWS平台上强大的数据库平台) 本机数据类型的类。System.Data.Sql 命名空间包含将被用作 UDT 的程序集里所必需的各种属性所需要的对象。所有这些类型存在于 System.Data.dll 中。
让我们看一下创建程序集(Yukon 使用)的 CLR 细节。在接下来的部分,我将分析不同的实现需求。如果您已具备 .NET 编程经验,那么对于其中一些内容您将会非常熟悉,而另外一些则是我刚刚提及的新命名空间所特有的内容。
类属性
对于 Beta 1 版,为了使类作为 UDT 使用,必须指定两个属性:Serializable 和 SqlUserDefinedType(如图 1 所示)。Serializable 属性使得类的数据能够被 CLR 序列化为可存储的格式,而 SqlUserDefinedType 则定义诸如序列化格式以及存储结构的最大容量之类的 UDT 特性。SqlUserDefinedType 属性有四个属性(参见sqlserver/art/UDTExtSQLSer02.htm" target="_blank">图 2),其中仅有一个是必需的。在将来的 beta 版中,将不再需要把 UDT 类标记为 Serializable。
(WINDOWS平台上强大的数据库平台) 的类型系统(图二)" />图 1 类的属性
在 Format.SerializationFormat 中可用的三种序列化格式为:UserDefined、Native 以及 SerializedDataWithMetadata。顾名思义,UserDefined 序列化是用户定义的,并且必须用程序集代码来实现。例如,程序集可以进行某些自定义的二进制序列化。为此,该类必须实现 IBinarySerialize 接口,特别是它的 Write 和 Read 方法。这是最为灵活的序列化方法,并且能够像本机格式一样迅速(取决于 Write 和 Read 方法的实现)。
本机格式使用本机 sql server(WINDOWS平台上强大的数据库平台) 二进制序列化。它是最快的,但同样也是最缺乏灵活性的。如果类的公共属性是固定长度的值类型数据类型,那么您可以只使用这种序列化格式。例如,如果属性为数值类型或者日期/时间类型,可以使用本机格式。但是,假如您要公开字符串值属性,将不能使用本机格式。
SerializedDataWithMetadata 使用 .NET 序列化。由于序列化可以自动处理,因此它非常灵活,并且能够为更多的数据类型所用,包括字符串以及引用类型。遗憾的是,它也是最慢的,其执行速度比本机格式慢了约一个数量级。更重要的是,在以后的 beta 版本中将不支持 SerializedDataWithMetadata。
同样,Microsoft 建议对于任何新代码不使用 SerializedDataWithMetadata。如果您已经使用,应该仅在开发过程中而决不要在产品中使用它。用 SerializedDataWithMetadata 创建的类应该转换为 UserDefined 格式并应实现 IBinarySerialize 接口,使用 Read 和 Write 方法来定义公共类成员的自定义序列化。
这里有一个有关这些类属性的示例,这些属性满足了 UDT 的最低要求:
// C#[Serializable][SqlUserDefinedType (Format.Native)]' Visual Basic .NET<Serializable(), SqlUserDefinedType(Format.Native)>
正如您看到的,我使用了这两个必需的属性,而对于 SqlUserDefinedType 属性,我设置了它所需的属性。
更多精彩
赞助商链接