Conversione di un set di dati Query in ClientDataSet in Delphi
Domanda
Uso i componenti Mydac di devart (corelab) per accedere a MySql da Delphi (2006) Molto spesso ho bisogno di lavorare con i dati in un TClientDataSet Qual è il modo migliore per convertire il set di dati di un TMyQuery in TClientDataSet Attualmente sto usando
var
MyQuery : TMyQuery;
Dsp : TDataSetProvider;
Cds : TClientDataSet;
begin
MyQuery := nil;
Dsp := nil;
Cds := nil;
try
MyQuery := TMyQuery.Create(nil);
Dsp := TDataSetProvider.Create(nil);
Cds := TClientDataSet.Create(nil);
MyQuery.Connection := TheConnection;
MyQuery.SQL.Text := CmdStr;
Dsp.DataSet := MyQuery;
Cds.SetProvider(Dsp);
Cds.Open;
////////////////////////////////////////////////////////////////////////
/// MAKE USES OF THE CDS //
////////////////////////////////////////////////////////////////////////
finally
FreeAndNil(Cds);
FreeAndNil(Dsp);
FreeAndNil(MyQuery);
end;
end;
Esiste un modo migliore per farlo?
Soluzione
Se ne hai davvero bisogno molto spesso, allora rendilo una funzione, in questo modo:
function CreateAndOpenClientDataset(AOwner: TComponent;
AConnection: TConnection; ACommand: string): TClientDataSet;
var
MyQuery: TMyQuery;
Dsp: TDataSetProvider;
begin
Result := TClientDataSet.Create(AOwner);
try
MyQuery := TMyQuery.Create(Result);
MyQuery.Connection := AConnection;
MyQuery.SQL.Text := ACommand;
Dsp := TDataSetProvider.Create(Result);
Dsp.DataSet := MyQuery;
Result.SetProvider(Dsp);
Result.Open;
except
Result.Free;
raise;
end;
end;
Questa funzione è possibile utilizzare in tutti i posti anziché TClientDataSet.Create () e, a meno che non venga sollevata un'eccezione, ti verrà dato un TClientDataSet aperto che possiede e in questo modo libera anche i due oggetti helper.
(Nota: utilizzo solo i componenti DevArt per MS Sql Server, quindi non posso eseguire il test. Il codice potrebbe contenere errori, ma l'idea generale funziona.)