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