sql - 如何将 SqlBulkCopy 与可为空的列一起使用

标签 sql sql-server nullable sqlbulkcopy

当涉及可为空的列时,我在使用 SqlBulkCopy 时遇到问题。听起来 SqlBulkCopy 不知道如何处理可为空的列,并在遇到零长度列时抛出非法大小错误。错误是“从 bcp 客户端接收到无效的列长度...”

我想知道处理这个问题的最佳做法是什么。 This似乎是一个很好的论坛帖子,描述了这个问题以及如何解决它以读取 csv 文件。

我认为我的情况非常典型且简单。我需要将未知数量的数据从一个数据库表移动到另一个数据库。对我来说更简单的答案是在 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 );

最佳答案

SqlBulkCopy 类无法处理空字段。在尝试计算它的长度之前,它不会检查该字段是否为空。从而抛出错误。

我在问题中引用的帖子引用了 IDataReader 的实现,它抛出 DBNull.Value 而不仅仅是空值——这解决了 SqlBulkCopy 的缺陷。

关于sql - 如何将 SqlBulkCopy 与可为空的列一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1614862/

相关文章:

c# - 可为空的 ToString()

sql - 在 R 中批量插入

c# - 如何获取数字列的确切类型,包括。规模和精度?

执行SSIS包时出现mysql错误

NHibernate 2.* 映射文件 : how to define nullable DateTime type (DateTime? )?

c# - 如何使 C# 类的 Object 属性可选?

SQL GROUP BY 一年中每周的总价

mysql - Ruby on Rails,表单数据未通过sql添加到数据库

sql-server - 如何替换ssis包中的unicode字符

sql - 添加列是否删除数据