asp classic — Самый быстрый способ добавить несколько записей в набор записей ADO с помощью переполнения стека

У нас есть модель данных, которая поддерживает базы данных с одной таблицей, размещенные на нескольких серверах. Однако нам иногда нужно скомпилировать данные из нескольких таблиц для отображения на классических страницах ASP. Это делается в объекте COM в C ++. Мы собираем данные с SQL Server с помощью OleDb, а логика OleDb записывает данные прямо в структуры C ++. Затем мы перебираем массивы struct, добавляя данные в SafeArrays, а затем добавляем их в набор записей. Логика добавления данных в набор записей выглядит примерно так (логика инициализации и обработки ошибок опущена):

SAFEARRAY* fields; // Initialised to integer array 0 -> max fields
SAFEARRAY* values;
VARIANT* arraydata;

... //  initialisation logic

SafeArrayAccessData(values, reinterpret_cast<void**>(&arrayData));

for(unsigned int i = 0; i < numDataValues1; ++i)
{
// Add data
arraydata[0].intVal = data[i].someValue;
... // etc.

for(unsigned int j = 0; j < numDataValues2; ++j)
{
arraydata[21].intVal = data2[j].someValue;
... // etc.

_recordset->raw_AddNew(fields, values);
_recordset->Update();
}
}

Однако это относительно медленно. Чтобы добавить 1000 строк данных, может потребоваться секунда, что слишком долго в нашей среде. Если я закомментирую вызовы raw_AddNew и Update, логика вылетает. Так что проблема в том, как я добавляю данные в набор записей. Любые предложения или советы очень ценятся. Большое спасибо заранее.

1

Решение

Я давно не кодировал соединения с базами данных ADO, но если я правильно помню, вам нужно изменить блокировку на adLockBatchOptimistic, а затем выполнить пакетное обновление. Так намного быстрее.

Это может помочь вам

Если я правильно помню, это все еще было довольно медленно.

1

Другие решения

Других решений пока нет …