SQL大容量复制映射具有不同的列名?

时间:2019-04-04 14:04:30

标签: c# entity-framework sqlbulkcopy

我们的表中有几列不是用户友好名称,因此我们在实际的GUI中对其进行了更改。

例如,数据库中的一列被标记为“ IntAmt”,但是用户没有任何线索,因此在程序中我们将此列称为“利息金额”。

问题是,如果我使用如下所示的直接列映射,则将出错,因为这些列不匹配。数据库中没有名为“ InterestAmount”的列

那么有没有一种方法可以在带有注释或其他内容的映射中引用正确的列名?我们也在使用实体框架。

sync

经过进一步研究,我们在表中存储了列映射,因此表看起来像这样

     var connection = DbContext.Database.Connection.ConnectionString;

        using (SqlConnection sqc = new SqlConnection(connection))
        {
            sqc.Open();
            using (SqlBulkCopy bcp = new SqlBulkCopy(sqc))
            {
                bcp.DestinationTableName = strTargetTable;

                sourceData.Columns.Cast<DataColumn>().ToList().ForEach(x =>
                                                                      bcp.ColumnMappings
                 .Add(new SqlBulkCopyColumnMapping(x.ColumnName, x.ColumnName)));
                bcp.BatchSize = 50000;
                bcp.BulkCopyTimeout = 12000;
                bcp.WriteToServer(sourceData);
            }
            sqc.Close();
        }

因此,有没有一种方法可以动态映射这种方式? 我们有很多表,并且用硬编码将每个名称分别映射到代码中会花费很多时间

2 个答案:

答案 0 :(得分:1)

在定义db对象的类中,添加类型为SqlBulkCopyColumnMapping的IEnumerable

public static IEnumerable<SqlBulkCopyColumnMapping> GetObjectNameColumnMappings()
    {
        return new[]
        {
            new SqlBulkCopyColumnMapping(nameof(propertyName), "dbColumnName"),
            new SqlBulkCopyColumnMapping(nameof(propertyName2), "dbColumnName2")
        };
    }

然后调用此方法并将其设置为等于您的列映射

using (SqlBulkCopy bcp = new SqlBulkCopy(sqc))
        {
            bcp.DestinationTableName = strTargetTable;
            bcp.ColumnMappings = classInstance.GetObjectNameColumnMappings();
            bcp.BatchSize = 50000;
            bcp.BulkCopyTimeout = 12000;
            bcp.WriteToServer(sourceData);
        }

答案 1 :(得分:0)

尝试使用TableMappings.Add()

Article供参考: