Delphi, qual è il metodo di accesso ai record più rapido in TcxGrid o TDataSet
Domanda
Sto usando Delphi 2007 e TcxGrid per mostrare il contenuto di una libreria di file.Il database contiene informazioni sul tipo di file, nome, percorso ed estensione.
Durante i test sto caricando 1700 record nella griglia tramite TDataSet.Faccio spazio nella griglia anche per altri 3 campi che devono ancora essere calcolati.Indicano se il file esiste, dimensione del file e data di modifica.
Il mio obiettivo è mostrare all'utente tutte le informazioni memorizzate (che funziona benissimo ed è veloce), quindi in un thread in background trovare le informazioni per gli altri tre campi di dati e quindi inserirli in TcxGrid.Questa domanda ha poco o niente a che fare con il threading che sto facendo.Funziona bene.
Il mio problema è che l'accesso ai campi della griglia già costruita presenta un enorme rallentamento quando accedo.Ho provato due modi diversi...
Grid.DataController.Values[RecordIndex,FieldIndex] - ma questa è una variante e sospetto che sia per questo che è così lento
Grid.DataController.dataset.findFirst Grid.datacontroller.dataset.findnext Grid.datacontroller.dataset.fields [fieldindex] ma usando questo metodo "cercare" è altrettanto lento come il primo metodo che ho provato.Anche la localizzazione e lo spostamento sono lenti.
Domanda lunga, in breve: qual è il modo più veloce per accedere a un record?
Soluzione 3
Il mio grosso problema era il codice di aggiornamento che doveva trovarsi all'interno di un aggiornamento di inizio/fine.
Grazie Lieven per il tuo commento poiché era la soluzione al mio problema.E grazie Gad e Daniel per le risposte da cui ho imparato.
Questo sarebbe stato più evidente a tutti se ieri avessi avuto più tempo per pubblicare del codice.
Altri suggerimenti
Indica anche se stai utilizzando TcxGridDBTableView o TcxGridTableView?
Penso che utilizzando TcxGridTableView o TcxBandedGridTableView non compatibili con il database con
View.DataController.Values[RecordIndex, FieldIndex] è il più veloce.
Anche se disponi di un'applicazione db puoi caricare la versione non db della vista durante l'inizializzazione e quindi gestire gli eventi DataController per rilevare le modifiche ai dati ed emettere i rispettivi comandi SQL per l'aggiornamento del database.
Puoi riempire la vista in questo modo:
class procedure TForm1.FillView(const View: TcxGridBandedTableView; const Sql: string);
var
Reader: TMyOrmDataReader;
i: Integer;
begin
Assert(Assigned(View), 'View is not assigned parameter.');
with View.DataController do
begin
BeginFullUpdate;
try
Reader := TMyOrm.GetDataReader(SQL);
try
i := 0;
RecordCount := 50 * 1000; // make it something big in order to avoid constant resizing by 1
while Reader.Read do
begin
// Fill the view
Values[i, 0] := Reader.GetInt32(0);
Values[i, 1] := Reader.GetString(1);
Inc(i);
end;
RecordCount := i - 1;
finally
Reader.Free;
end;
finally
EndFullUpdate;
end;
end;
end;
E quindi accedi a valori come:
View1.DataController.Values[View1.DataController.FocusedRecordIndex, View1Column1.Index].AsString
Potresti lavorare con la tabella/set di dati aggiungendo prima i dati mancanti e quindi mostrare tutti i campi come associati a dati.
So che questo è un vecchio thread, ma dirò che passare dalla griglia all'utilizzo della modalità Provider è un altro modo per migliorare la velocità di caricamento, perché essenzialmente trasforma il caricamento della griglia in un'operazione virtuale.(I record non vengono caricati finché non sono necessari per la visualizzazione o altro accesso ai dati.) Successivamente, DataController li memorizza nella cache, quindi l'accesso è molto veloce una volta caricati.