SQL Server 2005中自定义类型(UDT)格式化时间
来源:互联网 发布:网络科学导论 pdf下载 编辑:程序博客网 时间:2024/06/06 14:23
转帖地址:http://www.cnblogs.com/sufei/articles/1719059.html
原文章地址:http://www.cnblogs.com/angleSJW/archive/2010/04/20/1716282.html
1.实现“用户定义的类型”UDT的要求:
这个对应的就是上面的代码 public struct TypeTest:INullable。需要实现Null性,对null性的处理,是在这里处理的。
{
get
{
TypeTest h = new TypeTest();
h.m_Null = true;
return h;
}
}
必须创建一个名为 IsNull 的属性,在从 CLR 代码中确定值是否为空值时,需要使用该属性。SQL Server 发现 UDT 的空值实例时,将使用正常的空值处理方法保持该实例。服务器不会将时间浪费在序列化或反序列化 UDT 上(如果不是必须),也不会将空间浪费在存储空值 UDT 上。这种空值检查在每次从 CLR 引入 UDT 时执行,这意味着始终可以使用 Transact-SQL IS NULL 结构检查空值 UDT。服务器也使用 IsNull 属性来测试实例是否为空值。服务器确定 UDT 为空值后,可以使用其本机空值处理方法。
该方法的处理,是在这段代码中进行处理的:
{
// 用您的代码替换下列代码
return "";
}
具有用户定义序列化格式的 UDT 必须实现 System.Data.IBinarySerialize 接口并提供 Read 和 Write 方法。
对Read和Write方法的实现是在实现接口IBinarySerialize时需要处理的。处理方法如下:
public void Read(System.IO.BinaryReader r)
{
this.result = r.ReadString();
}
public void Write(System.IO.BinaryWriter w)
{
w.Write(this.result);
}
这段代码需要自己手动的写上去,实现Read和Write方法。
下面是编写用户自定义类型的其他要求:
编写用户类型的本地序列化:
为 UDT 选择正确的序列化属性取决于您正尝试创建的 UDT 的类型。 Native 序列化格式利用了一个非常简单的结构,使 SQL Server 能够在磁盘上存储 UDT 的有效本机表示形式。如果 UDT 为简单形式并且只包含以下类型的字段,则建议采用 Native 格式:
bool、byte、sbyte、short、ushort、int、uint、long、ulong、float、double、SqlByte、SqlInt16、SqlInt32、SqlInt64、SqlDateTime、SqlSingle、SqlDouble、SqlMoney, SqlBoolean
由上述类型的字段构成的值类型十分适合于 Native 格式,例如 C# 中的 structs(或者 Visual Basic 中已知的 Structures)。例如,用 Native 序列化格式指定的 UDT 可以包含也用 Native 格式指定的其他 UDT 的字段。如果 UDT 定义更复杂并且所包含的数据类型不在上述列表中,您必须改为指定 UserDefined 序列化格式。
Native 格式具有以下要求:
该类型不得指定 MaxByteSize 的值。
所有字段必须都是可序列化的。
如果 UDT 是在类中定义的并且不是结构,则必须将 StructLayoutAttribute 指定为 StructLayout.LayoutKindSequential。此属性控制数据字段的实际布局并用于强制成员按它们出现的顺序排列。SQL Server 使用此属性确定具有多个值的 UDT 的字段顺序。
用户自定义序列化,在我们自己编写“用户自定义类型”时,需要使用UserDefined,即需要将系统自动生成的代码
[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.Native)]修改为:
[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.UserDefined)]
SqlUserDefinedTypeAttribute 属性的 UserDefined 格式设置使开发人员能够完全控制二进制格式。在将 Format 特性属性指定为 UserDefined 时,您需要在代码中采取以下操作:
指定可选的 IsByteOrdered 特性属性。默认值为 false。
指定 SqlUserDefinedTypeAttribute 的 MaxByteSize 属性。
通过实现 IBinarySerialize 接口,编写代码以便为 UDT 实现 Read 和 Write 方法。
好了,上面的内容是我们再进行编写我们自己的“用户自定义类型”前需要了解的,呵呵。我也是了解了这么多,然后就开始试着写自己的“用户自定义类型”。例子比较简单,就是把输入的时间统一成一个时间格式。希望能达到理解“用户自定义类型”的目的。代码如下:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.UserDefined,MaxByteSize=4000)]
public struct TypeTime : INullable,IBinarySerialize
{
#region//实现IBinarySerizlize的Read和Write方法
public string result;
public void Read(System.IO.BinaryReader r)
{
this.result = r.ReadString();
}
public void Write(System.IO.BinaryWriter w)
{
w.Write(this.result);
}
#endregion
public override string ToString()
{
// 用您的代码替换下列代码
return result;
}
public bool IsNull
{
get
{
// 在此处放置代码
return m_Null;
}
}
public static TypeTime Null
{
get
{
TypeTime h = new TypeTime();
h.m_Null = true;
return h;
}
}
public static TypeTime Parse(SqlString s)
{
if (s.IsNull)
return Null;
TypeTime u = new TypeTime();
// 在此处放置代码
u.result = OneTime(s);
return u;
}
/// <summary>
/// 将输入的时间格式统一
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string OneTime(SqlString str)
{
return Convert.ToDateTime(str.Value).ToShortDateString() + Convert.ToDateTime(str.Value).ToShortTimeString();
}
// 私有成员
private bool m_Null;
}
其中系统自动生成的两个方法
public string Method1()
{
//在此处插入方法代码
return "Hello";
}
// 这是占位符静态方法
public static SqlString Method2()
{
//在此处插入方法代码
return new SqlString("Hello");
}
Method1和Method2可以删掉,替换成自己的方法。
其中需要注意的问题有这么几个:
1.[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.UserDefined,MaxByteSize=4000)]
public struct TypeTest : INullable,IBinarySerialize 需要同时实现INullable和IBinarySeralize两个接口;
2.实现IBinarySeralize的Read和Write两个方法;
3.SqlString是数据库类型,使用的时候,需要使用它的.value属性,转换成数据类型string 才能使用。
好了,这个问题被解决掉了。
碰到问题的时候,要冷静,知道自己想要什么,剩下的就是想办法去拿;自己不知道怎么能拿到,呵呵,就看看谁拿到了,然后跟人家学就好了。话是这么说的,我也是这么告诉自己的,呵呵,有时候,我也会因为某个问题没能解决头大。慢慢来,告诉自己冷静就好,问题的产生,就是用来解决的。开心,好运!
- SQL Server 2005中自定义类型(UDT)格式化时间
- SQL Server 2005中自定义类型(UDT)年龄段
- SQL Server 2005中的CLR总结和自定义类型(UDT)
- 初试SQL SERVER 2005 UDT
- SQL Server 时间格式化
- sql server 时间格式化
- sql server 格式化时间格式
- SQL SERVER 日期时间格式化
- SQL中时间格式化
- sql server时间类型
- SQL SERVER 2005 CLR 部署UDT,Triggers,Functions,Procedure,Aggregates
- SQL SERVER 2005中的日期时间类型
- Sql server中对时间类型的字段转换
- SQL Server CONVERT() 函数 时间格式化
- sql server 中int 类型和时间类型的相互转换
- SQL语句中格式化时间日期格式
- 在SQL语句中格式化时间
- Sql server2005中如何格式化时间日期
- CUBRID自动化测试框架
- JAVA HASH算法
- Confirm确认框无效的解决方法
- jquery制作一个简单的loading--页面参数传递
- 正则表达式语法参考
- SQL Server 2005中自定义类型(UDT)格式化时间
- 解决Flex Library Project中有时候不允许AS脚本文件单独存在的问题
- 数据库链的使用
- ReadDirectoryChangesW的用法
- 对Windows程序中设备上下文DC(device context)的理解
- servlet 笔记
- 小甜瓜的C++学习经历
- 写html静态页面常遇到的问题
- 现在的骗子一点技术含量都没