public virtual void Copy <T>(Descriptor descriptor, IDbConnection connection, IEnumerable <T> entities, IDbTransaction transaction = null, int?commandTimeout = null) { descriptor = descriptor ?? SimpleDescriptor.Create <T>(); var reader = new EnumerableDataReader <T>(entities); var timeout = commandTimeout.HasValue ? commandTimeout.Value : 0; var mapping = GenerateBulkCopyMapping(descriptor, reader, connection, timeout); var settings = BeforeBulkInsert(connection, transaction, timeout); try { using (var bcp = new SqlBulkCopy((SqlConnection)connection, SqlBulkCopyOptions.TableLock, (SqlTransaction)transaction)) { foreach (var column in mapping.DatabaseTableColumns) { bcp.ColumnMappings.Add(new SqlBulkCopyColumnMapping(column, column)); } bcp.BatchSize = reader.Count; bcp.DestinationTableName = !string.IsNullOrWhiteSpace(descriptor.Schema) ? string.Format("[{0}].[{1}]", descriptor.Schema, mapping.DataReaderTable.TableName) : string.Format("[dbo].[{0}]", mapping.DataReaderTable.TableName); bcp.BulkCopyTimeout = timeout; bcp.WriteToServer(reader); } } finally { AfterBulkInsert(connection, transaction, timeout, settings); } }
public void Copy <T>(Descriptor descriptor, IDbConnection connection, IEnumerable <T> entities, IDbTransaction transaction = null, int?commandTimeout = null) { if (entities == null || !entities.Any()) { return; } var settings = BeforeBulkInsert(connection, transaction, commandTimeout); try { descriptor = descriptor ?? SimpleDescriptor.Create <T>(); var command = connection.CreateCommand(); transaction = transaction ?? connection.BeginTransaction(); SetCommandText <T>(command, entities.First()); var properties = descriptor.Insertable.ToArray(); var parameterNames = properties.Select(p => p.ColumnName); var parameters = parameterNames.Select(pn => { var parameter = command.CreateParameter(); parameter.ParameterName = pn; command.Parameters.Add(parameter); return(parameter); }).ToArray(); command.Transaction = transaction; command.Prepare(); var reader = new EnumerableDataReader <T>(entities); while (reader.Read()) { for (var i = 0; i < parameters.Length; i++) { parameters[i].Value = reader.GetValue(i); } command.ExecuteNonQuery(); } transaction.Commit(); } finally { AfterBulkInsert(connection, settings); } }