如何让SqlBulkCopy告诉我哪个列有截断错误

时间:2010-06-29 23:27:34

标签: c# sql-server

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

由于

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

我已经批准了已批准的答案,因为它对我有所帮助。

我决定使用SSIS来调查这个问题,虽然我花了30分钟让它工作,但是现在我有一个工具可以重复用来解决将来的同样问题。