Konvertieren einer Abfrage Datensatz ClientDataSet in Delphi
Frage
I Verwendung der MyDAC Komponenten durch devart (Corelab) machen den Zugriff auf MySQL aus Delphi (2006) Sehr oft muss ich mit Daten in einem TClientDataSet arbeiten Was ist der beste Weg, um die Datenmenge eines TMyQuery zu TClientDataSet konvertieren Derzeit bin ich mit
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;
Gibt es einen besseren Weg, dies zu tun?
Lösung
Wenn Sie wirklich diese sehr oft brauchen, dann machen sie eine Funktion, etwa so:
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;
Mit dieser Funktion können in allen Orten statt TClientDataSet.Create verwenden können (), und es sei denn, eine Ausnahme ausgelöst wird Ihnen eine offene TClientDataSet wird gegeben, die und auf diese Weise besitzt auch befreit die beiden Hilfsobjekte.
(Anmerkung: Ich habe nur die DevArt Komponenten für MS SQL Server verwenden, so kann ich nicht testen Der Code auch Fehler enthalten kann, aber die allgemeine Idee funktioniert.).