【 tulaoshi.com - 编程语言 】
                             
                            /*********************************** 
作者:trieagle(让你望见影子的墙) 
日期:2009.8.14 
注: 转载请保留此信息 
************************************/ 
使用c#构造date数据类型 
在sql server2005没有实现date类型,但是提供了很好的扩展性,可以利用CLR来构造date类型。有一部分是参考了Fc的代码写的。 
步骤: 
1、在vs 2005中新建项目,一次选择c#——数据库——sql server项目,输入项目名称 
2、选择要连接的数据库 
3、在项目名称右键,添加——新建项——用户定义的类型——输入类型名称 
4、代码如下: 
代码如下: 
using System; 
using System.Data; 
using System.Data.SqlClient; 
using System.Data.SqlTypes; 
using Microsoft.SqlServer.Server; 
[Serializable] 
[Microsoft.SqlServer.Server.SqlUserDefinedTypeFormat.UserDefined ,IsByteOrdered=true,MaxByteSize =20,ValidationMethodName="ValidateDate")] 
public struct date : INullable,IBinarySerialize 
{ 
// 私有成员 
private bool m_Null; 
private string m_date; 
public override string ToString() 
{ 
if (this.m_Null) 
return "null"; 
else 
{ 
return this.m_date; 
} 
} 
public bool IsNull 
{ 
get 
{ 
return m_Null; 
} 
} 
public static date Null 
{ 
get 
{ 
date h = new date(); 
h.m_Null = true; 
return h; 
} 
} 
public static date Parse(SqlString s) 
{ 
if (s.IsNull || (!s.IsNull && s.Value.Equals(""))) 
return Null; 
else 
{ 
date u = new date(); 
string[] xy = s.Value.Split(" ".ToCharArray()); 
u.m_date = xy[0]; 
if (!u.ValidateDate()) 
throw new ArgumentException ("无效的时间"); 
return u; 
} 
} 
public string _date 
{ 
get 
{ 
return this.m_date; 
} 
set 
{ 
m_Null = true; 
m_date = value; 
if (!ValidateDate()) 
throw new ArgumentException("无效的时间"); 
} 
} 
public void Write(System.IO.BinaryWriter w) 
{ 
byte header = (byte)(this.IsNull ? 1 : 0); 
w.Write(header); 
if (header == 1) 
{ 
return; 
} 
w.Write(this.m_date); 
} 
public void Read(System.IO.BinaryReader r) 
{ 
byte header = r.ReadByte(); 
if (header == 1) 
{ 
this.m_Null = true; 
return; 
} 
this.m_Null = false ; 
this.m_date = r.ReadString(); 
} 
private bool ValidateDate() //判断时间是否有效 
{ 
try 
{ 
DateTime dt = Convert.ToDateTime(m_date); 
return true; 
} 
catch 
{ 
return false; 
} 
} 
}  
5、按F5进行部署 
6、测试: 
代码如下: 
CREATE TABLE tb(id int,dt dbo.Date DEFAULT CONVERT(dbo.Date,CONVERT(VARCHAR(10),GETDATE(),120))); 
insert into tb(id) values(1) 
SELECT id,dt=dt.ToString() FROM tb; 
/* 
结果: 
id dt 
1 2009-08-14 
*/ 
DROP TABLE tb;  
注: 
1、 如果要对date类型进行日期的加减,可以调用ToString()方法输出为字符串,然后转化为datetime类型,然后再进行日期的计算。 
2、 不能直接使用select * from tb 来输出dt列的值,这样输出的是一串二进制数