如何让SqlBulkCopy告诉我哪一列发生了截断错误?

6
我正在使用SqlBulkCopy从外部数据库导入数据。当导入到nvarchar列时,如果该列无法容纳传入的字符串,则会出现以下错误:
InvalidOperationException: 给定的数据源类型为String的值无法转换为指定目标列的nvarchar类型。字符串或二进制数据将被截断。
我希望能够告诉用户哪个目标列出了问题。我已经仔细查看了异常信息,但没有发现有关此信息的任何内容。是否有一种方法可以设置,使得列的名称或索引在异常中返回?
以下是我的批量复制伪代码:
using (DbConnection source = DataTableProviderAssists.GetTypedDbConnection(package.ImportSourceType, package.UnencryptedConnectionString))
{
    using (DbCommand cmd = GetCommand(package, source))
    {
        source.Open();

        reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);

        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(RequestContext.ConnectionString, SqlBulkCopyOptions.TableLock))
        {
            bulkCopy.DestinationTableName = temporaryTableName;
            bulkCopy.BatchSize = 40000;
            bulkCopy.BulkCopyTimeout = 60000;

            foreach (ImportField field in package.Fields)
            {
                bulkCopy.ColumnMappings.Add(field.Name, field.Name);
            }

            bulkCopy.WriteToServer(reader);
        }
    }
}

谢谢

1个回答

3

我不确定有没有这种方式。
您可能需要用不同的方法解决这个问题。
尝试使用Microsoft.SqlServer.Management.Smo API查询您的目标表,并确定您表中列的最大长度。
一旦获得了这些信息,您可以预先读取源数据,并立即引发异常。
祝愉快。


在这一点上,我会说你是对的。我正处于ETL导入的背景下,所以我不想在正常情况下减慢速度。因此,我最终采用了“预览模式”,在这种模式下可以较慢地导入,以进行自己的验证。 - ryanman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接