Поэтому я пытаюсь реализовать функцию пакетной вставки, используя объект Command ADO.
Я знаю, что мог бы сделать это с помощью объекта Recordset ADO следующим образом.
// Open table
_RecordsetPtr RecSet = NULL;
RecSet.CreateInstance(__uuidof(Recordset));
RecSet->Open("MY_TABLE", MY_CONNECTION_STRING, adOpenKeyset, adLockBatchOptimistic, adCmdTable);
// Add Rows to Batch
for (int i=0; i<10000; i++) {
RectSet->AddNew(SOME_OBJECT);
}
// Execute batch
RecSet->UpdateBatch(adAffectAll);
Я скрыл большинство деталей ,, но это работает отлично.
Единственная проблема с этим подходом состоит в том, что он ОЧЕНЬ медленный.
Чтобы вставить 10000 записей, потребовалось почти 60 секунд.
Я обнаружил, что команда ADO выполняет команды намного быстрее, чем объект Recordset.
Вот как я обычно вставляю 10 000 записей, используя объект Command:
_CommandPtr CommPtr;
CommPtr.CreateInstance(__uuidof(Command));
CommPtr->CommandType = adCmdText;
CommPtr->CommandText = L"insert into aggrdb..sequence_number values (999999)";
for (int i=0; i<NUM_RECORDS; i++) {
CommPtr->Execute(NULL, NULL, adExecuteNoRecords);
}
Удивительно, но эта же операция заняла около 24 секунды выполнить (против 60 секунд с использованием объекта Recordset) ..
Теперь я хочу реализовать функциональность пакетной вставки с помощью этого объекта Command.
Код, который я написал выше, вставляет записи одну за другой, вместо того, чтобы сначала добавлять в пакет, так что нам нужно выполнить только один пакет операций.
Глядя на документацию ADO, я понятия не имею, как это можно сделать ..
(Ссылка на документацию)
Это вообще возможно? Какие-нибудь мысли?
Спасибо
Код партии выглядит нормально. Вы можете попытаться изменить размер партии, чтобы увидеть, будет ли она отличаться.
ADO::PropertyPtr p1 = pRecordset->Properties->GetItem("Batch Size");
p1-> Value = 100;
Также, пожалуйста, установите CursorLocation,
pRecordset->CursorLocation = ADO::adUseClient;
Я думаю, что вы работаете с локальной базой данных, пытаясь подключиться к удаленной базе данных, чтобы увидеть разницу.