コード例 #1
0
ファイル: SqlServerBulkCopy.cs プロジェクト: t9mike/vault
        public virtual void Copy <T>(Descriptor descriptor, IDbConnection connection, IEnumerable <T> entities, IDbTransaction transaction = null, int?commandTimeout = null)
        {
            descriptor = descriptor ?? SimpleDescriptor.Create <T>();
            var reader  = new EnumerableDataReader <T>(entities);
            var timeout = commandTimeout.HasValue ? commandTimeout.Value : 0;
            var mapping = GenerateBulkCopyMapping(descriptor, reader, connection, timeout);

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

            try
            {
                using (var bcp = new SqlBulkCopy((SqlConnection)connection, SqlBulkCopyOptions.TableLock, (SqlTransaction)transaction))
                {
                    foreach (var column in mapping.DatabaseTableColumns)
                    {
                        bcp.ColumnMappings.Add(new SqlBulkCopyColumnMapping(column, column));
                    }
                    bcp.BatchSize            = reader.Count;
                    bcp.DestinationTableName = !string.IsNullOrWhiteSpace(descriptor.Schema) ? string.Format("[{0}].[{1}]", descriptor.Schema, mapping.DataReaderTable.TableName) : string.Format("[dbo].[{0}]", mapping.DataReaderTable.TableName);
                    bcp.BulkCopyTimeout      = timeout;
                    bcp.WriteToServer(reader);
                }
            }
            finally
            {
                AfterBulkInsert(connection, transaction, timeout, settings);
            }
        }
コード例 #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);
            }
        }