12

パラメータを介して特定のデータを渡すことにより、すべての一括挿入に使用できる1つの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);
    }
}
4

1 に答える 1

21

新しいインスタンスを作成する必要はありません。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);
    }    
}

編集:

コメントに基づいて、目標はジェネリック関数を作成することでした。たとえば、関数にマッピングを明示的にハードコーディングする必要はありません。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);
    }
}
于 2010-06-04T23:41:26.953 に答える