Esempio n. 1
0
        public override int Process(IRelationalConnection connection, IEnumerable <TEntity> items)
        {
            int result = 0;

            using (var prepare = PrepareStatement(connection).NullDisposable())
            {
                if (prepare.Target != null)
                {
                    prepare.Target.ExecuteNonQuery();
                }
            }

            using (var bulk = CreateBulkCopy(connection))
                using (var enumerableReader = new EnumerableDataReader <TEntity>(items, InboundColumns, OutboundColumns.Any()))
                {
                    bulk.WriteToServer(enumerableReader);

                    using (var commit = CommitStatement(connection).NullDisposable())
                    {
                        if (commit.Target != null)
                        {
                            if (OutboundColumns.Any())
                            {
                                using (var reader = commit.Target.ExecuteReader())
                                {
                                    Dictionary <IColumnSetup, object> values = OutboundColumns.ToDictionary(p => p, p => (object)null);
                                    var run = 0;
                                    while (reader.Read())
                                    {
                                        GetResultValues(reader, values);
                                        ColumnSetupProvider.PropagateValues(enumerableReader.TrackedItems[run], values);
                                        run++;
                                    }

                                    result = run;
                                }
                            }
                            else
                            {
                                var scalar = commit.Target.ExecuteScalar();
                                result = (int)scalar;
                            }
                        }
                        else
                        {
                            result = enumerableReader.Position;
                        }
                    }
                }

            using (var commit = CleanupStatement(connection).NullDisposable())
            {
                if (commit.Target != null)
                {
                    commit.Target.ExecuteNonQuery();
                }
            }

            return(result);
        }
Esempio n. 2
0
        protected override SqlCommand PrepareStatement(IRelationalConnection connection)
        {
            if (!OutboundColumns.Any())
            {
                return(null);
            }

            var columnNames = InboundColumns.Select(p => $"[{p.ColumnName}]");

            var commandText = $"Select Top 0 {string.Join(", ", columnNames)} into {_bulkTable} FROM {_targetTableName}";

            var command = connection.DbConnection.CreateCommand();

            command.Transaction    = connection.CurrentTransaction.GetDbTransaction();
            command.CommandText    = commandText;
            command.CommandTimeout = connection.CommandTimeout ?? 60;

            return((SqlCommand)command);
        }
Esempio n. 3
0
        protected override SqlCommand CommitStatement(IRelationalConnection connection)
        {
            if (!OutboundColumns.Any())
            {
                return(null);
            }

            var writeColumns = string.Join(", ", InboundColumns.Select(p => $"[{p.ColumnName}]"));

            var commandText = $"INSERT INTO {_targetTableName} ({writeColumns}) " +
                              $"OUTPUT {string.Join(", ", OutboundColumns.Select(p => $"inserted.[{p.ColumnName}]"))} " +
                              $"SELECT {writeColumns} FROM {_bulkTable}";

            var command = connection.DbConnection.CreateCommand();

            command.CommandText    = commandText;
            command.Transaction    = connection.CurrentTransaction.GetDbTransaction();
            command.CommandTimeout = connection.CommandTimeout ?? 60;
            return((SqlCommand)command);
        }
Esempio n. 4
0
        public InsertBulkProcessor(IColumnSetupProvider columnSetupProvider, SqlBulkCopyOptions options, Action <SqlBulkCopy> setup = null)
            : base(EntityState.Added, columnSetupProvider, options)
        {
            _setup           = setup;
            _targetTableName = $"[{columnSetupProvider.TableName}]";
            _bulkTable       = _targetTableName;

            if (OutboundColumns.Any())
            {
                _bulkTable = $"[#{columnSetupProvider.TableName}_{State}]";
            }

            if (!string.IsNullOrWhiteSpace(columnSetupProvider.SchemaName))
            {
                _targetTableName = $"[{columnSetupProvider.SchemaName}].{_targetTableName}";
                _bulkTable       = $"[{columnSetupProvider.SchemaName}].{_bulkTable}";
            }

            if (_bulkTable != _targetTableName)
            {
                _tempTableName = _bulkTable;
            }
        }