【问题标题】:Fastest way to add multiple records to ADO recordset using C++使用 C++ 向 ADO 记录集添加多条记录的最快方法
【发布时间】:2012-11-24 02:30:07
【问题描述】:

我们的数据模型支持托管在多台服务器上的单表数据库。然而,我们偶尔需要编译来自多个表的数据以显示在经典的 ASP 页面上。这是在 C++ 中的 COM 对象中完成的。我们使用 OleDb 从 SQL Server 收集数据,OleDb 逻辑将数据直接写入 C++ 结构。然后我们循环遍历结构数组,将数据添加到 SafeArrays,然后将它们添加到记录集中。将数据添加到记录集的逻辑大致如下(省略初始化和错误处理逻辑):

SAFEARRAY* fields; // Initialised to integer array 0 -> max fields
SAFEARRAY* values;
VARIANT* arraydata;

... //  initialisation logic

SafeArrayAccessData(values, reinterpret_cast<void**>(&arrayData));

for(unsigned int i = 0; i < numDataValues1; ++i)
{
    // Add data
    arraydata[0].intVal = data[i].someValue;
    ... // etc.

    for(unsigned int j = 0; j < numDataValues2; ++j)
    {
        arraydata[21].intVal = data2[j].someValue;
        ... // etc.

        _recordset->raw_AddNew(fields, values);
        _recordset->Update();
    }
}

但是速度相对较慢。添加 1000 行数据可能需要一秒钟,这在我们的环境中太长了。如果我注释掉对 raw_AddNew 和 Update 的调用,逻辑就会飞起来。所以问题在于我如何将数据添加到记录集中。任何建议或意见都非常感谢。非常感谢。

【问题讨论】:

  • 如果它真的变慢了,它可能正在做大量的磁盘写入。您可以在内存中填充记录集,然后在 for 循环之外调用更新函数以一次性将整个内容写入磁盘吗?或者更新方法是否必要?
  • 刚试过没有更新调用,一切仍然按预期工作。它也快了大约 10 毫秒。但是,它仍然需要将近一秒钟的时间才能运行,这仍然太慢了。
  • 数组中已经有了计算值。 addnew 调用可能会在将数据添加到记录集数据结构之前进行大量的歌舞,然后将其馈送到最终的消费单元。我想知道您是否可以自己创建一个可以馈送到消费单元的数据结构。或者去掉一些中间商的计算。
  • 我也想过这个 - 创建我们自己的数据容器,针对这类事情进行了优化。顺便感谢您的帮助,非常感谢。

标签: c++ asp-classic oledb ado


【解决方案1】:

我已经很久没有编写 ADO 数据库连接的代码了,但是如果我没记错的话,您需要将锁定更改为 adLockBatchOptimistic,然后进行批量更新。这样会快很多。

This might help you

如果我没记错的话,它仍然很慢。

【讨论】:

  • 干杯,我会试试这个。目前我们使用 _recordset->Open(vtMissing, vtMissing, adOpenStatic, adLockOptimistic, -1); 打开记录集。需要注意的是,没有数据库连接,记录集完全用 C++ 逻辑构建。 IE。我们只是将它作为数据容器返回给 ASP 逻辑。
  • 试过这个,最快迭代的速度差不多。我根本没有调用 Update/UpdateBatch。然而,按照我之前的逻辑,每第 3 次或第 4 次运行都会“停止”,需要将近 2 秒才能运行。使用批处理模式消除了这一点。十分感谢。不过仍然需要它更快....???
  • 抱歉,如果我没记错的话,您无法加快速度。除非有人在某个地方修好了东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多