--
--9.8.1节示例
--
//使用C#创建Point类型
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
//以下Attribute标明结构体Point是可序列化的,作为用户定义数据类型使用
[Serializable]
[SqlUserDefinedType(Format.Native)]
public struct Point : INullable //用户定义类型必须满足接口INullable
{
//以下是定义结构体的内部变量和属性
private Int32 x;
private Int32 y;
private bool is_Null;
public Int32 X //X坐标
{
get { return (this.x); }
set { x = value; }
}
public Int32 Y //Y坐标
{
get { return (this.y); }
set { y = value; }
}
public bool IsNull //是否为空
{
get { return is_Null; }
}
public static Point Null //定义一个空对象属性
{
get
{
Point pt = new Point();
pt.is_Null = true;
return pt;
}
}
//重写ToString方法,指明在以字符串形式输出该类型时输出的内容
public override string ToString()
{
if (this.IsNull)
{
return "NULL"; //输出NULL字符串
}
else
{
return this.x + "," + this.y;//输出x,y的形式表示一个二维点
}
}
public double Len() //定义函数Len,用于返回该点到原点的距离
{
if (IsNull)
{
return 0;
}
return Math.Sqrt(x * x + y * y);
}
//定义静态函数Parse,指明如何将字符串转换为该用户定义数据类型
public static Point Parse(SqlString s)
{
if (s.IsNull) //如果传入为空,则返回空
{
return Null;
}
string str = s.Value;
string[] xy = str.Split(',');
Point pt = new Point();
pt.X = Convert.ToInt32(xy[0]);
pt.Y = Convert.ToInt32(xy[1]);
return pt; //返回Point对象
}
}
--创建CLR用户定义类型
CREATE TYPE Point --创建用户定义数据类型
EXTERNAL NAME [TestSQLAssembly].Point --指定该数据类型在程序集中的位置
--或者可以直接简写为:
CREATE TYPE Point
EXTERNAL NAME [TestSQLAssembly]
--使用CLR用户定义类型
CREATE TABLE testPoint --创建一个测试表
(
c1 Point--使用CLR用户定义数据类型作为c1的数据类型
)
GO
INSERT INTO testPoint VALUES('12,2') --插入一些值
INSERT INTO testPoint VALUES('12,4')
INSERT INTO testPoint VALUES('3,4')
GO
SELECT c1.X AS X,c1.Y AS Y,c1.Len() AS LEN --调用CLR数据类型定义的属性和方法
FROM testPoint