private void StartBulkCopy() { if (_cpDest == null) { MessageService.ShowError("Destination connection not specified!"); return; } string confirmMsg = String.Format(Properties.Resources.CopyDataConfirmation, _cp.InfoDbServer, _cpDest.InfoDbServer); SqlBulkCopyOptions ops = EvalSqlBulkCopyOptions(); if ((ops & SqlBulkCopyOptions.TableLock) == SqlBulkCopyOptions.TableLock) { int majorServerVersion = SmoHelpers.GetServerMajorVersion(_cpDest); if (majorServerVersion == 9 && !MessageService.AskQuestion(Properties.Resources.TableLock_Notification + confirmMsg)) return; } else if (!MessageService.AskQuestion(confirmMsg)) return; BulkCopyArgs args = new BulkCopyArgs(); args.Objects = objList.SelectedObjects; args.StopOnError = chkStopOnError.Checked; args.CopyOptions = EvalSqlBulkCopyOptions(); _copying = true; _cancelled = false; wizardControl1.NextButtonEnabled = false; wizardControl1.BackButtonEnabled = false; _totalCopied = 0; lblTotal.Text = String.Empty; StartTimer(); bw.RunWorkerAsync(args); }
private void bw_DoWork(object sender, DoWorkEventArgs e) { BulkCopyArgs args = e.Argument as BulkCopyArgs; if (args == null) return; BulkCopyResult result = new BulkCopyResult(); ProgressData pd = new ProgressData(); pd.Total = args.Objects.Count; SqlTransaction tr = null; string copyErrors = String.Empty; bool copyCancelled = false; SqlConnection sourceConn = null; SqlConnection destConn = null; try { sourceConn = _cp.CreateSqlConnection(true, false); destConn = _cpDest.CreateSqlConnection(true, false); try { if (args.StopOnError) tr = destConn.BeginTransaction(); try { if (rbEmpty.Checked) { DeleteData(destConn, tr, args.Objects); } else if (rbEmptyAll.Checked) { DeleteAllData(destConn, tr); } } catch (Exception ex) { if (args.StopOnError) tr.Rollback(); result.Errors += SmoHelpers.FormatExceptionMsg(ex); return; } foreach (DbObjectList.DbObjectInfo selObj in args.Objects) { try { pd.Info = selObj.Name; pd.Progress++; if (_cancelled || bw.CancellationPending) { e.Cancel = true; if (args.StopOnError) tr.Rollback(); break; } else { bw.ReportProgress(0, pd); if (!LoadDataAndCopy(selObj.SchemaAndName, args.CopyOptions, sourceConn, destConn, tr, out copyErrors, out copyCancelled)) { if (args.StopOnError) tr.Rollback(); if (copyCancelled) { e.Cancel = true; break; } result.Errors += copyErrors; if (args.StopOnError) break; } } } catch (Exception ex) { if (args.StopOnError) { tr.Rollback(); result.Errors += SmoHelpers.FormatExceptionMsg(ex, "Table/View: " + selObj.Name); break; } else { result.Errors += SmoHelpers.FormatExceptionMsg(ex, "Table/View: " + selObj.Name); } } } if (args.StopOnError && tr.Connection != null) tr.Commit(); } catch (Exception ex) { result.Errors += SmoHelpers.FormatExceptionMsg(ex); } } finally { e.Result = result; if (sourceConn != null) { if (sourceConn.State != ConnectionState.Closed) sourceConn.Close(); sourceConn.Dispose(); } if (destConn != null) { if (destConn.State != ConnectionState.Closed) destConn.Close(); destConn.Dispose(); } } }