Вставьте элементы Dictionary в таблицу SQL в виде строк, используя IDatareader и SqlBulkCopy.

Мне нужно значительно улучшить время выполнения процесса, который в настоящее время выглядит так:

private Dictionary<int, SingleElement> elements_buffer;

// ... Create and load values into "elements_buffer"
// (string, Datetime, double)

string query = "INSERT INTO Tests.dbo.test_table "
    + "(element_name,element_init,element_width) VALUES";

SingleElement element_aux;

for (int i = 0; i < MAX_ELEMS_IN_DICT; i++)
{
    element_aux = elements_buffer[i];

    query = query
        + "('"
        + element_aux.name
        + "','"
        + element_aux.init
        + "',"
        + element_aux.width
        + ")";

    if (i < MAX_ELEMS_IN_DICT+1) {
        query = query + ",";
    }
}

// ... Execute the query

Я собирался использовать Datatable для новой версии, но я читал об использовании SqlBulkCopy вместе с IDatareader, как упоминалось в:

Производительность SqlBulkCopy

Циклы C# и массовая вставка

Мне кажется, что это лучший выбор для моего кода, но я не могу понять, как его кодировать, хотя я хотел бы его использовать.

Могу ли я помочь с переведенным кодом, пожалуйста?

заранее спасибо


person Alberto Martín    schedule 29.09.2013    source источник
comment
Используйте параметризованные запросы. вместо объединения строк. Такого рода конкатенации открыты для атак SQL Injection.   -  person Soner Gönül    schedule 29.09.2013
comment
На самом деле он недоступен из Интернета и с безопасностью это не проблема; В любом случае, я ценю ваш комментарий, но если бы вы могли помочь мне с моим вопросом, было бы здорово.   -  person Alberto Martín    schedule 29.09.2013


Ответы (1)


Как вы уже поняли, вам необходимо реализовать собственный IDaReader. Поскольку вашим источником является Dictionary, необходимо реализовать только несколько относительно простых методов/свойств, таких как int FieldCount, bool Read(), object Get(int i).

Вы можете найти полезные примеры (простой) пользовательских реализаций IDataReader, погуглив пользовательский sqlbulkcopy idatareader.

Также имейте в виду, что SqlBulkCopy игнорирует триггеры, внешние ключи и другие ограничения и не может обрабатывать исключения.

person kasitan    schedule 29.09.2013