public void InsertItems <T>(IEnumerable <T> items, string schema, string tableName, IList <ColumnMapping> properties, DbConnection storeConnection, int?batchSize, SqlBulkCopyOptions copyOptions = SqlBulkCopyOptions.Default, SqlTransaction transaction = null) { using (var reader = new EFDataReader <T>(items, properties)) { var con = storeConnection as SqlConnection; if (con.State != System.Data.ConnectionState.Open) { con.Open(); } using (var copy = transaction == null ? new SqlBulkCopy(con.ConnectionString, copyOptions) : new SqlBulkCopy(con, copyOptions, transaction)) { copy.BatchSize = Math.Min(reader.RecordsAffected, batchSize ?? 15000); //default batch size if (!string.IsNullOrWhiteSpace(schema)) { copy.DestinationTableName = string.Format("[{0}].[{1}]", schema, tableName); } else { copy.DestinationTableName = "[" + tableName + "]"; } copy.NotifyAfter = 0; foreach (var i in Enumerable.Range(0, reader.FieldCount)) { copy.ColumnMappings.Add(i, properties[i].NameInDatabase); } copy.WriteToServer(reader); copy.Close(); } } }
public void InsertItems <T>(IEnumerable <T> items, string schema, string tableName, IList <ColumnMapping> properties, DbConnection storeConnection, int?batchSize, int?executeTimeout, SqlBulkCopyOptions copyOptions, DbTransaction transaction) { using (var reader = new EFDataReader <T>(items, properties)) { if (storeConnection.State != System.Data.ConnectionState.Open) { storeConnection.Open(); } using (var copy = new SqlBulkCopy((SqlConnection)storeConnection, copyOptions, transaction as SqlTransaction)) { copy.BulkCopyTimeout = executeTimeout ?? 600; copy.BatchSize = batchSize ?? 15000; //default batch size if (!string.IsNullOrWhiteSpace(schema)) { copy.DestinationTableName = $"[{schema}].[{tableName}]"; } else { copy.DestinationTableName = "[" + tableName + "]"; } copy.NotifyAfter = 0; foreach (var i in Enumerable.Range(0, reader.FieldCount)) { copy.ColumnMappings.Add(i, properties[i].NameInDatabase); } copy.WriteToServer(reader); copy.Close(); } } }