【问题标题】:SQL Bulk Copy mapping with different column names?具有不同列名的 SQL 批量复制映射?
【发布时间】:2019-04-04 14:04:30
【问题描述】:

我们的表格中有几列不是用户友好的名称,因此我们在实际的 GUI 中更改它们。

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

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

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

     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();
        }

经过进一步调查,我们将列映射存储在一个表中,因此该表如下所示

 TableName: ColumnMappingTable

[ColumnName]    [GuiColumnName]
  IntAmt         InterestAmount
  PrinAmt        PrincipalAmount

也就是说,有没有一种方法可以动态映射这种方式? 我们有很多表,并且在代码中单独硬编码映射每个名称会花费很多时间

【问题讨论】:

    标签: c# entity-framework sqlbulkcopy


    【解决方案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);
            }
    

    【讨论】:

    • 这看起来不错。我已经更新了添加我刚刚发现我们使用的映射表的问题。有没有办法使用您的代码动态映射这些列?
    【解决方案2】:

    尝试使用TableMappings.Add()

    Article供参考:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多