用户自定义类型是SQL Server 2005的新特性。和前几篇文章介绍的SQLCLR相比,UDT相对有此复杂。UDT也有许多限制和必须遵守UDT规范。UDT的二进制不能超过8000个字节,必须包含一个null值表示,因为SQLServer的数据类型是允许null值的。
UDT可以是结构或类。如果是类的话需加[StructLayout(LayoutKind.Sequential)]
标签(属性),这是保证序列化时不改变属性的次序。
现在看一段代码 using System; using System.IO; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; [Serializable] [Microsoft.SqlServer.Server.SqlUserDefinedType(Format.UserDefined, MaxByteSize = 1024)] public struct Person : INullable, IBinarySerialize { public override string ToString() { // 用您的代码替换下列代码 return FormatU(); } public bool IsNull { get { // 在此处放置代码 return m_Null; } } public static Person Null { get { Person h = new Person(); h.m_Null = true; return h; } } public static Person Parse(SqlString s) { if (s.IsNull) return Null; Person u = new Person(); string value = s.Value; if (value == "null") return Null; string[] parts = value.Split(','); u.name = parts[0]; u.age = ParseAge(parts[1]); u.sex = parts[2]; return u; } // 这是占位符方法 public string FormatU() { //在此处插入方法代码 return string.Format("名称:{0},年龄:{1},性别:{2}", name, age, sex); } // 这是占位符静态方法 public static int ParseAge(string str) { //在此处插入方法代码 return int.Parse(str.Substring(0, str.LastIndexOf("岁"))); } // 这是占位符字段成员 private int age; public int Age { get { return age; } set { age = value; } } private string name; public string Name { get { return name; } set { name = value; } } private string sex; public string Sex { get { return sex; } set { sex = value; } }