Ejemplo n.º 1
0
        protected override BulkCopyRowsCopied ProviderSpecificCopy <T>(
            [JetBrains.Annotations.NotNull] ITable <T> table,
            BulkCopyOptions options,
            IEnumerable <T> source)
        {
            if (!(table?.DataContext is DataConnection dataConnection))
            {
                throw new ArgumentNullException(nameof(dataConnection));
            }

            if (dataConnection.Connection is DbConnection dbConnection)
            {
                if (Proxy.GetUnderlyingObject(dbConnection) is SqlConnection connection)
                {
                    var ed      = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
                    var columns = ed.Columns.Where(c => !c.SkipOnInsert || options.KeepIdentity == true && c.IsIdentity).ToList();
                    var sb      = _dataProvider.CreateSqlBuilder();
                    var rd      = new BulkCopyReader(_dataProvider, dataConnection.MappingSchema, columns, source);
                    var sqlopt  = SqlBulkCopyOptions.Default;
                    var rc      = new BulkCopyRowsCopied();

                    if (options.CheckConstraints == true)
                    {
                        sqlopt |= SqlBulkCopyOptions.CheckConstraints;
                    }
                    if (options.KeepIdentity == true)
                    {
                        sqlopt |= SqlBulkCopyOptions.KeepIdentity;
                    }
                    if (options.TableLock == true)
                    {
                        sqlopt |= SqlBulkCopyOptions.TableLock;
                    }
                    if (options.KeepNulls == true)
                    {
                        sqlopt |= SqlBulkCopyOptions.KeepNulls;
                    }
                    if (options.FireTriggers == true)
                    {
                        sqlopt |= SqlBulkCopyOptions.FireTriggers;
                    }
                    if (options.UseInternalTransaction == true)
                    {
                        sqlopt |= SqlBulkCopyOptions.UseInternalTransaction;
                    }

                    using (var bc = new SqlBulkCopy(connection, sqlopt, (SqlTransaction)dataConnection.Transaction))
                    {
                        if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                        {
                            bc.NotifyAfter = options.NotifyAfter;

                            bc.SqlRowsCopied += (sender, e) =>
                            {
                                rc.RowsCopied = e.RowsCopied;
                                options.RowsCopiedCallback(rc);
                                if (rc.Abort)
                                {
                                    e.Abort = true;
                                }
                            };
                        }

                        if (options.MaxBatchSize.HasValue)
                        {
                            bc.BatchSize = options.MaxBatchSize.Value;
                        }
                        if (options.BulkCopyTimeout.HasValue)
                        {
                            bc.BulkCopyTimeout = options.BulkCopyTimeout.Value;
                        }

                        var sqlBuilder = _dataProvider.CreateSqlBuilder();
                        var tableName  = GetTableName(sqlBuilder, options, table);

                        bc.DestinationTableName = tableName;

                        for (var i = 0; i < columns.Count; i++)
                        {
                            bc.ColumnMappings.Add(new SqlBulkCopyColumnMapping(
                                                      i,
                                                      sb.Convert(columns[i].ColumnName, ConvertType.NameToQueryField).ToString()));
                        }

                        TraceAction(
                            dataConnection,
                            () => "INSERT BULK " + tableName + "(" + string.Join(", ", bc.ColumnMappings.Cast <SqlBulkCopyColumnMapping>().Select(x => x.DestinationColumn)) + Environment.NewLine,
                            () => { bc.WriteToServer(rd); return(rd.Count); });
                    }

                    if (rc.RowsCopied != rd.Count)
                    {
                        rc.RowsCopied = rd.Count;

                        if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                        {
                            options.RowsCopiedCallback(rc);
                        }
                    }

                    return(rc);
                }
            }

            return(MultipleRowsCopy(table, options, source));
        }
