所以我尝试使用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命令执行命令的速度比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)
这甚至可能吗?有什么想法吗?
由于
答案 0 :(得分:1)
批处理代码看起来不错。您可以尝试更改批量大小以查看它是否有任何区别。
ADO::PropertyPtr p1 = pRecordset->Properties->GetItem("Batch Size");
p1-&gt;值= 100;
另外,请设置CursorLocation,
pRecordset->CursorLocation = ADO::adUseClient;
我认为您正在使用本地数据库,尝试连接到远程数据库以查看差异。