使用ADO命令对象实现批量/批量插入
Implementing Bulk/Batch Insert using ADO Command Object
所以我试图使用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;
我认为您正在处理本地数据库,试图连接到远程数据库以查看差异。
相关文章:
- 这是插入排序的正确实现吗?
- 使用非递归插入方法实现 AVL 树
- 自己的C++列表类实现(插入函数)出现问题
- 双向链表插入方法实现 - 正在搜索哪个节点
- 内部源代码 - 在链接列表实现中插入元素上的删除会破坏整个应用程序
- 优先级队列实现为单一链接,无法更新插入的指针转换
- 在C++中实现哈希表(插入和延迟删除)
- C++链表实现多数据插入
- 如何实现自动插入隐含占位符的 easy_bind()?*带成员指针*
- AVL树插入-实现
- 何时应该完全实现插入器/提取器
- 有没有办法为符合标准的载体实现插入方法
- 实现提取和插入运算符C++
- 插入排序的实现差异
- C++:为链表实现插入函数,prev_ptr最终为NULL
- 在C++中的自定义字符串类中实现插入
- 如何根据插入对的存在来实现不同的“std::map insert()”行为
- 实现哈希表,插入函数导致"scope"错误
- 使用ADO命令对象实现批量/批量插入
- 二叉搜索树插入实现