public void Write(IEnumerable <IRow> rows) { _output.Entity.UpdateCommand = _output.SqlUpdateOutput(_cf); var count = (uint)0; using (var cn = _cf.GetConnection()) { cn.Open(); _output.Debug(() => "begin transaction"); var trans = cn.BeginTransaction(); try { foreach (var batch in rows.Partition(_output.Entity.UpdateSize)) { var batchCount = Convert.ToUInt32(cn.Execute( _output.Entity.UpdateCommand, batch.Select(r => r.ToExpandoObject(_output.GetUpdateFields().ToArray())), trans, 0, CommandType.Text )); count += batchCount; } _output.Debug(() => "commit transaction"); trans.Commit(); _output.Entity.Updates += count; _output.Info("{0} to {1}", count, _output.Connection.Name); } catch (Exception ex) { _output.Error(ex.Message); _output.Warn("rollback transaction"); trans.Rollback(); } } }