예제 #1
0
        private void BulkCopy(string schemaName, string tableName, TableColumnInfo[] columns,
            IDataReader reader)
        {
            try
            {

                long sizeCounter = 0, rowIndex = 0;
                var secondValues = reader.GetMatrixInstance(BatchSize);

                while (reader.Read())
                {
                    reader.GetValues(secondValues[sizeCounter]);

                    sizeCounter++;

                    if (NotifyAfter > 0 && (rowIndex % NotifyAfter == 0 && rowIndex > 0))
                    {
                        RowsCopied?.Invoke(this, new RowsCopiedEventArgs(rowIndex));
                    }

                    if (sizeCounter == BatchSize)
                    {
                        _db.BulkCopy(schemaName, tableName, columns, secondValues, BatchSize);

                        sizeCounter = 0;
                        secondValues = reader.GetMatrixInstance(BatchSize);
                    }

                    rowIndex++;
                }

                var lastValues = new object[sizeCounter][];

                for (var lastIndex = 0; lastIndex < sizeCounter; lastIndex++)
                    lastValues[lastIndex] = secondValues[lastIndex];

                _db.BulkCopy(schemaName, tableName, columns, lastValues, BatchSize);

                RowsCopied?.Invoke(this, new RowsCopiedEventArgs(rowIndex));
            }
            catch (Exception exception)
            {
                LoggerHelper.Write(LoggerOption.Error, exception.Message);

                RowsCopied?.Invoke(this, new RowsCopiedEventArgs
                {
                    Abort = true
                });
            }
        }
예제 #2
0
 internal void OnRowsCopied(long rows)
 {
     RowsCopied?.Invoke(rows);
 }