关于c#:如何使用SqlBulkCopyColumnMappingCollection?

How to use SqlBulkCopyColumnMappingCollection?

我想通过参数传递特定数据来制作一个可以用于所有批量插入的SqlBulkCopy方法。

现在我需要对其中一些进行映射。我不知道如何制作SqlBulkCopyColumnMappingCollection,因为那是我计划传入映射集合并使用它的计划。但是我不知道该怎么做。我无法为其创建新对象。

这就是我现在所拥有的。

如何添加映射以将其传递给它?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
    }
}


您不需要创建它的新实例-SqlBulkCopy类具有一个属性,该属性是可以使用的映射集合:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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);
    }    
}

编辑:

基于注释,目标是创建通用功能,例如不必在函数中显式地对映射进行硬编码。由于无法实例化ColumnMappingCollection,因此建议将包含列映射定义的List<string>或类似参数传递给该函数。例如:

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

然后将函数重新定义为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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);
    }
}