释放内存以进行阵列DML操作

时间:2016-07-01 07:36:17

标签: delphi firebird c++builder firebird2.5 firedac

我正在使用数组DML操作来加速将大量记录插入SQL数据库。该原则被描述为here。示例代码如何使用此功能:

TFDQuery *FDQuery1;
...
FDQuery1->SQL->Text = "insert into MyTab values (:p1, :p2, :p3)";
// here FDQuery1->Params collection is filled by 3 parameters
const int array_size = 100;
FDQuery1->Params->ArraySize = array_size;
FDQuery->Prepared = true;
for(int i = 0; i < array_size; i++)
{
  FDQuery1->Params[0]->AsIntegers[i] = i;
  FDQuery1->Params[1]->AsStrings[i] = "qwe";
  FDQuery1->Params[2]->Clear(i);
}
FDQuery1->Execute(array_size);

本质上它意味着不是为插入的每一行调用数据库引擎客户端函数,而是首先准备我需要作为数组插入的数据。阵列的典型大小为1000个项目。然后我用数组作为参数调用客户端函数。遗憾的是,在释放参数数组的内存时,无法描述文档。当我没有准备好查询时它会完成吗?

TFDQuery *query;
...
query->Prepared = false;

或者当我关闭查询时它是否已完成?

query->Close();

或者在我将数组大小设置为1时完成了吗?

query->Params->ArraySize = 1

1 个答案:

答案 0 :(得分:0)

参数集合应该在设备未准备或关闭时保持不变,因为它是一个手动填充的集合(当命令被分配并且ParamCreate启用时,它由预处理器自动预填充;在命令准备时更正)。但您可能希望稍后执行相同的命令而不设置相同的集合。

如果您知道不会再次执行相同的命令,可以调用Clear方法:

query->Params->Clear();

如果要保留参数设置,并且仅释放值存储所消耗的资源,则可以通过ArraySize属性减少参数的数量:

query->Params->ArraySize = 1