SQLCLR(四)用户定义类型UDT

2016-02-19 13:49 1 1 收藏

下面请跟着图老师小编一起来了解下SQLCLR(四)用户定义类型UDT,精心挑选的内容希望大家喜欢,不要忘记点个赞哦!

【 tulaoshi.com - 编程语言 】

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

  结果如下

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  想看清楚SQLCLR在对UDT处理机制可以将项目附加到SQL Server 2005进程,在相应的方法设置断点。

  附:我在写随笔查阅资料时,无意中发现的用VB.NET讲解SQLCLR的PDF文档,相信对用VB.NET的兄弟会有些帮助

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1605325.html

延伸阅读
  仅仅依靠Authorware 6.0本身的功能和它所提供的系统函数,来提高Authorware多媒体程序的灵活性是不够的。有些时候,用户需要利用其他的开发工具来生成用户自定义函数,用来拓展程序的功能。本章向大家展示的就是有关于这方面的应用。 1 概述1.1 什么是用户自定义函数 UCD的全名是User Code Dll,是用户自定义函数的缩写。目前任何...
标签: Web开发
From: JavaEye.com prototype提供了一套JavaScript面向对象基础设施,我们可以使用它来进行面向对象编程,定义对象类型方式如下: var Person = Class.create(); Person.prototype = {  initialize : function(name, age) {  this.name = name;  this.age = age;  },  toString : function() {  document.writel...
提到工具型网站,我们首先会有个疑问:大千网络网站众生,究竟什么样的网站才算是工具型网站?它的特征是什么,与其他网站有什么不同? 从网上搜索相关信息,了解到关于该名词的具体解释并没有明确的说法。 为了方便后续的研究,在此先结合之前同学们的研究成果,综合整理一下,提供工具型网站的定义版本,供参考: 所谓工具型网站,顾名思义就...
提到工具型网站,我们首先会有个疑问:大千网络网站众生,究竟什么样的网站才算是工具型网站?它的特征是什么,与其他网站有什么不同? 从网上搜索相关信息,了解到关于该名词的具体解释并没有明确的说法。 为了方便后续的研究,在此先结合之前同学们的研究成果,综合整理一下,提供工具型网站的定义版本,供参考: 所谓工具型网站,顾名思义就...
标签: SQLServer
/*--修改自定义数据类型精度的示例      自定义数据类型一旦被引用,就不能再修改和删除,如果要修改数据的精度,就非常麻烦,下面的示例演示了如何修改      假设要修改的自定义变量名为aa --*/ --1.修改自定义变量类型的名称 exec sp_rename ’aa’,’aa_bak’,’USERDATATYPE...

经验教程

646

收藏

69
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部