項目中遇到一個轉換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), Source=@src, Description=@desc
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), Source=@src, Description=@desc
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
是不是你解決問題又多了一個選擇了呢?