程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQLCLR(四)用戶定義類型UDT

SQLCLR(四)用戶定義類型UDT

編輯:關於SqlServer

  用戶自定義類型是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的兄弟會有些幫助

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved