private async Task InternalConvert(SchemaInfo schemaInfo = null) { DbInterpreter sourceInterpreter = this.Source.DbInterpreter; sourceInterpreter.Option.BulkCopy = this.Option.BulkCopy; sourceInterpreter.Subscribe(this.observer); sourceInterpreter.Option.GetTableAllObjects = false; sourceInterpreter.Option.ThrowExceptionWhenErrorOccurs = false; this.Target.DbInterpreter.Option.ThrowExceptionWhenErrorOccurs = false; if (string.IsNullOrEmpty(this.Target.DbOwner)) { if (this.Target.DbInterpreter.DatabaseType == DatabaseType.Oracle) { this.Target.DbOwner = (this.Target.DbInterpreter as OracleInterpreter).GetDbOwner(); } } DatabaseObjectType databaseObjectType = (DatabaseObjectType)Enum.GetValues(typeof(DatabaseObjectType)).Cast <int>().Sum(); if (schemaInfo != null && !this.Source.DbInterpreter.Option.GetTableAllObjects && (schemaInfo.TableTriggers == null || schemaInfo.TableTriggers.Count == 0)) { databaseObjectType = databaseObjectType ^ DatabaseObjectType.TableTrigger; } SchemaInfoFilter filter = new SchemaInfoFilter() { Strict = true, DatabaseObjectType = databaseObjectType }; SchemaInfoHelper.SetSchemaInfoFilterValues(filter, schemaInfo); SchemaInfo sourceSchemaInfo = await sourceInterpreter.GetSchemaInfoAsync(filter); if (sourceInterpreter.HasError) { return; } sourceSchemaInfo.TableColumns = DbObjectHelper.ResortTableColumns(sourceSchemaInfo.Tables, sourceSchemaInfo.TableColumns); if (SettingManager.Setting.NotCreateIfExists) { this.Target.DbInterpreter.Option.GetTableAllObjects = false; SchemaInfo targetSchema = await this.Target.DbInterpreter.GetSchemaInfoAsync(filter); SchemaInfoHelper.ExcludeExistingObjects(sourceSchemaInfo, targetSchema); } #region Set data type by user define type List <UserDefinedType> utypes = new List <UserDefinedType>(); if (sourceInterpreter.DatabaseType != this.Target.DbInterpreter.DatabaseType) { utypes = await sourceInterpreter.GetUserDefinedTypesAsync(); if (utypes != null && utypes.Count > 0) { foreach (TableColumn column in sourceSchemaInfo.TableColumns) { UserDefinedType utype = utypes.FirstOrDefault(item => item.Name == column.DataType); if (utype != null) { column.DataType = utype.Type; column.MaxLength = utype.MaxLength; } } } } #endregion SchemaInfo targetSchemaInfo = SchemaInfoHelper.Clone(sourceSchemaInfo); if (this.Source.TableNameMappings != null && this.Source.TableNameMappings.Count > 0) { SchemaInfoHelper.MapTableNames(targetSchemaInfo, this.Source.TableNameMappings); } if (this.Option.RenameTableChildren) { SchemaInfoHelper.RenameTableChildren(targetSchemaInfo); } if (this.Option.IgnoreNotSelfForeignKey) { targetSchemaInfo.TableForeignKeys = targetSchemaInfo.TableForeignKeys.Where(item => item.TableName == item.ReferencedTableName).ToList(); } #region Translate TranslateEngine translateEngine = new TranslateEngine(sourceSchemaInfo, targetSchemaInfo, sourceInterpreter, this.Target.DbInterpreter, this.Option, this.Target.DbOwner); translateEngine.SkipError = this.Option.SkipScriptError || this.Option.OnlyForTranslate; DatabaseObjectType translateDbObjectType = TranslateEngine.SupportDatabaseObjectType; if (!this.Option.GenerateScriptMode.HasFlag(GenerateScriptMode.Schema) && this.Option.BulkCopy && this.Target.DbInterpreter.SupportBulkCopy) { translateDbObjectType = DatabaseObjectType.TableColumn; } translateEngine.UserDefinedTypes = utypes; translateEngine.OnTranslated += this.Translated; translateEngine.Subscribe(this.observer); translateEngine.Translate(translateDbObjectType); if (this.Option.OnlyForTranslate) { if (targetSchemaInfo.Tables.Count == 0 && targetSchemaInfo.UserDefinedTypes.Count == 0) { return; } } #endregion if (targetSchemaInfo.Tables.Any()) { if (this.Option.EnsurePrimaryKeyNameUnique) { SchemaInfoHelper.EnsurePrimaryKeyNameUnique(targetSchemaInfo); } if (this.Option.EnsureIndexNameUnique) { SchemaInfoHelper.EnsureIndexNameUnique(targetSchemaInfo); } } DbInterpreter targetInterpreter = this.Target.DbInterpreter; bool generateIdentity = targetInterpreter.Option.TableScriptsGenerateOption.GenerateIdentity; if (generateIdentity) { targetInterpreter.Option.InsertIdentityValue = true; } string script = ""; targetInterpreter.Subscribe(this.observer); ScriptBuilder scriptBuilder = null; DbScriptGenerator targetDbScriptGenerator = DbScriptGeneratorHelper.GetDbScriptGenerator(targetInterpreter); if (this.Option.GenerateScriptMode.HasFlag(GenerateScriptMode.Schema)) { scriptBuilder = targetDbScriptGenerator.GenerateSchemaScripts(targetSchemaInfo); if (targetSchemaInfo.Tables.Any()) { this.Translated(targetInterpreter.DatabaseType, targetSchemaInfo.Tables.First(), new TranslateResult() { Data = scriptBuilder.ToString() }); } } if (this.Option.OnlyForTranslate) { return; } DataTransferErrorProfile dataErrorProfile = null; using (DbConnection dbConnection = this.Option.ExecuteScriptOnTargetServer ? targetInterpreter.CreateConnection() : null) { this.isBusy = true; if (this.Option.ExecuteScriptOnTargetServer && this.Option.UseTransaction) { dbConnection.Open(); this.transaction = dbConnection.BeginTransaction(); } #region Schema sync if (scriptBuilder != null && this.Option.ExecuteScriptOnTargetServer) { List <Script> scripts = scriptBuilder.Scripts; if (scripts.Count == 0) { this.Feedback(targetInterpreter, $"The script to create schema is empty.", FeedbackInfoType.Info); this.isBusy = false; return; } targetInterpreter.Feedback(FeedbackInfoType.Info, "Begin to sync schema..."); try { if (!this.Option.SplitScriptsToExecute) { targetInterpreter.Feedback(FeedbackInfoType.Info, script); await targetInterpreter.ExecuteNonQueryAsync(dbConnection, this.GetCommandInfo(script, null, this.transaction)); } else { Func <Script, bool> isValidScript = (s) => { return(!(s is NewLineSript || s is SpliterScript || string.IsNullOrEmpty(s.Content) || s.Content == targetInterpreter.ScriptsDelimiter)); }; int count = scripts.Where(item => isValidScript(item)).Count(); int i = 0; foreach (Script s in scripts) { if (targetInterpreter.HasError) { break; } if (!isValidScript(s)) { continue; } bool isCreateScript = s.ObjectType == nameof(Function) || s.ObjectType == nameof(Procedure) || s.ObjectType == nameof(TableTrigger); bool skipError = this.Option.SkipScriptError && isCreateScript; string sql = s.Content?.Trim(); if (!string.IsNullOrEmpty(sql) && sql != targetInterpreter.ScriptsDelimiter) { i++; if (!isCreateScript && targetInterpreter.ScriptsDelimiter.Length == 1 && sql.EndsWith(targetInterpreter.ScriptsDelimiter)) { sql = sql.TrimEnd(targetInterpreter.ScriptsDelimiter.ToArray()); } if (!targetInterpreter.HasError) { targetInterpreter.Feedback(FeedbackInfoType.Info, $"({i}/{count}), executing:{Environment.NewLine} {sql}"); CommandInfo commandInfo = this.GetCommandInfo(sql, null, transaction); commandInfo.SkipError = skipError; await targetInterpreter.ExecuteNonQueryAsync(dbConnection, commandInfo); } } } } } catch (Exception ex) { targetInterpreter.CancelRequested = true; this.Rollback(); ConnectionInfo sourceConnectionInfo = sourceInterpreter.ConnectionInfo; ConnectionInfo targetConnectionInfo = targetInterpreter.ConnectionInfo; SchemaTransferException schemaTransferException = new SchemaTransferException(ex) { SourceServer = sourceConnectionInfo.Server, SourceDatabase = sourceConnectionInfo.Database, TargetServer = targetConnectionInfo.Server, TargetDatabase = targetConnectionInfo.Database }; this.HandleError(schemaTransferException); } targetInterpreter.Feedback(FeedbackInfoType.Info, "End sync schema."); } #endregion #region Data sync if (!targetInterpreter.HasError && this.Option.GenerateScriptMode.HasFlag(GenerateScriptMode.Data) && sourceSchemaInfo.Tables.Count > 0) { List <TableColumn> identityTableColumns = new List <TableColumn>(); if (generateIdentity) { identityTableColumns = targetSchemaInfo.TableColumns.Where(item => item.IsIdentity).ToList(); } if (this.Option.PickupTable) { dataErrorProfile = DataTransferErrorProfileManager.GetProfile(sourceInterpreter.ConnectionInfo, targetInterpreter.ConnectionInfo); if (dataErrorProfile != null) { sourceSchemaInfo.PickupTable = new Table() { Owner = schemaInfo.Tables.FirstOrDefault()?.Owner, Name = dataErrorProfile.SourceTableName }; } } await this.SetIdentityEnabled(identityTableColumns, targetInterpreter, targetDbScriptGenerator, dbConnection, transaction, false); if (this.Option.ExecuteScriptOnTargetServer || targetInterpreter.Option.ScriptOutputMode.HasFlag(GenerateScriptOutputMode.WriteToFile)) { Dictionary <Table, long> dictTableDataTransferredCount = new Dictionary <Table, long>(); sourceInterpreter.OnDataRead += async(TableDataReadInfo tableDataReadInfo) => { if (!this.hasError) { Table table = tableDataReadInfo.Table; List <TableColumn> columns = tableDataReadInfo.Columns; try { (Table Table, List <TableColumn> Columns)targetTableAndColumns = this.GetTargetTableColumns(targetSchemaInfo, this.Target.DbOwner, table, columns); if (targetTableAndColumns.Table == null || targetTableAndColumns.Columns == null) { return; } if (this.Option.ExecuteScriptOnTargetServer) { DataTable dataTable = tableDataReadInfo.DataTable; List <Dictionary <string, object> > data = tableDataReadInfo.Data; if (this.Option.BulkCopy && targetInterpreter.SupportBulkCopy) { BulkCopyInfo bulkCopyInfo = this.GetBulkCopyInfo(table, targetSchemaInfo, this.transaction); if (targetInterpreter.DatabaseType == DatabaseType.Oracle) { if (columns.Any(item => item.DataType.ToLower().Contains("datetime2") || item.DataType.ToLower().Contains("timestamp"))) { bulkCopyInfo.DetectDateTimeTypeByValues = true; } } if (this.Option.ConvertComputeColumnExpression) { IEnumerable <DataColumn> dataColumns = dataTable.Columns.OfType <DataColumn>(); foreach (TableColumn column in bulkCopyInfo.Columns) { if (column.IsComputed && dataColumns.Any(item => item.ColumnName == column.Name)) { dataTable.Columns.Remove(column.Name); } } } await targetInterpreter.BulkCopyAsync(dbConnection, dataTable, bulkCopyInfo); } else { StringBuilder sb = new StringBuilder(); Dictionary <string, object> paramters = targetDbScriptGenerator.AppendDataScripts(sb, targetTableAndColumns.Table, targetTableAndColumns.Columns, new Dictionary <long, List <Dictionary <string, object> > >() { { 1, data } }); script = sb.ToString().Trim().Trim(';'); await targetInterpreter.ExecuteNonQueryAsync(dbConnection, this.GetCommandInfo(script, paramters, this.transaction)); } if (!dictTableDataTransferredCount.ContainsKey(table)) { dictTableDataTransferredCount.Add(table, dataTable.Rows.Count); } else { dictTableDataTransferredCount[table] += dataTable.Rows.Count; } long transferredCount = dictTableDataTransferredCount[table]; double percent = (transferredCount * 1.0 / tableDataReadInfo.TotalCount) * 100; string strPercent = (percent == (int)percent) ? (percent + "%") : (percent / 100).ToString("P2"); targetInterpreter.FeedbackInfo($"Table \"{table.Name}\":{dataTable.Rows.Count} records transferred.({transferredCount}/{tableDataReadInfo.TotalCount},{strPercent})"); } } catch (Exception ex) { sourceInterpreter.CancelRequested = true; this.Rollback(); ConnectionInfo sourceConnectionInfo = sourceInterpreter.ConnectionInfo; ConnectionInfo targetConnectionInfo = targetInterpreter.ConnectionInfo; string mappedTableName = this.GetMappedTableName(table.Name); DataTransferException dataTransferException = new DataTransferException(ex) { SourceServer = sourceConnectionInfo.Server, SourceDatabase = sourceConnectionInfo.Database, SourceObject = table.Name, TargetServer = targetConnectionInfo.Server, TargetDatabase = targetConnectionInfo.Database, TargetObject = mappedTableName }; this.HandleError(dataTransferException); if (!this.Option.UseTransaction) { DataTransferErrorProfileManager.Save(new DataTransferErrorProfile { SourceServer = sourceConnectionInfo.Server, SourceDatabase = sourceConnectionInfo.Database, SourceTableName = table.Name, TargetServer = targetConnectionInfo.Server, TargetDatabase = targetConnectionInfo.Database, TargetTableName = mappedTableName }); } } } }; } DbScriptGenerator sourceDbScriptGenerator = DbScriptGeneratorHelper.GetDbScriptGenerator(sourceInterpreter); await sourceDbScriptGenerator.GenerateDataScriptsAsync(sourceSchemaInfo); await this.SetIdentityEnabled(identityTableColumns, targetInterpreter, targetDbScriptGenerator, dbConnection, transaction, true); } #endregion if (this.transaction != null && this.transaction.Connection != null && !this.cancelRequested) { this.transaction.Commit(); } this.isBusy = false; } if (dataErrorProfile != null && !this.hasError && !this.cancelRequested) { DataTransferErrorProfileManager.Remove(dataErrorProfile); } }
private async Task ConvertorBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { if (this.convertorBackgroundWorker.CancellationPending) { e.Cancel = true; return; } SchemaInfo schemaInfo = this.GetSourceTreeSchemaInfo(); if (!this.ValidateSource(schemaInfo)) { return; } if (this.targetDbConnectionInfo == null) { MessageBox.Show("Target connection info is null."); return; } if (this.sourceDbConnectionInfo.Server == this.targetDbConnectionInfo.Server && this.sourceDbConnectionInfo.Database == this.targetDbConnectionInfo.Database) { MessageBox.Show("Source database cannot be equal to the target database."); return; } DatabaseType sourceDbType = this.GetDatabaseType(this.cboSourceDB.Text); DatabaseType targetDbType = this.GetDatabaseType(this.cboTargetDB.Text); int dataBatchSize = SettingManager.Setting.DataBatchSize; GenerateScriptOption sourceScriptOption = new GenerateScriptOption() { ScriptOutputMode = GenerateScriptOutputMode.None, DataBatchSize = dataBatchSize }; GenerateScriptOption targetScriptOption = new GenerateScriptOption() { ScriptOutputMode = (GenerateScriptOutputMode.WriteToString), DataBatchSize = dataBatchSize }; this.SetGenerateScriptOption(sourceScriptOption, targetScriptOption); targetScriptOption.GenerateIdentity = this.chkGenerateIdentity.Checked; GenerateScriptMode scriptMode = this.GetGenerateScriptMode(); if (scriptMode == GenerateScriptMode.None) { MessageBox.Show("Please specify the script mode."); return; } DbConvetorInfo source = new DbConvetorInfo() { DbInterpreter = DbInterpreterHelper.GetDbInterpreter(sourceDbType, this.sourceDbConnectionInfo, sourceScriptOption) }; DbConvetorInfo target = new DbConvetorInfo() { DbInterpreter = DbInterpreterHelper.GetDbInterpreter(targetDbType, this.targetDbConnectionInfo, targetScriptOption) }; DbConvertor dbConvertor = new DbConvertor(source, target, null); dbConvertor.Option.GenerateScriptMode = scriptMode; dbConvertor.OnFeedback += Feedback; if (sourceDbType == DatabaseType.MySql) { source.DbInterpreter.Option.InQueryItemLimitCount = 2000; } if (targetDbType == DatabaseType.SqlServer) { target.DbOwner = this.txtTargetDbOwner.Text ?? "dbo"; } else if (targetDbType == DatabaseType.MySql) { target.DbInterpreter.Option.RemoveEmoji = true; } else if (targetDbType == DatabaseType.Oracle) { dbConvertor.Option.SplitScriptsToExecute = true; dbConvertor.Option.ScriptSplitChar = ';'; } DataTransferErrorProfile dataErrorProfile = null; if (this.chkPickup.Checked && scriptMode.HasFlag(GenerateScriptMode.Data)) { dataErrorProfile = DataTransferErrorProfileManager.GetProfile(this.sourceDbConnectionInfo, this.targetDbConnectionInfo); if (dataErrorProfile != null) { dbConvertor.Option.PickupTable = new Table() { Owner = schemaInfo.Tables.FirstOrDefault()?.Owner, Name = dataErrorProfile.SourceTableName }; } } this.btnExecute.Enabled = false; this.btnCancel.Enabled = true; bool success = false; try { await dbConvertor.ConvertAsync(schemaInfo, false); success = true; if (dataErrorProfile != null) { DataTransferErrorProfileManager.Remove(dataErrorProfile); } } catch (Exception ex) { string errMsg = ex.Message; sbFeedback.AppendLine("Error:" + ex.Message); if (ex.InnerException != null) { sbFeedback.AppendLine("Innser Exception:" + ex.InnerException.Message); } if (!string.IsNullOrEmpty(ex.StackTrace)) { sbFeedback.AppendLine(ex.StackTrace); } this.AppendErrorMessage(errMsg); this.txtMessage.SelectionStart = this.txtMessage.TextLength; this.txtMessage.ScrollToCaret(); this.btnExecute.Enabled = true; this.btnCancel.Enabled = false; if (ex is TableDataTransferException dataException) { DataTransferErrorProfileManager.Save(new DataTransferErrorProfile { SourceServer = dataException.SourceServer, SourceDatabase = dataException.SourceDatabase, SourceTableName = dataException.SourceTableName, TargetServer = dataException.TargetServer, TargetDatabase = dataException.TargetDatabase, TargetTableName = dataException.TargetTableName }); } MessageBox.Show(ex.Message); } LogHelper.Log(sbFeedback.ToString()); sbFeedback.Clear(); if (success) { this.btnExecute.Enabled = true; this.btnCancel.Enabled = false; this.txtMessage.AppendText(Environment.NewLine + DONE); MessageBox.Show(DONE); } }
private async Task InternalConvert(SchemaInfo schemaInfo = null) { DbInterpreter sourceInterpreter = this.Source.DbInterpreter; sourceInterpreter.Option.TreatBytesAsNullForScript = true; SelectionInfo selectionInfo = new SelectionInfo(); if (schemaInfo != null) { selectionInfo.UserDefinedTypeNames = schemaInfo.UserDefinedTypes.Select(item => item.Name).ToArray(); selectionInfo.TableNames = schemaInfo.Tables.Select(t => t.Name).ToArray(); selectionInfo.ViewNames = schemaInfo.Views.Select(item => item.Name).ToArray(); } SchemaInfo sourceSchemaInfo = await sourceInterpreter.GetSchemaInfoAsync(selectionInfo); #region Set data type by user define type List <UserDefinedType> utypes = await sourceInterpreter.GetUserDefinedTypesAsync(); if (utypes != null && utypes.Count > 0) { foreach (TableColumn column in sourceSchemaInfo.TableColumns) { UserDefinedType utype = utypes.FirstOrDefault(item => item.Name == column.DataType); if (utype != null) { column.DataType = utype.Type; column.MaxLength = utype.MaxLength; } } } #endregion SchemaInfo targetSchemaInfo = SchemaInfoHelper.Clone(sourceSchemaInfo); if (!string.IsNullOrEmpty(this.Target.DbOwner)) { SchemaInfoHelper.TransformOwner(targetSchemaInfo, this.Target.DbOwner); } ColumnTranslator columnTranslator = new ColumnTranslator(targetSchemaInfo.TableColumns, this.Source.DbInterpreter.DatabaseType, this.Target.DbInterpreter.DatabaseType); targetSchemaInfo.TableColumns = columnTranslator.Translate(); ViewTranslator viewTranslator = new ViewTranslator(targetSchemaInfo.Views, sourceInterpreter, this.Target.DbInterpreter, this.Target.DbOwner); targetSchemaInfo.Views = viewTranslator.Translate(); if (this.Option.EnsurePrimaryKeyNameUnique) { SchemaInfoHelper.EnsurePrimaryKeyNameUnique(targetSchemaInfo); } if (this.Option.EnsureIndexNameUnique) { SchemaInfoHelper.EnsureIndexNameUnique(targetSchemaInfo); } DbInterpreter targetInterpreter = this.Target.DbInterpreter; bool generateIdentity = targetInterpreter.Option.GenerateIdentity; if (generateIdentity) { targetInterpreter.Option.InsertIdentityValue = true; } string script = ""; sourceInterpreter.Subscribe(this.observer); targetInterpreter.Subscribe(this.observer); DataTransferErrorProfile dataErrorProfile = null; using (DbConnection dbConnection = targetInterpreter.GetDbConnector().CreateConnection()) { this.isBusy = true; if (this.Option.UseTransaction) { dbConnection.Open(); this.transaction = dbConnection.BeginTransaction(); } #region Schema sync if (this.Option.GenerateScriptMode.HasFlag(GenerateScriptMode.Schema)) { script = targetInterpreter.GenerateSchemaScripts(targetSchemaInfo); if (this.Option.ExecuteScriptOnTargetServer) { if (string.IsNullOrEmpty(script)) { this.Feedback(targetInterpreter, $"The script to create schema is empty.", FeedbackInfoType.Error); return; } targetInterpreter.Feedback(FeedbackInfoType.Info, "Begin to sync schema..."); try { if (!this.Option.SplitScriptsToExecute) { targetInterpreter.Feedback(FeedbackInfoType.Info, script); await targetInterpreter.ExecuteNonQueryAsync(dbConnection, this.GetCommandInfo(script, null, this.transaction)); } else { string[] sqls = script.Split(new string[] { targetInterpreter.ScriptsSplitString }, StringSplitOptions.RemoveEmptyEntries); int count = sqls.Count(); int i = 0; foreach (string sql in sqls) { if (!string.IsNullOrEmpty(sql.Trim())) { i++; if (!targetInterpreter.HasError) { targetInterpreter.Feedback(FeedbackInfoType.Info, $"({i}/{count}), executing:{Environment.NewLine} {sql}"); await targetInterpreter.ExecuteNonQueryAsync(dbConnection, this.GetCommandInfo(sql.Trim(), null, transaction)); } } } } } catch (Exception ex) { targetInterpreter.CancelRequested = true; this.Rollback(); ConnectionInfo sourceConnectionInfo = sourceInterpreter.ConnectionInfo; ConnectionInfo targetConnectionInfo = targetInterpreter.ConnectionInfo; SchemaTransferException schemaTransferException = new SchemaTransferException(ex) { SourceServer = sourceConnectionInfo.Server, SourceDatabase = sourceConnectionInfo.Database, TargetServer = targetConnectionInfo.Server, TargetDatabase = targetConnectionInfo.Database }; this.HandleError(schemaTransferException); } targetInterpreter.Feedback(FeedbackInfoType.Info, "End sync schema."); } } #endregion #region Data sync if (!targetInterpreter.HasError && this.Option.GenerateScriptMode.HasFlag(GenerateScriptMode.Data) && sourceSchemaInfo.Tables.Count > 0) { List <TableColumn> identityTableColumns = new List <TableColumn>(); if (generateIdentity) { identityTableColumns = targetSchemaInfo.TableColumns.Where(item => item.IsIdentity).ToList(); } if (this.Option.PickupTable) { dataErrorProfile = DataTransferErrorProfileManager.GetProfile(sourceInterpreter.ConnectionInfo, targetInterpreter.ConnectionInfo); if (dataErrorProfile != null) { sourceSchemaInfo.PickupTable = new Table() { Owner = schemaInfo.Tables.FirstOrDefault()?.Owner, Name = dataErrorProfile.SourceTableName }; } } if (sourceInterpreter.Option.ScriptOutputMode.HasFlag(GenerateScriptOutputMode.WriteToFile)) { sourceInterpreter.AppendScriptsToFile("", GenerateScriptMode.Data, true); } if (targetInterpreter.Option.ScriptOutputMode.HasFlag(GenerateScriptOutputMode.WriteToFile)) { targetInterpreter.AppendScriptsToFile("", GenerateScriptMode.Data, true); } foreach (var item in identityTableColumns) { if (targetInterpreter.DatabaseType == DatabaseType.SqlServer) { await targetInterpreter.SetIdentityEnabled(dbConnection, item, false); } } if (this.Option.ExecuteScriptOnTargetServer || targetInterpreter.Option.ScriptOutputMode.HasFlag(GenerateScriptOutputMode.WriteToFile)) { sourceInterpreter.OnDataRead += async(table, columns, data, dataTable) => { if (!this.hasError) { try { StringBuilder sb = new StringBuilder(); (Table Table, List <TableColumn> Columns)targetTableAndColumns = this.GetTargetTableColumns(targetSchemaInfo, this.Target.DbOwner, table, columns); if (targetTableAndColumns.Table == null || targetTableAndColumns.Columns == null) { return; } Dictionary <string, object> paramters = targetInterpreter.AppendDataScripts(sb, targetTableAndColumns.Table, targetTableAndColumns.Columns, new Dictionary <long, List <Dictionary <string, object> > >() { { 1, data } }); script = sb.ToString().Trim().Trim(';'); if (this.Option.ExecuteScriptOnTargetServer) { if (this.Option.BulkCopy && targetInterpreter.SupportBulkCopy) { await targetInterpreter.BulkCopyAsync(dbConnection, dataTable, table.Name); } else { await targetInterpreter.ExecuteNonQueryAsync(dbConnection, this.GetCommandInfo(script, paramters, this.transaction)); } targetInterpreter.FeedbackInfo($"Table \"{table.Name}\":{data.Count} records transferred."); } } catch (Exception ex) { sourceInterpreter.CancelRequested = true; this.Rollback(); ConnectionInfo sourceConnectionInfo = sourceInterpreter.ConnectionInfo; ConnectionInfo targetConnectionInfo = targetInterpreter.ConnectionInfo; DataTransferException dataTransferException = new DataTransferException(ex) { SourceServer = sourceConnectionInfo.Server, SourceDatabase = sourceConnectionInfo.Database, SourceObject = table.Name, TargetServer = targetConnectionInfo.Server, TargetDatabase = targetConnectionInfo.Database, TargetObject = table.Name }; this.HandleError(dataTransferException); if (!this.Option.UseTransaction) { DataTransferErrorProfileManager.Save(new DataTransferErrorProfile { SourceServer = sourceConnectionInfo.Server, SourceDatabase = sourceConnectionInfo.Database, SourceTableName = table.Name, TargetServer = targetConnectionInfo.Server, TargetDatabase = targetConnectionInfo.Database, TargetTableName = table.Name }); } } } }; } await sourceInterpreter.GenerateDataScriptsAsync(sourceSchemaInfo); foreach (var item in identityTableColumns) { if (targetInterpreter.DatabaseType == DatabaseType.SqlServer) { await targetInterpreter.SetIdentityEnabled(dbConnection, item, true); } } } #endregion if (this.transaction != null && !this.cancelRequested) { this.transaction.Commit(); } this.isBusy = false; } if (dataErrorProfile != null && !this.hasError && !this.cancelRequested) { DataTransferErrorProfileManager.Remove(dataErrorProfile); } }