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