【问题标题】:Implementing Bulk/Batch Insert using ADO Command Object使用 ADO 命令对象实现批量/批量插入
【发布时间】: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


    【解决方案1】:

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

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

    p1->值 = 100;

    另外,请设置CursorLocation,

    pRecordset->CursorLocation = ADO::adUseClient;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多