Реализация массовой / пакетной вставки с использованием объекта команды ADO

Поэтому я пытаюсь реализовать функцию пакетной вставки, используя объект 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, я понятия не имею, как это можно сделать ..
(Ссылка на документацию)

Это вообще возможно? Какие-нибудь мысли?

Спасибо

1

Решение

Код партии выглядит нормально. Вы можете попытаться изменить размер партии, чтобы увидеть, будет ли она отличаться.

ADO::PropertyPtr p1 = pRecordset->Properties->GetItem("Batch Size");

p1-> Value = 100;

Также, пожалуйста, установите CursorLocation,

pRecordset->CursorLocation = ADO::adUseClient;

Я думаю, что вы работаете с локальной базой данных, пытаясь подключиться к удаленной базе данных, чтобы увидеть разницу.

1

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


По вопросам рекламы [email protected]