带有隐式截断的SqlBulkCopy

时间:2014-11-05 01:23:47

标签: c# sql sqlbulkcopy

尝试使用SqlBulkCopy插入数据,我收到此错误:

Received an invalid column length from the bcp client for colid 6

他们建议两件事之一:

  1. 增加DB中的varchar大小(以容纳更大的字符串)
  2. 手动在上传之前截断DataTable中的字符串(使用我自己的代码)(制作字符串) 适当的大小)
  3. 但我很高兴发生“隐式截断”...(即数据库插入或SqlBulkCopy本身会将用户提供的值降低到适当的大小)

    问题:

    • 是否可以使用SqlBulkCopy并在设置SqlCommand“SET ANSI_WARNINGS OFF”时获得“隐式截断”行为,以便“When OFF, data is truncated to the size of the column and the statement succeeds
    • 我可以更改数据库上的设置以允许“隐式截断”吗?
    • SqlBulkCopy是否有替代允许这样做?
    • 或者我应该使用推荐的方法之一(但我觉得在我自己手动截断DataTable中的数据会产生性能损失?)

1 个答案:

答案 0 :(得分:3)

我意识到这是一篇很老的帖子,但刚刚遇到这个问题并且没有找到太多帮助,我想分享我找到的解决方案。您可以在创建 SqlBulkCopy 对象时对传入的连接关闭 ANSI_WARNINGS,SQL Server 将自动为您截断数据,而不是抛出异常。

using (var bulkConn = new SqlConnection(destConnString))
{
    bulkConn.Open();
    using (var cmd = bulkConn.CreateCommand())
    {
        // kill the data truncation errors
        cmd.CommandText = "SET ANSI_WARNINGS OFF"; 
        cmd.ExecuteNonQuery();
    }
    using (var writer = new SqlBulkCopy(bulkConn, BulkCopyOptions, null)
               {
                   BatchSize = 10000,
                   DestinationTableName = $"[{schema}].[{table}]",
                   EnableStreaming = true,
                   BulkCopyTimeout = 0
               })
    {
        writer.WriteToServer(data);
    }
}