【问题标题】:How can I get SqlBulkCopy to tell me which column had the truncation error如何让 SqlBulkCopy 告诉我哪一列有截断错误
【发布时间】:2011-03-09 21:34:08
【问题描述】:

我正在使用 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);
        }
    }
}

谢谢

【问题讨论】:

    标签: c# sql-server


    【解决方案1】:

    我不确定是否有。
    您可能需要以不同的方式解决这个问题。
    尝试使用 Microsoft.SqlServer.Management.Smo API 查询您的目标表,并确定表中列的最大长度是多少。
    获得这些信息后,您可以预先读取源数据并立即触发异常。
    玩得开心。

    【讨论】:

    • 在这一点上,我会说你是对的。我在 ETL 导入的上下文中,所以我不想在正常情况下减慢速度。所以,我最终有了“预览模式”,可以更慢地导入,我可以自己验证。
    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    相关资源
    最近更新 更多