Exemplo n.º 1
0
    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));
        }
    }
}
Exemplo n.º 2
0
        /// <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&lt;System.Nullable&lt;System.Int32&gt;&gt;.</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);
        }
Exemplo n.º 3
0
    /// <summary>
    /// Implementation the specified operation.
    /// </summary>
    /// <param name="connection">The connection.</param>
    /// <param name="transaction">The transaction.</param>
    /// <returns>System.Nullable&lt;System.Int32&gt;.</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);
    }