2016-07-01 2 views
4

Я использую операции массива DML для ускорения ввода большого количества записей в базу данных SQL. Принцип описан here. Пример кода, как используется эта функциональность:Освободить память для операций с массивом DML

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 единиц. Затем я вызываю функцию клиента с параметром array. К сожалению, нигде в документации не описано, когда выпущена память для массива параметров. Это делается, когда я не готов к поиску запроса?

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

Или это делается, когда я закрываю запрос?

query->Close(); 

Или это делается, когда я установил размер массива в 1?

query->Params->ArraySize = 1 
+0

можете ли вы показать код, как вы пишете параметры массива? –

+0

Это не относится непосредственно к вашему q, но какой тип сервера Sql вы используете? – MartynA

+0

Я использую Firebird 2.5.4. – truthseeker

ответ

0

коллекция Параметр должна IMHO оставаться неизменной при unpreparing или закрытия запроса по конструкции, потому что это вручную заполняются коллекция (она автоматически предварительно заполненный препроцессором, когда команда назначается и ParamCreate включен исправлено при подготовке команды). Но вы можете выполнить одну и ту же команду позже, не создавая одну и ту же коллекцию.

Если вы знаете, что вы не будете снова выполнить ту же команду, вы можете вызвать метод Clear:

query->Params->Clear(); 

Если вы хотите сохранить настройки параметров, а также освободить только ресурсы, потребляемые хранения ценностей, вы можете уменьшить количество параметров строк через ArraySize собственности:

query->Params->ArraySize = 1 
Смежные вопросы