Ejemplo n.º 1
0
        public void Close()
        {
            if (Status == ConnectionStatus.Open)
            {
                SourceConnection.Close();
            }
            else if (Status == ConnectionStatus.Opening)
            {
                cancelSource.Cancel();
            }

            Status = ConnectionStatus.Closed;
            Closed?.Invoke(this, EventArgs.Empty);
        }
Ejemplo n.º 2
0
        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();
            }
        }