public void Close() { if (Status == ConnectionStatus.Open) { SourceConnection.Close(); } else if (Status == ConnectionStatus.Opening) { cancelSource.Cancel(); } Status = ConnectionStatus.Closed; Closed?.Invoke(this, EventArgs.Empty); }
protected override void BeginProcessing() { DbTransaction transaction = null; try { if ((TargetTable == null && TargetSql == null) || (TargetTable != null && TargetSql != null)) { throw new ArgumentException("Specify either one of TargetTable or TargetSql"); } bool timeoutGiven = MyInvocation.BoundParameters.ContainsKey("Timeout"); var connection = TargetConnection.Connection; transaction = connection.BeginTransaction(); using (var selectCmd = SourceConnection.Connection.CreateCommand()) { selectCmd.CommandText = SourceSql; if (timeoutGiven) { selectCmd.CommandTimeout = Timeout; } Helpers.SetParameters(selectCmd, SourceParameters); using (var reader = selectCmd.ExecuteReader()) { string[] paramNames = null; while (reader.Read()) { if (paramNames == null) { paramNames = new string[reader.FieldCount]; for (var i = 0; i < reader.FieldCount; ++i) { paramNames[i] = reader.GetName(i); } } using (var insertCmd = TargetConnection.Connection.CreateCommand()) { insertCmd.Transaction = transaction; if (TargetSql == null) { var factory = Helpers.GetDbProviderFactory(connection); using (var builder = factory.CreateCommandBuilder()) { var columns = string.Join(", ", paramNames.Select(p => builder.QuoteIdentifier(p))); var paras = "@" + string.Join(", @", paramNames); TargetSql = $"insert into {TargetTable} ({columns}) values ({paras})"; } } insertCmd.CommandText = TargetSql; for (var i = 0; i < reader.FieldCount; ++i) { var param = insertCmd.CreateParameter(); param.ParameterName = paramNames[i]; param.Value = reader.GetValue(i); insertCmd.Parameters.Add(param); } if (timeoutGiven) { insertCmd.CommandTimeout = Timeout; } insertCmd.ExecuteNonQuery(); } } } } transaction.Commit(); } catch (Exception e) { if (transaction != null) { transaction.Rollback(); } WriteError(new ErrorRecord(e, "", ErrorCategory.NotSpecified, null)); } finally { SourceConnection.Close(); TargetConnection.Close(); } }