2017-02-06 3 views
1

델파이 10 시애틀 TFDQueryTFDMemTable으로 복제하고 TFDMemTable의 변경 사항을 데이터베이스에 유지하려고합니다.TFDQuery에서 복제 된 TFDMemTable에 대한 변경 사항을 데이터베이스로 다시 보낼 수 있습니까?

memtable 변경 사항은 쿼리에 표시되지만 DB로 끝까지 이동하지는 않습니다. 쿼리의 값을 직접 수정하면 데이터베이스에 저장됩니다.

+0

의 ApplyUpdates는 작업을해야한다 :

는, BTW 다음은 코드의 작은 변화가 내 테스트 베드에 적응하는 것입니다. 시도 할 때 코드를 공유 할 수 있습니까? –

+0

필자는 먼저 MemTable과 Query 둘 다 호출해야한다고 생각합니다. 첫 번째 호출은 레코드를 변경되지 않은 것으로 표시하고 두 번째 호출은 업데이트 할 레코드가 없었습니다. – LachlanG

답변

1

흥미로운 q. MergeDataSet을 사용하여 공백을 그렸습니다.

그러나 나는 너무 많은 식사를하려고하지 않는지 궁금해했습니다.

procedure TForm1.btnCopyToMemTableClick(Sender: TObject); 
begin 
    FDMemTable1.CloneCursor(FDQuery1); 
end; 

procedure TForm1.btnSaveBackClick(Sender: TObject); 
var 
    Errors : Integer; 
begin 
    Errors := FDQuery1.ApplyUpdates; 
    FDQuery1.Close; 
    // need to close FDMemTable1 before re-opening FDQuery1, otherwise the 
    // call to FDQuery1 provokes a complaint about a duplicated column. 
    FDMemTable1.Close; 

    FDQuery1.Open; 
    FDMemTable1.CloneCursor(FDQuery1); 
end; 
: 오히려 놀랍게도, 다음 작품은 나를 위해 찾아, 그리고 FDMemTable에서 변경이 데이터베이스에 다시 유지됩니다 (는 MS의 저자 테이블을 사용하여 MS SQL 서버 2014 데이터베이스, 델파이 시애틀 술집)

query이 닫히기 전에 코드에 query.ApplyUpdates(0)이없고, 코드에 표시된 오류를 피하기 위해 query을 다시 열려고 시도하기 전에 memtable.close을 호출 한 것으로 보입니다.

이 경우 KISS가 적용되는 것으로 보이지만 MergeDataSet을 사용하여 동일한 결과를 얻을 수있는 방법이 있는지 알고 싶습니다. TFDQuery에

var 
    query : TFDQuery; 
    memtable : TFDMemTable; 
begin 
    // Using the MS pubs demo database 
    query := FDQuery1; 
    query.SQL.Text := 'select * from authors'; 
    query.CachedUpdates := True; 
    query.Open; 

    { clone query into memtable } 
    memtable := FDMemTable1; 
    memtable.CloneCursor(query); 

    { go to the same record in query and memtable } 
    memtable.First; 
    query.First; 
    Assert(memtable.Fields[0].Value = query.Fields[0].Value); 

    { edit the record in the memtable from ABC to XYZ } 
    //Assert(memtable[''] = 'ABC'); 
    memtable.Edit; 
    memtable['Phone'] := '666'; 
    memtable.Post; 

    { verify record also changed in query } 
    Assert(query['Phone'] = '666'); 

    // Added 
    query.ApplyUpdates(0); 
    { has the change gone through to the database? } 
    query.Close; 

    // Added 
    // need to close memtable before re-opening query, otherwise the 
    // call to query provokes a complaint about a duplicated column. 
    memtable.Close; 

    query.Open; 
    query.First; 
    Assert(query['Phone'] = '666'); // assertion succeeds 
+0

감사합니다. 내가 잘못하고있는 것은 MemTable에서 ApplyUpdates를 호출하기 전에 Query에서 호출하기 전이라고 생각합니다. 이는 새 레코드를 변경되지 않은 것으로 표시하므로 Query ApplyUpdates 호출은 레코드를 업데이트해야한다고 생각하지 않습니다. – LachlanG

+0

@LachlanG : 좋습니다. 그럴듯한 것 같습니다 ... – MartynA