public void Copy <T>(Descriptor descriptor, IDbConnection connection, IEnumerable <T> entities, IDbTransaction transaction = null, int?commandTimeout = null) { descriptor = descriptor ?? SimpleDescriptor.Create <T>(); transaction = transaction ?? connection.BeginTransaction(); var reader = new EnumerableDataReader <T>(entities); var total = reader.Count; var batchSize = total < BatchSize ? total : BatchSize; var pending = new List <object[]>(batchSize); var columnCount = descriptor.Insertable.Count(); var read = 0; while (reader.Read()) { read = ReadOne(columnCount, reader, pending, read); if (pending.Count >= batchSize) { PrepareAndInsert(connection, transaction, descriptor, batchSize, pending); } } if (pending.Count > 0) { PrepareAndInsert(connection, transaction, descriptor, pending.Count, pending); } transaction.Commit(); }
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); } }