【问题标题】:BulkCopy WriteToServer() Inserts Into Wrong ColumnBulkCopy WriteToServer() 插入错误的列
【发布时间】:2015-03-22 13:23:40
【问题描述】:

我正在尝试将DataTable 写入 Sql Server 上的目标表中。 DataTable dt 仅包含一列,其名称为 Email。我的目标表包含tpidlastnameagedateemail。 这是我用于批量复制的代码:

using (SqlConnection sqlConn = new SqlConnection(sqlCs))
{
    sqlConn.Open();
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn.ConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.UseInternalTransaction))
    {
        bulkCopy.DestinationTableName = destinationTableName;
        bulkCopy.WriteToServer(dt);
    }
}

我看到的是,在我的目标表中,我从 DataTable 中获得了 Email 的值,该值被插入到 tpid 列而不是 email 中。我在这里没有使用列映射,但不应该批量复制将 Emailemail 自动匹配?

【问题讨论】:

    标签: c# sql sql-server datatable sqlbulkcopy


    【解决方案1】:

    考虑尝试这种映射:

    SqlBulkCopyColumnMapping mapMAIL = new SqlBulkCopyColumnMapping("Email", "email");
    bulkCopy.ColumnMappings.Add(mapMAIL);
    

    如果需要,您可以查询源表和目标表的 MySQL 架构,并根据字段名称生成自动映射。

    【讨论】:

    • 但列名每次都是可变的。这只是问题的一个例子。
    • @Pedram,SqlBulkCopy 的默认行为是按序号映射。如果要按名称映射,则需要使用 SqlBulkCopyMappings。
    • 也许您可以对源表和目标表执行类似SHOW COLUMNS FROM _tablename_ 的查询,然后在不区分大小写的情况下自动生成映射?您可以尝试的其他方法(我不知道您是否有)查看它是否自动将“电子邮件”映射到“电子邮件”(区分大小写)。
    【解决方案2】:

    不,它不会匹配。您必须添加映射:

     myBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Email", "email"));
    

    或源和目标具有相同顺序的相同列。如果您需要更大的灵活性,我建议您实现 IDataReader 并将其传递给 WriteToServer 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多