2009-10-23 54 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

相关问题