Действительно ли возможно отладить CSS?

Если вы используете неуправляемый клиент Oracle (Oracle.DataAccess), то самый быстрый способ - использовать OracleBulkCopy, как было указано Тариком.

Если вы используете последнюю версию управляемого клиента Oracle (Oracle.ManagedDataAccess), то самый быстрый способ - использовать привязку массива, как указывал Дэмиен. Если вы хотите сохранить код своего приложения в чистоте от особенностей привязки массива, вы можете написать собственную реализацию OracleBulkCopy, используя привязку массива.

Вот пример использования из реального проекта:

var bulkWriter = new OracleDbBulkWriter();
    bulkWriter.Write(
        connection,
        "BULK_WRITE_TEST",
        Enumerable.Range(1, 10000).Select(v => new TestData { Id = v, StringValue=v.ToString() }).ToList());

10K записей вставляются за 500 мс!

Вот реализация:

public class OracleDbBulkWriter : IDbBulkWriter
{
    public void Write<T>(IDbConnection connection, string targetTableName, IList<T> data, IList<ColumnToPropertyMapping> mappings = null)
    {
        if (connection == null)
        {
            throw new ArgumentNullException(nameof(connection));
        }
        if (string.IsNullOrEmpty(targetTableName))
        {
            throw new ArgumentNullException(nameof(targetTableName));
        }
        if (data == null)
        {
            throw new ArgumentNullException(nameof(data));
        }
        if (mappings == null)
        {
            mappings = GetGenericMappings<T>();
        }

        mappings = GetUniqueMappings<T>(mappings);
        Dictionary<string, Array> parameterValues = InitializeParameterValues<T>(mappings, data.Count);
        FillParameterValues(parameterValues, data);

        using (var command = CreateCommand(connection, targetTableName, mappings, parameterValues))
        {
            command.ExecuteNonQuery();
        }
    }

    private static IDbCommand CreateCommand(IDbConnection connection, string targetTableName, IList<ColumnToPropertyMapping> mappings, Dictionary<string, Array> parameterValues)
    {
        var command = (OracleCommandWrapper)connection.CreateCommand();
        command.ArrayBindCount = parameterValues.First().Value.Length;

        foreach(var mapping in mappings)
        {
            var parameter = command.CreateParameter();
            parameter.ParameterName = mapping.Column;
            parameter.Value = parameterValues[mapping.Property];

            command.Parameters.Add(parameter);
        }

        command.CommandText = $@"insert into {targetTableName} ({string.Join(",", mappings.Select(m => m.Column))}) values ({string.Join(",", mappings.Select(m => $":{m.Column}")) })";
        return command;
    }

    private IList<ColumnToPropertyMapping> GetGenericMappings<T>()
    {
        var accessor = TypeAccessor.Create(typeof(T));

        var mappings = accessor.GetMembers()
            .Select(m => new ColumnToPropertyMapping(m.Name, m.Name))
            .ToList();

        return mappings;
    }

    private static IList<ColumnToPropertyMapping> GetUniqueMappings<T>(IList<ColumnToPropertyMapping> mappings)
    {
        var accessor = TypeAccessor.Create(typeof(T));
        var members = new HashSet<string>(accessor.GetMembers().Select(m => m.Name));

        mappings = mappings
                        .Where(m => m != null && members.Contains(m.Property))
                        .GroupBy(m => m.Column)
                        .Select(g => g.First())
                        .ToList();
        return mappings;
    }

    private static Dictionary<string, Array> InitializeParameterValues<T>(IList<ColumnToPropertyMapping> mappings, int numberOfRows)
    {
        var values = new Dictionary<string, Array>(mappings.Count);
        var accessor = TypeAccessor.Create(typeof(T));
        var members = accessor.GetMembers().ToDictionary(m => m.Name);

        foreach(var mapping in mappings)
        {
            var member = members[mapping.Property];

            values[mapping.Property] = Array.CreateInstance(member.Type, numberOfRows);
        }

        return values;
    }

    private static void FillParameterValues<T>(Dictionary<string, Array> parameterValues, IList<T> data)
    {
        var accessor = TypeAccessor.Create(typeof(T));
        for (var rowNumber = 0; rowNumber < data.Count; rowNumber++)
        {
            var row = data[rowNumber];
            foreach (var pair in parameterValues)
            {
                Array parameterValue = pair.Value;
                var propertyValue = accessor[row, pair.Key];
                parameterValue.SetValue(propertyValue, rowNumber);
            }
        }
    }
}

ПРИМЕЧАНИЕ: эта реализация использует пакет Fastmember для оптимизированного доступа к свойствам (намного быстрее, чем отражение)

6
задан c69 30 September 2011 в 17:56
поделиться

8 ответов

В браузере:

  • Firefox есть подключаемый модуль под названием Firebug. Он прост в установке и очень мощный. Это даже лучше в сочетании с «Веб-разработчиком» для Firefox.

  • Internet Explorer имеет панель инструментов разработчика, которая не так хороша, как Firebug, но достаточно хороша, чтобы проверить, что все еще работает в IE. Кроме того, есть инструмент IE DOM Inspector. Существует также версия Firebug для IE под названием Firebug Lite.

  • Google Chrome поставляется со встроенными инструментами, аналогичными Firebug. См. Параметр «инструменты-> разработчик» в раскрывающемся меню справа от адресной строки. Это позволяет вам видеть правила CSS, используемые каждым элементом. Он также поддерживает отладку Javascript.

  • Safari использует инструмент под названием Web Inspector.

  • Opera имеет встроенную утилиту Dragonfly.

15
ответ дан 8 December 2019 в 02:14
поделиться

Вы используете Firebug в Firefox, что значительно упрощает отладку.

15
ответ дан 8 December 2019 в 02:14
поделиться

И встроенный DragonFly в Opera.

5
ответ дан 8 December 2019 в 02:14
поделиться

Если вы не используете Firefox, теперь вы можете получить Firebug Lite , который можно использовать в IE и т. Д.

3
ответ дан 8 December 2019 в 02:14
поделиться

Вы можете использовать плагин Firebug для Firefox. Это очень полезно для CSS. Вы можете динамически включать и выключать стили и поля из стилей. Это здорово.

3
ответ дан 8 December 2019 в 02:14
поделиться

Инструменты веб-разработчика, такие как Safari's Web Inspector или Firebug для Firefox , могут помочь вам отладить ваш CSS. Эти инструменты могут показать вам каскад правил, применяемый к определенному элементу, и позволить вам изменить или отключить определенные свойства.

2
ответ дан 8 December 2019 в 02:14
поделиться

Когда вам нужно отладить проблемы, характерные для IE. Я слышал, как люди говорили инспектор IE DOM не так уж и плохо. Вы также можете попробовать инструменты, описанные в этой публикации .

0
ответ дан 8 December 2019 в 02:14
поделиться

Сначала используйте Firefox для разработки и тестирования CSS, а затем переключитесь на другие браузеры для тестирования кода. Это общепринятый метод ИМХО. Firebug великолепен, но он работает еще лучше, если объединить его с плагином Web Developer для FF.

Есть отличный сайт , который стоит проверить, с большим количеством информации о разработке CSS и HTML.

0
ответ дан 8 December 2019 в 02:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: