コード例 #1
0
ファイル: MySqlBulkCopy.cs プロジェクト: t9mike/vault
        public void Copy <T>(Descriptor descriptor, IDbConnection connection, IEnumerable <T> entities, IDbTransaction transaction = null, int?commandTimeout = null)
        {
            descriptor  = descriptor ?? SimpleDescriptor.Create <T>();
            transaction = transaction ?? connection.BeginTransaction();
            var reader      = new EnumerableDataReader <T>(entities);
            var total       = reader.Count;
            var batchSize   = total < BatchSize ? total : BatchSize;
            var pending     = new List <object[]>(batchSize);
            var columnCount = descriptor.Insertable.Count();
            var read        = 0;

            while (reader.Read())
            {
                read = ReadOne(columnCount, reader, pending, read);
                if (pending.Count >= batchSize)
                {
                    PrepareAndInsert(connection, transaction, descriptor, batchSize, pending);
                }
            }
            if (pending.Count > 0)
            {
                PrepareAndInsert(connection, transaction, descriptor, pending.Count, pending);
            }
            transaction.Commit();
        }
コード例 #2
0
ファイル: SqliteBulkCopy.cs プロジェクト: t9mike/vault
        public void Copy <T>(Descriptor descriptor, IDbConnection connection, IEnumerable <T> entities, IDbTransaction transaction = null, int?commandTimeout = null)
        {
            if (entities == null || !entities.Any())
            {
                return;
            }

            var settings = BeforeBulkInsert(connection, transaction, commandTimeout);

            try
            {
                descriptor = descriptor ?? SimpleDescriptor.Create <T>();
                var command = connection.CreateCommand();
                transaction = transaction ?? connection.BeginTransaction();

                SetCommandText <T>(command, entities.First());

                var properties     = descriptor.Insertable.ToArray();
                var parameterNames = properties.Select(p => p.ColumnName);
                var parameters     = parameterNames.Select(pn =>
                {
                    var parameter           = command.CreateParameter();
                    parameter.ParameterName = pn;
                    command.Parameters.Add(parameter);
                    return(parameter);
                }).ToArray();

                command.Transaction = transaction;
                command.Prepare();

                var reader = new EnumerableDataReader <T>(entities);
                while (reader.Read())
                {
                    for (var i = 0; i < parameters.Length; i++)
                    {
                        parameters[i].Value = reader.GetValue(i);
                    }
                    command.ExecuteNonQuery();
                }
                transaction.Commit();
            }
            finally
            {
                AfterBulkInsert(connection, settings);
            }
        }