2012-05-24 108 views
1

我將excel文件上傳到服務器,然後將其行和列插入到數據庫中。我一行一行地做,但我有日期時間的問題。插入146行數據後,出現如下錯誤:在插入到數據庫之前更改日期格式

將varchar數據類型轉換爲datetime數據類型導致超出範圍的值。 該聲明已被終止。

問題是它的日期。在excel文件中,日期格式爲dd/mm/yyyy,但數據庫將它們視爲mm/dd/yyyy,因此當日期超過12日時,我會得到超出範圍的錯誤。我不想改變我的Excel文件,所以有一個選項,我可以改變數據庫(MS SQL服務器),或者我必須使用C#代碼,它們可以在插入之前將它們轉換...謝謝...

+0

用'DateTime'數據類型將是一件好事 – V4Vendetta

回答

2

如果您知道來自Excel的格式,則最好使用特定的IFormatterProvider將字符串解析爲C#中的DateTime。

這裏的問題是沒有關於來自Excel的字符串的文化信息,所以轉換爲DateTime只能考慮到數據庫的文化 - 在這種情況下是一種反轉月份和日期的格式。這將意味着超出範圍的日期(如您的情況)或模棱兩可的日期永遠不會正確解析。

在C#代碼中,您可以指定一種實現IFormatterProvider的文化,en-GB具有您指定的Excel日期的日期格式。 MSDN documentation中的示例演示瞭如何執行此操作。我的例子介紹瞭如何將字符串轉換與EN-GB日期格式爲DateTime是文化無關:

var culture = CultureInfo.CreateSpecificCulture("en-GB"); 
var date = DateTime.Parse("13/12/2011", culture); 

SQL與文化同樣的問題。任何對文化敏感的數據的字符串表示總是會丟失當前的文化。轉換數據時,如果文件與服務器不同,則需要指定文化。

可以在SQL和硬編碼做到這一點,你正試圖轉換的字符串格式(103代表EN-GB日期格式DD/MM/YYYY):

declare @datestring varchar(10) = '13/12/2011' --13th December 
-- 103 is the format code for UK dates with full yyyy century. 
select convert(date, @datestring, 103) --gives 2011-12-13 

declare @datestring2 varchar(10) = '05/04/2011' --5th April, ambiguous date. 
select convert(date, @datestring2, 103) --gives 2011-04-05 

Convert/cast format codes.

同樣值得注意的是,這也將正確地轉換模糊的日期,例如2011年5月4日,如果文化未知,這將扭轉月/日。

例如,如果您試圖將英國2011年4月5日轉換爲美國日期,而不告訴解析器該格式是什麼,您將得到2011年5月4日的輸出 - 扭轉月份和日期。

0

首先分析你的Excel日期時間到C#DateTime對象和格式化DateTime對象爲假設

DateTime dt = DateTime.Parse(drExcel["dateofExcel"]); 
drDB["DateTime"] = dt.ToString("s"); 

希望它能解決你的問題

0

你可以在數據庫中執行,也可能嘗試編寫一個存儲過程,使用您的Excel工作表將數據插入數據庫。

用戶下面提到你的SP中的TSQL代碼,這將工作。

CREATE PROCEDURE ABC 
AS 
-- Do some operation 
    SET DATEFORMAT ydm; 

    insert into @dates 
    select '2008-09-01','2008-09-01' 

END 
+0

SET DATEFORMAT YDM參數化查詢;是關鍵,並在你的情況下格式化,你可以將其設置爲mdy。有關更多詳細信息,請參閱http://msdn.microsoft.com/en-us/library/aa259188%28v=sql.80%29.aspx。 – Shailesh

0

我認爲你必須在c#中做到這一點。 嘗試是這樣的:

String excelDate = ... 
String[] dateParts = excelDate.Split('/'); 
String sqlDate = dateParts[1] + "/" + dateParts[0] + "/" + dateParts[2]; 
...