Ejemplo n.º 2
0
        protected override BulkCopyRowsCopied ProviderSpecificCopy <T>(
            ITable <T> table,
            BulkCopyOptions options,
            IEnumerable <T> source)
        {
            if (table.DataContext is DataConnection dataConnection)
            {
                var connection = _provider.TryGetProviderConnection(dataConnection.Connection, dataConnection.MappingSchema);

                var transaction = dataConnection.Transaction;
                if (connection != null && transaction != null)
                {
                    transaction = _provider.TryGetProviderTransaction(transaction, dataConnection.MappingSchema);
                }

                if (connection != null && (dataConnection.Transaction == null || transaction != null))
                {
                    var ed      = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
                    var columns = ed.Columns.Where(c => !c.SkipOnInsert || options.KeepIdentity == true && c.IsIdentity).ToList();
                    var sb      = _provider.CreateSqlBuilder(dataConnection.MappingSchema);
                    var rd      = new BulkCopyReader(dataConnection, columns, source);
                    var sqlopt  = SqlServerProviderAdapter.SqlBulkCopyOptions.Default;
                    var rc      = new BulkCopyRowsCopied();

                    if (options.CheckConstraints == true)
                    {
                        sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.CheckConstraints;
                    }
                    if (options.KeepIdentity == true)
                    {
                        sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.KeepIdentity;
                    }
                    if (options.TableLock == true)
                    {
                        sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.TableLock;
                    }
                    if (options.KeepNulls == true)
                    {
                        sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.KeepNulls;
                    }
                    if (options.FireTriggers == true)
                    {
                        sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.FireTriggers;
                    }
                    if (options.UseInternalTransaction == true)
                    {
                        sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.UseInternalTransaction;
                    }

                    using (var bc = _provider.Adapter.CreateBulkCopy(connection, sqlopt, transaction))
                    {
                        if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                        {
                            bc.NotifyAfter = options.NotifyAfter;

                            bc.SqlRowsCopied += (sender, args) =>
                            {
                                rc.RowsCopied = args.RowsCopied;
                                options.RowsCopiedCallback(rc);
                                if (rc.Abort)
                                {
                                    args.Abort = true;
                                }
                            };
                        }

                        if (options.MaxBatchSize.HasValue)
                        {
                            bc.BatchSize = options.MaxBatchSize.Value;
                        }
                        if (options.BulkCopyTimeout.HasValue)
                        {
                            bc.BulkCopyTimeout = options.BulkCopyTimeout.Value;
                        }

                        var tableName = GetTableName(sb, options, table);

                        bc.DestinationTableName = tableName;

                        for (var i = 0; i < columns.Count; i++)
                        {
                            bc.ColumnMappings.Add(_provider.Adapter.CreateBulkCopyColumnMapping(i, sb.ConvertInline(columns[i].ColumnName, ConvertType.NameToQueryField)));
                        }

                        TraceAction(
                            dataConnection,
                            () => "INSERT BULK " + tableName + "(" + string.Join(", ", columns.Select(x => x.ColumnName)) + Environment.NewLine,
                            () => { bc.WriteToServer(rd); return(rd.Count); });
                    }

                    if (rc.RowsCopied != rd.Count)
                    {
                        rc.RowsCopied = rd.Count;

                        if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                        {
                            options.RowsCopiedCallback(rc);
                        }
                    }

                    return(rc);
                }
            }

            return(MultipleRowsCopy(table, options, source));
        }
Ejemplo n.º 3
0
        private async Task <BulkCopyRowsCopied> ProviderSpecificCopyInternal <T>(
            ProviderConnections providerConnections,
            ITable <T> table,
            BulkCopyOptions options,
            Func <List <Mapping.ColumnDescriptor>, BulkCopyReader <T> > createDataReader,
            bool runAsync,
            CancellationToken cancellationToken)
            where T : notnull
        {
            var dataConnection = providerConnections.DataConnection;
            var connection     = providerConnections.ProviderConnection;
            var transaction    = providerConnections.ProviderTransaction;
            var ed             = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
            var columns        = ed.Columns.Where(c => !c.SkipOnInsert || options.KeepIdentity == true && c.IsIdentity).ToList();
            var sb             = _provider.CreateSqlBuilder(dataConnection.MappingSchema);
            var rd             = createDataReader(columns);
            var sqlopt         = SqlServerProviderAdapter.SqlBulkCopyOptions.Default;
            var rc             = new BulkCopyRowsCopied();

            if (options.CheckConstraints == true)
            {
                sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.CheckConstraints;
            }
            if (options.KeepIdentity == true)
            {
                sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.KeepIdentity;
            }
            if (options.TableLock == true)
            {
                sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.TableLock;
            }
            if (options.KeepNulls == true)
            {
                sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.KeepNulls;
            }
            if (options.FireTriggers == true)
            {
                sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.FireTriggers;
            }
            if (options.UseInternalTransaction == true)
            {
                sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.UseInternalTransaction;
            }

            using (var bc = _provider.Adapter.CreateBulkCopy(connection, sqlopt, transaction))
            {
                if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                {
                    bc.NotifyAfter = options.NotifyAfter;

                    bc.SqlRowsCopied += (sender, args) =>
                    {
                        rc.RowsCopied = args.RowsCopied;
                        options.RowsCopiedCallback(rc);
                        if (rc.Abort)
                        {
                            args.Abort = true;
                        }
                    };
                }

                if (options.MaxBatchSize.HasValue)
                {
                    bc.BatchSize = options.MaxBatchSize.Value;
                }

                if (options.BulkCopyTimeout.HasValue)
                {
                    bc.BulkCopyTimeout = options.BulkCopyTimeout.Value;
                }
                else if (Common.Configuration.Data.BulkCopyUseConnectionCommandTimeout)
                {
                    bc.BulkCopyTimeout = connection.ConnectionTimeout;
                }

                var tableName = GetTableName(sb, options, table);

                bc.DestinationTableName = tableName;

                for (var i = 0; i < columns.Count; i++)
                {
                    bc.ColumnMappings.Add(_provider.Adapter.CreateBulkCopyColumnMapping(i, sb.ConvertInline(columns[i].ColumnName, ConvertType.NameToQueryField)));
                }

                await TraceActionAsync(
                    dataConnection,
                    () => (runAsync ? "INSERT ASYNC BULK " : "INSERT BULK ") + tableName + "(" + string.Join(", ", columns.Select(x => x.ColumnName)) + ")" + Environment.NewLine,
                    async() => {
                    if (runAsync)
                    {
                        await bc.WriteToServerAsync(rd, cancellationToken).ConfigureAwait(Common.Configuration.ContinueOnCapturedContext);
                    }
                    else
                    {
                        bc.WriteToServer(rd);
                    }
                    return(rd.Count);
                }, true).ConfigureAwait(Common.Configuration.ContinueOnCapturedContext);
            }

            if (rc.RowsCopied != rd.Count)
            {
                rc.RowsCopied = rd.Count;

                if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                {
                    options.RowsCopiedCallback(rc);
                }
            }

            return(rc);
        }
