c++ - 使用 ADO 命令对象实现大容量/批量插入

标签 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 的 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 )

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

谢谢

最佳答案

批处理代码看起来不错。您可以尝试更改批量大小,看看是否会有任何差异。

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

p1->值=100;

另外,请设置CursorLocation,

pRecordset->CursorLocation = ADO::adUseClient;

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

关于c++ - 使用 ADO 命令对象实现大容量/批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24616128/

相关文章:

vba - 无法使用 VBA 代码从 Excel 连接到 Teradata - 无法通过网络访问 Teradata 服务器

sql-server - 将 BLOB 作为参数传递会导致错误 : Operand type clash: image is incompatible with text

delphi - Sybase 12.5-BDE-ADO "where myColumn=null"故障

c++ - 无法在 Windows 中运行 Qt 应用程序

c++ - 写入文件时,如何基于标志附加或不附加?

c++ - 如何使用 VS2012 更改解决方案中所有项目的输出目录?

c++ - 分配和比较编码风格

Java ODBC 和 Microsoft.Jet.OLEDB.4.0

sql-server - SSIS 数据流 OLE DB 到 Excel Nvarchar 大小问题

c# - OleDb 连接到 Excel;如何选择固定宽度,无限高度?