WEB开发网
开发学院数据库MSSQL Server SQLCLR(四)用户定义类型UDT 阅读

SQLCLR(四)用户定义类型UDT

 2009-03-30 10:25:45 来源:WEB开发网   
核心提示: 用户自定义类型是SQL Server 2005的新特性,和前几篇文章介绍的SQLCLR相比,SQLCLR(四)用户定义类型UDT,UDT相对有此复杂,UDT也有许多限制和必须遵守UDT规范,UDT可以是结构或类,如果是类的话需加[StructLayout(LayoutKind.Sequential)]标签(属

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

1 2  下一页

Tags:SQLCLR 用户 定义

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接