Ejemplo n.º 4
0
        protected override BulkCopyRowsCopied ProviderSpecificCopy <T>(
            [JetBrains.Annotations.NotNull] DataConnection dataConnection,
            BulkCopyOptions options,
            IEnumerable <T> source)
        {
            if (dataConnection == null)
            {
                throw new ArgumentNullException("dataConnection");
            }

            var connection = dataConnection.Connection as SqlConnection;

            if (connection != null)
            {
                var ed      = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
                var columns = ed.Columns.Where(c => !c.SkipOnInsert || options.KeepIdentity == true && c.IsIdentity).ToList();
                var sb      = _dataProvider.CreateSqlBuilder();
                var rd      = new BulkCopyReader(_dataProvider, columns, source);
                var sqlopt  = SqlBulkCopyOptions.Default;
                var rc      = new BulkCopyRowsCopied();

                if (options.CheckConstraints == true)
                {
                    sqlopt |= SqlBulkCopyOptions.CheckConstraints;
                }
                if (options.KeepIdentity == true)
                {
                    sqlopt |= SqlBulkCopyOptions.KeepIdentity;
                }
                if (options.TableLock == true)
                {
                    sqlopt |= SqlBulkCopyOptions.TableLock;
                }
                if (options.KeepNulls == true)
                {
                    sqlopt |= SqlBulkCopyOptions.KeepNulls;
                }
                if (options.FireTriggers == true)
                {
                    sqlopt |= SqlBulkCopyOptions.FireTriggers;
                }
                if (options.UseInternalTransaction == true)
                {
                    sqlopt |= SqlBulkCopyOptions.UseInternalTransaction;
                }

                using (var bc = new SqlBulkCopy(connection, sqlopt, (SqlTransaction)dataConnection.Transaction))
                {
                    if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                    {
                        bc.NotifyAfter = options.NotifyAfter;

                        bc.SqlRowsCopied += (sender, e) =>
                        {
                            rc.RowsCopied = e.RowsCopied;
                            options.RowsCopiedCallback(rc);
                            if (rc.Abort)
                            {
                                e.Abort = true;
                            }
                        };
                    }

                    if (options.MaxBatchSize.HasValue)
                    {
                        bc.BatchSize = options.MaxBatchSize.Value;
                    }
                    if (options.BulkCopyTimeout.HasValue)
                    {
                        bc.BulkCopyTimeout = options.BulkCopyTimeout.Value;
                    }

                    var sqlBuilder = _dataProvider.CreateSqlBuilder();
                    var descriptor = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
                    var tableName  = GetTableName(sqlBuilder, descriptor);

                    bc.DestinationTableName = tableName;

                    for (var i = 0; i < columns.Count; i++)
                    {
                        bc.ColumnMappings.Add(new SqlBulkCopyColumnMapping(
                                                  i,
                                                  sb.Convert(columns[i].ColumnName, ConvertType.NameToQueryField).ToString()));
                    }

                    bc.WriteToServer(rd);
                }

                if (rc.RowsCopied != rd.Count)
                {
                    rc.RowsCopied = rd.Count;

                    if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                    {
                        options.RowsCopiedCallback(rc);
                    }
                }

                return(rc);
            }

            return(MultipleRowsCopy(dataConnection, options, source));
        }