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); }
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); }
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); }
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; } }