У нас есть модель данных, которая поддерживает базы данных с одной таблицей, размещенные на нескольких серверах. Однако нам иногда нужно скомпилировать данные из нескольких таблиц для отображения на классических страницах 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, логика вылетает. Так что проблема в том, как я добавляю данные в набор записей. Любые предложения или советы очень ценятся. Большое спасибо заранее.
Я давно не кодировал соединения с базами данных ADO, но если я правильно помню, вам нужно изменить блокировку на adLockBatchOptimistic, а затем выполнить пакетное обновление. Так намного быстрее.
Если я правильно помню, это все еще было довольно медленно.
Других решений пока нет …