public void ProcessEditMode(IRecordProcessor rp)
        {
            inputDatabase.Connect();
            outputDatabase.Connect();
            MapFields(rp);
            rp.setDatasetName(inputDatabase.NormTableName(tableName));

            if (Progress != null)
            {
                Progress.ReportProgress(0);
            }
            try
            {
                int count          = ProcessOffset;
                int processedCount = 0;
                int totalCount;

                rp.Reset();

                //Extract
                inputDatabase.SetTable(tableName);
                outputDatabase.SetTable(tableName);

                totalCount = inputDatabase.GetRowsCount();

                if (ProcessOffset > 0)
                {
                    inputDatabase.SeekRecord(ProcessOffset);
                }
                else
                {
                    inputDatabase.FirstRecord();
                }

                //!! Skip first line as it Header
                while (inputDatabase.NextRecord())
                {
                    DataRow row = inputDatabase.CurrentRow();

                    //Transform
                    if (rp.ProcessRow(row))
                    {
                        //Load if row changed
                        outputDatabase.UpdateRow(count + 1, row);

                        if (Progress != null)
                        {
                            Progress.ReportProgress((processedCount * 100) / (totalCount - ProcessOffset), string.Format("Records: Read {0} (Processed {1}) of {2}", count, processedCount, totalCount));
                        }

                        processedCount++;
                    }
                    count++;
                }

                //Load
                if (outputDatabase.FileName != null)
                {
                    outputDatabase.Write(outputDatabase.FileName);
                }
                //Set complete
                Progress.ReportProgress(100, string.Format("Read records: {0}, Processed {1}", count, processedCount));
            }
            catch (Exception ex)
            {
                throw ex;
            }
            // Call Close when done reading.

            inputDatabase.Close();
            outputDatabase.Close();
        }