SQL Bulk Copy сопоставления с разными именами столбцов? - PullRequest
1 голос
/ 04 апреля 2019

В наших таблицах есть несколько столбцов, которые не являются удобными для пользователя именами, поэтому мы меняем их в реальном графическом интерфейсе.

Например, столбец в базе данных помечен как «IntAmt», но у пользователя нет подсказки, поэтому в программе мы называем этот столбец «Сумма процентов».

Проблема в том, что если я использую прямое сопоставление столбцов, как показано ниже, то произойдет ошибка, поскольку эти столбцы не совпадают. В базе данных нет столбца с именем "InterestAmount"

Так есть ли способ, которым я могу ссылаться на правильное имя столбца в отображении с аннотациями или что-то в этом роде? Мы также используем Entity Framework.

     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

Так что, как говорится, есть способ, которым я могу отображать этот путь динамически? У нас есть много таблиц, и жесткое кодирование, отображающее каждое имя отдельно в коде, заняло бы много времени

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

В классе, который определяет объект db add и IEnumerable типа SqlBulkCopyColumnMapping

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);
        }
0 голосов
/ 04 апреля 2019

Попробуйте использовать TableMappings.Add()

Артикул для справки:

...