void SetupBulkCopy(SqlBulkCopy bcp) { bcp.DestinationTableName = m_Table.Name.ToQuotedString(); if (m_BatchSize.HasValue) { bcp.BatchSize = m_BatchSize.Value; } bcp.EnableStreaming = m_EnableStreaming; if (m_EventHandler != null) { bcp.SqlRowsCopied += (s, e) => { //Copy-in/copy-out is needed to get a generic event handler. var e1 = new AbortableOperationEventArgs(e.RowsCopied); m_EventHandler.Invoke(s, e1); e.Abort = e1.Abort; } } ; if (m_NotifyAfter.HasValue) { bcp.NotifyAfter = m_NotifyAfter.Value; } for (var i = 0; i < m_Source.FieldCount; i++) { bcp.ColumnMappings.Add(m_Source.GetName(i), m_Source.GetName(i)); } } }
/// <summary> /// Implementation the specified operation. /// </summary> /// <param name="connection">The connection.</param> /// <param name="transaction">The transaction.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task<System.Nullable<System.Int32>>.</returns> protected override async Task <int?> ImplementationAsync(NpgsqlConnection connection, NpgsqlTransaction?transaction, CancellationToken cancellationToken) { if (connection == null) { throw new ArgumentNullException(nameof(connection), $"{nameof(connection)} is null."); } var rowCount = 0; var columns = SetupColumns(); var sql = SetupSql(columns); var nextNotification = m_NotifyAfter; using (var writer = connection.BeginBinaryImport(sql)) { while (m_Source.Read()) { await writer.StartRowAsync(cancellationToken).ConfigureAwait(false); foreach (var column in columns) { if (column.Column.DbType.HasValue) { await writer.WriteAsync(m_Source.GetValue(column.ColumnIndex), column.Column.DbType.Value, cancellationToken).ConfigureAwait(false); } else { await writer.WriteAsync(m_Source.GetValue(column.ColumnIndex), cancellationToken).ConfigureAwait(false); } } rowCount++; if (rowCount == nextNotification) { var e = new AbortableOperationEventArgs(rowCount); m_EventHandler?.Invoke(this, e); nextNotification += m_NotifyAfter; if (e.Abort) { writer.Complete(); throw new TaskCanceledException("Bulk insert operation aborted."); } } } await writer.CompleteAsync(cancellationToken).ConfigureAwait(false); } return(rowCount); }
/// <summary> /// Implementation the specified operation. /// </summary> /// <param name="connection">The connection.</param> /// <param name="transaction">The transaction.</param> /// <returns>System.Nullable<System.Int32>.</returns> protected override int?Implementation(MySqlConnection connection, MySqlTransaction?transaction) { var bl = new MySqlBulkLoader(connection); var mappedColumns = SetupBulkCopy(bl); var lastNotification = 0; var totalCount = 0; var rowCount = 0; var output = new StringBuilder(); while (m_Source.Read()) { rowCount += 1; WriteRow(mappedColumns, output); if (rowCount == m_BatchSize) { using (var ms = CreateMemoryStream(output)) { bl.FileName = null; bl.SourceStream = ms; totalCount += bl.Load(); output.Clear(); } //We only notify after a batch has been posted to the server. if (m_NotifyAfter.HasValue && m_EventHandler != null) { var notificationCount = totalCount % m_NotifyAfter.Value; if ((totalCount % m_NotifyAfter) > notificationCount) { lastNotification = notificationCount; var e = new AbortableOperationEventArgs(totalCount); m_EventHandler?.Invoke(this, e); if (e.Abort) { throw new TaskCanceledException("Bulk insert operation aborted."); } } } rowCount = 0; } } if (rowCount > 0) //final batch { using (var ms = CreateMemoryStream(output)) { bl.FileName = null; bl.SourceStream = ms; totalCount += bl.Load(); } if (m_EventHandler != null) { var e = new AbortableOperationEventArgs(totalCount); m_EventHandler?.Invoke(this, e); //can't abort at this point; } } return(totalCount); }