2016-07-01 25 views
4

Ich verwende Array-DML-Operationen, um das Einfügen einer großen Anzahl von Datensätzen in die SQL-Datenbank zu beschleunigen. Das Prinzip ist beschrieben here. Beispielcode, wie diese Funktionalität verwendet wird:Freigabe Speicher für Array-DML-Operationen

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); 

Im Wesentlichen bedeutet dies, dass anstelle Datenbank-Engine-Client-Funktion für jede Zeile eingefügt aufzurufen, I ersten Daten vorzubereiten I als Array einfügen müssen. Typische Größe des Arrays ist 1000 Elemente. Dann rufe ich Client-Funktion mit Array als Parameter auf. Leider wird nirgendwo in der Dokumentation beschrieben, wann der Speicher für das Array von Parametern freigegeben ist. Ist es fertig, wenn ich die Abfrage nicht abfrage?

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

Oder ist es fertig, wenn ich die Abfrage schließe?

query->Close(); 

Oder ist es getan, wenn ich Array-Größe auf 1?

query->Params->ArraySize = 1 
+0

können Sie den Code zeigen, wie Sie die Array-Parameter schreiben? –

+0

Es trägt nicht direkt auf Ihrem q, aber welche Sql Server Typ verwenden Sie? – MartynA

+0

Ich benutze Firebird 2.5.4. – truthseeker

Antwort

0

Parameter Sammlung sollte IMHO unverändert bleiben, wenn unpreparing oder die Abfrage nach Design schließen, weil es ein von Hand bestücken Collection (er automatisch vom Vorprozessor vorbefüllt wird, wenn der Befehl zugeordnet ist, und ParamCreate aktiviert; AT-Befehlsvorbereitungs korrigiert). Vielleicht möchten Sie später denselben Befehl ausführen, ohne dieselbe Sammlung einzurichten.

Wenn Sie wissen, dass Sie nicht den gleichen Befehl erneut ausführen, können Sie die Clear Methode aufrufen:

query->Params->Clear(); 

Wenn Sie Parametereinstellungen zu erhalten, und lassen Sie nur durch den Wertspeicher verbraucht Ressourcen, Sie können Reihen durch die ArraySize Eigenschaft Anzahl der Parameter reduzieren:

query->Params->ArraySize = 1