2009-10-23 51 views
2

當涉及空列時,我遇到了使用SqlBulkCopy的問題。這聽起來像SqlBulkCopy不知道如何處理可空列,並在遇到長度爲零的列時拋出非法大小的錯誤。錯誤是「從bcp客戶端收到一個無效的列長度...」如何在可空列中使用SqlBulkCopy

我想知道處理這個問題的最佳做法是什麼。 This似乎是一個很好的論壇帖子,描述了這個問題以及如何解決它讀取csv文件。

我認爲我的情況相當A - 典型和簡單。我需要將一個未知數據從一個數據庫表移動到另一個數據庫。對我來說,更簡單的答案是在SQL Server中使用SSIS/DTS或鏈接服務器,但客戶希望應用程序執行數據移動。

是否有一個已知的解決方案,爲這個或更好的蒸汽解決方案移動具有空字段的數據?

//access db 
string src_db = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\SourceDB.mdb;Jet OLEDB "; 
//sql db 
string dest_db = @"Data Source=.\TEST;Initial Catalog=testdb;User Id=user;Password=password;"; 
string sql = ""; 
OleDbConnection sdb = new OleDbConnection(src_db); 
OleDbCommand cmd = new OleDbCommand(sql, sdb); 
OleDbDataReader rs = null; 

SqlConnection db = new SqlConnection(dest_db); 
SqlCommand clear = null; 
SqlBulkCopy bulk_load = null; 

// Read in the source table 
sql = "select * from someTable"; 
sdb.Open(); 
cmd = new OleDbCommand(sql, sdb); 
rs = cmd.ExecuteReader(); 

// Import into the destination table 
bulk_load = new SqlBulkCopy(db); 
bulk_load.DestinationTableName = "test"; 
bulk_load.WriteToServer(rs); 

回答

5

SqlBulkCopy類無法應付空字段。在試圖計算它的長度之前,它不檢查該字段是否爲空。因此拋出一個錯誤。

我在問題中引用的帖子引用了IDataReader的實現,該實現拋出DBNull.Value而不是僅僅爲null值 - 這適用於SqlBulkCopy的缺陷。

0

它應該工作,如果您在您的目標字段中檢查可空。

+0

該列在數據庫中標記爲空。以上是在此表上執行的代碼。 – Chad 2009-10-28 15:41:05

相關問題