用戶自定義類型是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; }
}
// 私有成員
private bool m_Null;
public byte[] b;
public void Read(BinaryReader r)
{
name = r.ReadString();
sex = r.ReadString();
age = r.ReadInt32();
m_Null = r.ReadBoolean();
}
public void Write(BinaryWriter w)
{
w.Write(name);
w.Write(sex);
w.Write(age);
w.Write(m_Null);
}
}
部署後在SQL Server 2005中執行下面的語句
create table UdtTest (Id int not null, p Person not null)
insert into UdtTest values(1, 'David,24歲,男')
select id, convert(nvarchar(25),p) from UdtTest
drop table UdtTest
結果如下
想看清楚SQLCLR在對UDT處理機制可以將項目附加到SQL Server 2005進程,在相應的方法設置斷點。
附:我在寫隨筆查閱資料時,無意中發現的用VB.NET講解SQLCLR的PDF文檔,相信對用VB.Net的兄弟會有些幫助