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

Implementing Bulk/Batch Insert using ADO Command Object

本文关键字:插入 实现 ADO 命令 对象 使用      更新时间:2023-10-16

所以我试图使用ADO的命令对象实现批量插入功能。

我知道我可以这样做,使用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);

我隐藏了大部分的细节,但这工作得很好。

这种方法的唯一问题是它非常慢

要插入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秒相比).

我现在想要的是实现批量插入功能使用这个命令对象..

我上面写的代码一个接一个地插入记录,而不是首先将记录添加到一个批处理中,这样我们只需要执行单个批操作…

看ADO文档,,我不知道这是如何做到的。(文档链接)

这可能吗?任何想法吗?

谢谢

批处理代码看起来没问题。您可以尝试更改批处理大小,看看是否会有任何不同。

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

p1->Value = 100;

同时,请设置光标位置

pRecordset->CursorLocation = ADO::adUseClient;

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