web-dev-qa-db-ja.com

SqlBulkCopyを使用してDataTableの列をSQLテーブルにマッピングする

データをデータベースに追加する前に、データベーステーブルの列をc#のデータテーブルにマップする方法を知りたいと思います。

using (SqlBulkCopy s = new SqlBulkCopy(conn))
{
    s.DestinationTableName = destination;
    s.WriteToServer(Ads_api_ReportData);
}
22
user2545743

おそらく次のようなものが必要です

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

参照: SqlBulkCopyColumnMappingCollectionの使用方法 。 。

Seel http://www.codeproject.com/Articles/18418/Transferring-Data-Using-SqlBulkCopy

39
StackTrace

これは非常に一般的なタスクになったため、このヘルパーを作成しました。

public static void AutoMapColumns(SqlBulkCopy sbc, DataTable dt)
{
    foreach (DataColumn column in dt.Columns)
    {
        sbc.ColumnMappings.Add(column.ColumnName, column.ColumnName);
    }
}

DataTableを自分で作成していたので、その列にSQLテーブルと同じ名前を付けました。

13
Evan M

ifソースクエリ(またはテーブル)およびターゲットテーブルの列に同じ名前があり、まったく同じ)であることを知っておくと役立つ場合があります。 orderの場合、マッピングを明示的に書き出す必要はありませんがあります。これは、SqlBulkCopyがこのデフォルトの順序でデフォルトのマッピングを作成するためです。

6
Hugo Nava Kopp

ColumnMappings を使用します。

s.ColumnMappings.Add("Name", "Name");
s.ColumnMappings.Add("Address", "Address");
0
Ben Gulapa

ColumnMappingsコレクションに追加メソッドを使用すると、ソーステーブルから宛先テーブルに列をマップできます。 ColumnMappings.Addメソッドは、列をマップする4つの異なる方法を受け入れます。

SQLBulkCopyは、ColumnMappingsコレクションに追加する際に考慮する必要がある両方の列のデータ型に対して非常に厳密です。

0
Laxmikant