Fragen zum Abrufen und Füllen (FireDAC)
Eine Liste mit Fragen und Antworten zum Abrufen und Füllen von Datenmengen.
F1: Stellt FireDAC einen nur vorwärts ausgerichteten, schreibgeschützten Zugriff auf die Ergebnisdatenmenge bereit?
A: Legen Sie ADQuery.FetchOptions fest:
- CursorKind = ckDefault oder ckForwardOnly
- Mode = fmOnDemand
- RowsetSize = 1000
- Unidirectional = True
- Schließen Sie optional fiMeta aus Items aus, wenn Sie die Datenmenge nicht bearbeiten müssen.
F2: Wie kann ich mehrere Ergebnismengen an eine ADQuery oder eine ADMemTable anhängen?
A: Das folgende Vorgehen mit einer Client-Datenmenge zur Aufnahme mehrerer Ergebnismengen:
begin loop
// run SqlQuery with new params
...
ClientDataset.AppendData(SqlQuery.Data)
...
end loop
kann durch eine einzelne TFDQuery ersetzt werden. Zum Beispiel:
// initial open and fetch
ADQuery1.Params[0].AsInteger := 1;
ADQuery1.Open;
// reexecute command, fetch rows again and append them
// to the existing rows
ADQuery1.Command.Close;
ADQuery1.Params[0].AsInteger := 2;
ADQuery1.Command.Open;
ADQuery1.FetchAgain;
ADQuery1.FetchAll;
// reexecute again with different parameter value
ADQuery1.Command.Close;
ADQuery1.Params[0].AsInteger := 3;
ADQuery1.Command.Open;
ADQuery1.FetchAgain;
ADQuery1.FetchAll;
F3: Wie kann ich eine Abfrage ausführen und deren Ergebnisse an eine bestehende Datenmenge anhängen, ohne diese Datensätze in die Datenbank einzufügen?
A: Siehe die Beschreibung der Methode TFDDataSet.FetchAgain. Alternativ können Sie eine SQL-Anweisung ausführen, die die zusätzlichen Datensätze in eine vorhandene Datenmenge abruft:
ADCommand1.CommandText := 'select ... from ... where id= :id';
ADCommand1.Open;
ADCommand1.Fetch(ADQuery1.Table);
ADCommand1.Close;
F4: Meine Abfrage gibt 800 Datensätze zurück, aber RecordCount gibt 50 zurück. Was ist falsch?
A: Standardmäßig zeigt RecordCount die Anzahl der Datensätze im Datensatzzwischenspeicher der Datenmenge an. Weitere Informationen über die Art der Datensatzzählung finden Sie bei der Eigenschaft TFDFetchOptions.RecordCountMode.
50 ist die Standardgröße für Rowsets. Diese Anzahl an Datensätzen ruft FireDAC bei einer einzelnen Anforderung ab. Daher hat die Datenmenge direkt nach dem Öffnen <= 50 Datensätze, und diesen Wert gibt RecordCount an. Wenn Sie durch die Datenmenge navigieren, werden weitere Rowsets abgerufen, und die Anzahl der Datensätze kann zunehmen.
Führen Sie einen der folgenden Schritte aus, um die Anzahl der Datensätze, die die Abfrage zurückgibt, anzuzeigen:
- Führen Sie ADQuery1.FetchAll aus. Dabei werden alle Datensätze abgerufen, und RecordCount zeigt deren Anzahl an.
- Setzen Sie FetchOptions.RecordCountMode auf cmTotal. Dies kann allerdings zu Leistungseinbußen führen, weil FireDAC eine zusätzliche "SELECT COUNT(*)"-Abfrage für jede SELECT-Abfrage ausführt.