【发布时间】:2014-07-07 17:13:03
【问题描述】:
所以我正在尝试使用 ADO 的 Command 对象来实现批量插入功能。
我知道我可以使用 ADO 的 Recordset 对象来做到这一点,如下所示。
// 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);
我已经隐藏了大部分细节,但这很好用。
这种方法的唯一问题是它非常慢..
要插入 10,000 条记录,几乎需要 60 秒。
我发现 ADO 的 Command 执行命令的速度比 Recordset 对象快。
这就是我通常使用 Command 对象插入 10,000 条记录的方式:
_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 秒(而使用 Recordset 对象则需要 60 秒)..
我现在想要的是使用这个 Command 对象来实现批量插入功能..
我上面写的代码是一个一个地插入记录,而不是先添加到一个批次中,这样我们只需要执行一个批次的操作..
查看 ADO 文档,我不知道如何做到这一点.. (Documentation Link)
这甚至可能吗?有什么想法吗?
谢谢
【问题讨论】:
标签: c++ oledb ado bulkinsert