存储过程
最近一个项目中遇到一个转换FileTime的问题.时间是在C#中用DateTime.ToFileTime写入数据库中,这在存储过程中判断年和季度成了问题,怎么样才能把时间转换为正常的时间格式呢?Sql server中又没有FromFileTime对应的方法?其实很简单用C#写一个转换时间的Dll然后在存储过程中调用就可以了.
转换时间的类如下:
[Guid("729ba6af-3eff-4b75-b43b-d951a190dbe6")]
public class FileTimeConvert
{
public FileTimeConvert()
{
}
public string ConvertTime(long fileTime)
{
string retVal = string.Empty;
if (fileTime > 0)
{
DateTime dt = DateTime.FromFileTime(fileTime);
retVal = dt.ToString();
}
return retVal;
}
}
注意这个Guid我们在存储过程中引用要用到这个Guid.
为方便可能在多处需要调用,我们专门写一个存储过程
如下:
CREATE PROCEDURE spu_ConvertFileTimeToNormal
ticks BIGINT,
returnval varchar(40) output
AS
DECLARE src varchar(255)
DECLARE desc varchar(255)
DECLARE object int
DECLARE hr int
EXEC hr = sp_OACreate '{729ba6af-3eff-4b75-b43b-d951a190dbe6}',object OUT
IF hr = 0 --如果创建对象成功
BEGIN
EXEC hr = sp_OAMethod object,'ConvertTime',returnval OUT,ticks
print returnval
print hr
if(hr <> 0)
BEGIN
EXEC sp_OAGetErrorInfo object, src OUT, desc OUT
SELECT hr=convert(varbinary(4),hr), ,
END
END
ELSE
BEGIN
--print hr
print 'Create Object ConvertTime failed'
EXEC sp_OAGetErrorInfo object, src OUT, desc OUT
SELECT hr=convert(varbinary(4),hr), ,
RETURN
END
EXEC hr = sp_OADestroy object
IF hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo object
RETURN
END
GO
这个时候我们还差最后一步注册DLL了
在.net 命令行下输入 regasm -codebase path
好了,现在我们就可以在其他存储过程中调用这个存储过程返回正常的时间了.
给个小例子:
EXEC spu_ConvertFileTimeToNormal CreateTime,NormalTime OUT
CreateTime:FileTime格式
NormalTime :正常的时间格式字符串(spu_ConvertFileTimeToNormal 存储过程返回值)
这个简单的小例子说明了我们怎么样在存储过程中调用DLL
是不是你解决问题又多了一个选择了呢?