2016-07-01 3 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 개입니다. 그런 다음 매개 변수로 배열을 사용하여 클라이언트 함수를 호출합니다. 불행히도 매개 변수의 배열에 대한 메모리가 해제되면 문서에 아무 것도 기술되지 않습니다. 쿼리를 준비하지 않을 때 완료됩니까?

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

또는 검색어를 닫으면 완료됩니까?

query->Close(); 

또는 배열 크기를 1로 설정하면 완료됩니까? unpreparing하거나 수동으로 채워 컬렉션 (; 명령 준비에 수정 명령이 할당 될 때 자동 전처리에 의해 채워져되고 ParamCreate 사용)이기 때문에 디자인하여 쿼리를 닫을 때

query->Params->ArraySize = 1 
+0

당신이 코드를 표시 할 수 있습니다 : 당신은 ArraySize 속성을 통해 매개 변수의 수 을 줄일 수있다? –

+0

q에 직접적으로 영향을주지는 않지만 어떤 Sql Server 유형을 사용하고 있습니까? – MartynA

+0

Firebird 2.5.4를 사용 중입니다. – truthseeker

답변

0

매개 변수 컬렉션 이럴 변경되지 않은 상태로 유지해야한다. 그러나 동일한 콜렉션을 설정하지 않고 나중에 동일한 명령을 실행하고자 할 수 있습니다. ,

query->Params->Clear(); 

당신이 매개 변수 설정을 유지하려면, 값 저장에 의해 소비에만 자원을 해제 : 당신은 당신이 다시 같은 명령을 실행하지 않을 것을 알고 있다면

, 당신은 Clear 메서드를 호출 할 수 있습니다 당신이 배열 매개 변수를 작성하는 방법

query->Params->ArraySize = 1