private void btnCopy_Click(object sender, EventArgs e)
        {
            if (cbxSQLSchema.SelectedIndex == -1)
            {
                return;
            }

            var db   = new MonetDatabase(_connectionInfo.ToString());
            var cols = lsvSQLCols.CheckedItems.Count > 0
                ? string.Join(",",
                              lsvSQLCols.CheckedItems.Cast <ListViewItem>()
                              .Select(
                                  s => string.Format("{1}{0}{2}", s.Text, _dataConnector.OpenScope, _dataConnector.CloseScope)))
                : "*";
            var query = string.IsNullOrWhiteSpace(_tableInfo.Schema)
                ? string.Format("SELECT {0} FROM {2}{1}{3} ", cols, _tableInfo.Table, _dataConnector.OpenScope,
                                _dataConnector.CloseScope)
                : string.Format("SELECT {0} FROM {3}{1}{4}.{3}{2}{4} ", cols, _tableInfo.Schema, _tableInfo.Table,
                                _dataConnector.OpenScope, _dataConnector.CloseScope);
            var reader    = _dataConnector.ExecuteReader(query);
            var batchSize = Convert.ToInt32(nudBatchSize.Value);

            var prog      = TaskbarManager.Instance;
            var stopWatch = new Stopwatch();

            stopWatch.Start();

            _worker.DoWork += delegate(object o, DoWorkEventArgs args)
            {
                prog.SetProgressState(TaskbarProgressBarState.Normal);

                var bulkCopy = new MonetBulkCopy(db)
                {
                    BatchSize   = batchSize,
                    NotifyAfter = batchSize
                };

                bulkCopy.RowsCopied += delegate(object o1, RowsCopiedEventArgs args1)
                {
                    if (args1.Abort)
                    {
                        return;
                    }

                    if (_worker.CancellationPending)
                    {
                        args.Cancel = true;

                        throw new OperationCanceledException();
                    }
                    var percent = Math.Round(100 * (decimal)args1.RowsCopied / _tableInfo.RowsCount, 3,
                                             MidpointRounding.AwayFromZero);
                    var userState = new KeyValuePair <decimal, long>(percent, args1.RowsCopied);

                    _worker.ReportProgress(0, userState);
                };

                bulkCopy.Upload(_tableInfo.Schema, _tableInfo.Table, reader);
            };
            _worker.ProgressChanged += delegate(object o, ProgressChangedEventArgs args)
            {
                var userState = (KeyValuePair <decimal, long>)args.UserState;

                lblCopyElapsed.Text = $"{stopWatch.Elapsed:g}";
                pbrCopyStatus.Value = (int)userState.Key;


                prog.SetProgressValue((int)userState.Key, pbrCopyStatus.Maximum);

                Thread.Sleep(100);
            };
            _worker.RunWorkerCompleted += delegate(object o, RunWorkerCompletedEventArgs args)
            {
                if (args.Cancelled)
                {
                    MessageBox.Show(@"Bulk operation canceled!", @"Canceled", MessageBoxButtons.OK,
                                    MessageBoxIcon.Warning);

                    LoggerHelper.Write(LoggerOption.Warning, @"Bulk operation canceled!");
                }
                else if (args.Error != null)
                {
                    MessageBox.Show(args.Error.Message, @"Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    LoggerHelper.Write(LoggerOption.Error, "Error: {0}", args.Error.Message);
                }
                else
                {
                    MessageBox.Show(@"Bulk operation completed", @"Completed", MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);

                    LoggerHelper.Write(LoggerOption.Info, @"Bulk operation completed");
                }

                stopWatch.Stop();
                prog.SetProgressState(TaskbarProgressBarState.NoProgress);

                pbrCopyStatus.Value = 0;
            };

            _worker.RunWorkerAsync();
        }