public static DbCommand CreateBulkQueryCommand(
            DbConnection connection,
            string sqlStatement,
            IEnumerable parameters,
            bool paramsAsList,
            SourceAdapterBuilderDelegate sourceAdapterBuilder,
            TargetAdapterBuilderDelegate adapterBuilder)
        {
            ColumnMetadataList metadata = null;

            // ReSharper disable once LoopCanBeConvertedToQuery
            foreach (var param in parameters)
            {
                metadata = new ColumnMetadataList {
                    new ColumnMetadata
                    {
                        ColumnName = "P",
                        DataType   = param.GetType()
                    }
                };
                break;
            }
            if (metadata == null)
            {
                throw new InvalidOperationException("parameters enumerable is empty");
            }

            return(CreateBulkQueryCommand(connection, sqlStatement, metadata, parameters, paramsAsList, sourceAdapterBuilder, adapterBuilder));
        }
        public static DbCommand CreateBulkQueryCommand(
            DbConnection connection,
            string sqlStatement,
            ColumnMetadataList metadata,
            IEnumerable parameters,
            bool paramsAsList,
            SourceAdapterBuilderDelegate sourceAdapterBuilder,
            TargetAdapterBuilderDelegate adapterBuilder)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }
            if (connection == null)
            {
                throw new ArgumentNullException(nameof(connection));
            }
            if (metadata == null)
            {
                throw new ArgumentNullException(nameof(metadata));
            }
            if (sourceAdapterBuilder == null)
            {
                throw new ArgumentNullException(nameof(sourceAdapterBuilder));
            }
            if (adapterBuilder == null)
            {
                throw new ArgumentNullException(nameof(adapterBuilder));
            }

            var sourceAdapter = sourceAdapterBuilder(parameters, metadata);
            var adapter       = adapterBuilder(sqlStatement, metadata, connection, paramsAsList);

            adapter.Prepare(sourceAdapter);
            try
            {
                foreach (var row in sourceAdapter.RowsEnumerable)
                {
                    adapter.Process(row);
                }
                adapter.BindParameters();
                return(adapter.TakeCommand());
            }
            finally
            {
                adapter.UnPrepare();
            }
        }