我使用SQL Bulkcopy在asp.net 3.5與C#SQL Bulkcopy YYYYMMDD問題
一個字符串到日期的轉換問題,我讀了大量的CSV文件(CSV reader)。讀取的一個字符串應該加載到SQL Server 2008日期列中。
如果文本文件包含例如字符串'2010-12-31',則SQL Bulkcopy將其毫無問題地加載到Date列中。
然而,如果字符串是「201」,我得到一個錯誤:
從數據源String類型的給定值不能被轉換爲類型指定的目標列
該文件的日期包含8000萬條記錄,所以我不能創建一個數據表....
SqlBulkcopy Columnmappings等都可以。另外更改爲DateTime不起作用。
我試圖
SET DATEFORMAT ymd;
但是,這並不能幫助。
任何想法如何告訴SQL Server接受這種格式?否則,我會在CSV閱讀器中創建一個自定義修復程序,但我更喜歡SQL中的某些內容。
更新 在兩個答案的後續行動,我使用SQL bulkcopy像這樣(在另一個問題#2建議):
的CSV讀者(見在CodeProject上面的鏈接)返回的字符串值(不是很強類型)。該CSVreader實現System.Data.IDataReader,所以我可以做這樣的事情:
using (CsvReader reader = new CsvReader(path))
using (SqlBulkCopy bcp = new SqlBulkCopy(CONNECTION_STRING))
{ bcp.DestinationTableName = "SomeTable";
// columnmappings
bcp.WriteToServer(reader); }
所有來自IDataReader的到來字段是字符串,所以除非我改變了不少在CSVreader
我不能使用C#方法因此,我的問題與如何在C#中修復它無關,我可以這樣做,但我想阻止它。
很奇怪,因爲如果你在SQL東西搞得像
update set [somedatefield] = '201'
它也可以,只是不能與bulkcopy。
任何想法爲什麼?
感謝您的任何建議, Pleun
我已經更新了關於如何使用SqlBulkCopy的簡短說明。我知道這並不理想,但是CSV閱讀器只返回字符串(如果SQL Server能夠直接接受這些字符串,它將會有8000萬行)。這很奇怪,因爲如果你做了一個sql更新集[somedatefield] ='201',它也可以工作,而不是使用批量拷貝。 – Pleun 2011-01-20 22:31:26
@Pleun:我敢說你有辦法破壞它 - 但是如果我是你,我會咬緊牙關,自己進行轉換。將每個值設置爲適當類型只是一個更好的解決方案 - 這意味着您可以在客戶端儘早執行驗證。 – 2011-01-20 22:45:38
感謝你們兩位 - 我會按照你的建議進行並咬緊牙關。 – Pleun 2011-01-21 09:26:56