使用ADO命令对象实现批量/批量插入

时间:2014-07-07 17:13:03

标签: c++ oledb ado bulkinsert

所以我尝试使用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

这甚至可能吗?有什么想法吗?

由于

1 个答案:

答案 0 :(得分:1)

批处理代码看起来不错。您可以尝试更改批量大小以查看它是否有任何区别。

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

p1-&gt;值= 100;

另外,请设置CursorLocation,

pRecordset->CursorLocation = ADO::adUseClient;

我认为您正在使用本地数据库,尝试连接到远程数据库以查看差异。