SQLCLR(四)用户定义类型UDT
用户自定义类型是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; }

}


// 私有成员
UDT可以是结构或类。如果是类的话需加[StructLayout(LayoutKind.Sequential)]
标签(属性),这是保证序列化时不改变属性的次序。
现在看一段代码