Как использовать SqlBulkCopyColumnMappingCollection? - PullRequest
12 голосов
/ 05 июня 2010

Я хочу создать один метод SqlBulkCopy, который я смогу использовать для всех моих массовых вставок, передавая конкретные данные через параметры.

Теперь мне нужно сделать отображение на некоторых из них. Я не знаю, как сделать SqlBulkCopyColumnMappingCollection, так как это было моим планом передать коллекцию отображений и использовать ее. Однако я не знаю, как это сделать. Я не могу сделать из этого новый объект.

Это то, что у меня сейчас. Как я могу добавить это сделать отображение положить передать в?

public void BatchBulkCopy(DataTable dataTable, string DestinationTbl, int batchSize)
{
    // Get the DataTable 
    DataTable dtInsertRows = dataTable;

    using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity))
    {
        sbc.DestinationTableName = DestinationTbl;

        // Number of records to be processed in one go
        sbc.BatchSize = batchSize;

        // Finally write to server
        sbc.WriteToServer(dtInsertRows);
    }
}

1 Ответ

21 голосов
/ 05 июня 2010

Вам не нужно создавать его новый экземпляр - класс SqlBulkCopy имеет свойство, представляющее собой коллекцию сопоставлений, которую вы можете использовать:

public void BatchBulkCopy(DataTable dataTable, string DestinationTbl, int batchSize)
{
    // Get the DataTable 
    DataTable dtInsertRows = dataTable;

    using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity))
    {
        sbc.DestinationTableName = DestinationTbl;

        // Number of records to be processed in one go
        sbc.BatchSize = batchSize;

        // Add your column mappings here
        sbc.ColumnMappings.Add("field1","field3");
        sbc.ColumnMappings.Add("foo","bar");

        // Finally write to server
        sbc.WriteToServer(dtInsertRows);
    }    
}

EDIT:

Основываясь на комментариях, цель состояла в том, чтобы сделать общую функцию, например, не нужно жестко кодировать отображение явно в функции. Поскольку нельзя создать экземпляр ColumnMappingCollection, я бы порекомендовал передать в функцию List<string> или аналогичный элемент, содержащий определение отображения столбца. Например:

var columnMapping = new List<string>();
columnMapping.Add("field1,field3");
columnMapping.Add("foo,bar");

Затем переопределите функцию как

public void BatchBulkCopy(DataTable dataTable, string DestinationTbl, int batchSize, List<string> columnMapping)
{
    // Get the DataTable 
    DataTable dtInsertRows = dataTable;

    using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity))
    {
        sbc.DestinationTableName = DestinationTbl;

        // Number of records to be processed in one go
        sbc.BatchSize = batchSize;

        // Add your column mappings here
        foreach(var mapping in columnMapping)
        {
            var split = mapping.Split(new[] { ',' });
            sbc.ColumnMappings.Add(split.First(), split.Last());
        }

        // Finally write to server
        sbc.WriteToServer(dtInsertRows);
    }
}
...