Component File /DBUtil/DataCopyOperation.cs (C#)
using System;  
using System.Data;  
using System.Data.OleDb;  
using System.Windows.Forms;  
using System.Collections;  
  
namespace YariSoft.DBUtil  
{  
    public class DataCopyOperation : DBBaseOperation  
    {  
        public delegate bool OnNeedInsertIdentityEventHandler( DataTable TableToUpdate, DataRow RowToUpdate, ref bool Updated );  
  
        public event OnNeedInsertIdentityEventHandler  
                                                OnNeedInsertIdentity = null;  
  
        #region Local variables  
        private RowOperation prevRowOperation = RowOperation.RO_None;  
        #endregion  
  
        #region Properties  
        #endregion  
  
        #region Constructor/Destructor  
        public DataCopyOperation( OleDbConnection Connection, DataView Source, DataView Destination, System.Collections.ArrayList SelectedRows ):  
            base ( Connection, Source, SelectedRows )  
        {  
            this.destination = Destination;  
        }  
        #endregion  
  
        #region Protected functions  
        protected override string GetProgressCaption()  
        {  
            return "Copy rows";  
        }  
        protected override string GetProgressMessage()  
        {  
            return "Copy rows to '" + this.destination.Table.TableName + "' table";  
        }  
        protected override bool ExecOperation( int Position )  
        {  
            bool status =  true;  
  
            DataRow foundRow = null;  
            int index = ( int )this.selectedRows[Position];  
  
            RowOperation operation = this.CheckKeys( index, ref foundRow );  
            if( this.prevRowOperation != RowOperation.RO_Overwrite_All && this.prevRowOperation != RowOperation.RO_Skip_All ){  
                this.prevRowOperation = operation;  
            }  
  
            if( operation == RowOperation.RO_None ){  
                return false;  
            }  
  
            bool rowUpdated = false;  
            switch( operation ){  
                case RowOperation.RO_Skip:  
                case RowOperation.RO_Skip_All:      
                    return true;  
                case RowOperation.RO_Append:      
                    foundRow = this.destination.Table.NewRow();  
                    for( int j = 0; j < this.destination.Table.Columns.Count; j++ ){  
                        if( !this.destination.Table.Columns[j].AutoIncrement && !this.destination.Table.Columns[j].ReadOnly ){  
                            foundRow[ j ] = this.source[index][j];  
                        }  
                    }  
                    this.destination.Table.Rows.Add( foundRow );  
                    if( this.OnNeedInsertIdentity != null ){  
                        if( ! this.OnNeedInsertIdentity ( this.destination.Table, foundRow, ref rowUpdated ) ){  
                            status = false;  
                        }  
                    }  
                      
                    break;  
                case RowOperation.RO_Overwrite:      
                case RowOperation.RO_Overwrite_All:      
                    for( int j = 0; j < this.destination.Table.Columns.Count; j++ ){  
                        if(       !this.destination.Table.Columns[j].AutoIncrement  
                            && !this.destination.Table.Columns[j].ReadOnly  ){  
  
                            foundRow[ j ] = this.source[index][j];  
                        }  
                    }  
                    break;  
            }  
            if( rowUpdated ){  
                foundRow.AcceptChanges();  
            }  
            return status;  
        }  
        #endregion  
  
        #region Private functions  
        private RowOperation CheckKeys( int RowID, ref DataRow FoundRow )  
        {  
            RowOperation result = RowOperation.RO_Append;  
  
            foreach( Constraint constr in this.destination.Table.Constraints ){  
                if( constr is UniqueConstraint ){  
                    UniqueConstraint uConstr = ( UniqueConstraint )constr;  
                    object[]findTheseVals = new object[ uConstr.Columns.Length ];  
                    for( int i = 0; i < uConstr.Columns.Length; i++ ){  
                        findTheseVals[i] = this.source[RowID][uConstr.Columns[i].ColumnName];  
                    }  
  
                    FoundRow = this.destination.Table.Rows.Find( findTheseVals );  
                    if( FoundRow != null ){  
                        if( this.prevRowOperation != RowOperation.RO_Overwrite_All && this.prevRowOperation != RowOperation.RO_Skip_All ){  
                            OverwriteDataForm dialog = new OverwriteDataForm();  
                            result = dialog.ShowDialog( this.source[RowID].Row, FoundRow );  
                            dialog.Dispose();  
                        } else {  
                            result = this.prevRowOperation;  
                        }  
                    }  
                }  
            }  
            return result;          
        }  
        #endregion  
    }  
}