2011-10-29 40 views
2

我正在使用SqlBulkCopy從.net DataTable對象插入/更新到包含sql_variant列的SQL Server表。但是,當我需要的是'datetime2'時,SqlBulkCopy堅持將DateTime值存儲到該列中作爲sql類型'datetime'。如何在使用SqlBulkCopy插入到sql_variant列時設置列類型

我的DataTable中這樣定義:

DataTable dataTable = new DataTable(); 
dataTable.Columns.Add(new DataColumn("VariantValue", typeof(object))); //this represents my sql_variant column 

然後我在拋出一些數據存在,需要一個「DATETIME2」來存儲。

DataRow row = dataTable.NewRow(); 
row[0] = DateTime.MinValue; 
dataTable.Rows.Add(row); 

然後我用SqlBulkCopy的獲取數據到SQL Server:

using (SqlBulkCopy bulk = new SqlBulkCopy(myConnection)) 
{ 
    bulk.DestinationTableName = "tblDestination";  
    bulk.WriteToServer(dataTable);  
} 

如果DateTime值中存在於落在SQL的範圍之外的數據表我的批量複製將失敗'datetime'類型(如'1/1/0001')。這就是爲什麼該列需要是'datetime2'類型的原因。

在編寫插入sql_variant列的普通插入語句時,可以通過使用CAST或CONVERT來控制變量列的類型。例如:

insert into [tblDestination] (VariantValue) values (CAST('1/1/0001' AS datetime2)) 

然後,如果你要顯示的實際類型這樣的變型列:

SELECT SQL_VARIANT_PROPERTY(VariantValue,'BaseType') AS basetype FROM test 

你會看到,事實上,這是被存儲爲「DATETIME2」。

但是我使用的是SqlBulkCopy,據我所知,沒有地方可以告訴它.net DateTime對象應該存儲在類型'datetime2'而不是'datetime'的列中。我知道,DataTable對象上沒有任何地方聲明它。任何人都可以幫我弄清楚如何解決這個問題嗎?

回答

1

按照MSDN頁面SqlBulkCopy(在「備註」):

SqlBulkCopy的失敗時,批量加載類型的數據表列 SQLDATETIME到其類型爲 日起在SQL Server列在SQL Server 2008中

添加/時間類型,因此,SqlBulkCopy將無法​​處理DateTime2值。單獨

  1. 將每個行(即使用你的數據表中的foreach),處理的數據類型有:相反,我建議兩個選項之一。 (這可能有助於使用存儲的proc來包裝插入,並利用SqlCommand.Parameters鍵入插入的數據。)
  2. 批量插入到臨時表中的字符串,然後將數據傳輸到您的主表(將數據類型轉換爲必要)在SQL中。 (我想會得到不必要的複雜,但您可能能夠從克朗對大數據集的一些性能)
+0

好發臭。我希望他們能夠繞過更新SqlBulkCopy。謝謝(你的)信息。 – BowserKingKoopa

+0

是的,我總是發現SQL Server的批量插入功能不足。如果您的輸入數據來自文件,您可以嘗試查看一些SSIS選項。 – chezy525

相關問題