Zaniżona wartość RecordCount - dlaczego ?

0

Witam.

Mam małą aplikację korzystającą z bazy MsAccess.
Pobieram dane z tabeli paragony i chce coś tam z nimi zrobić.
Potrzebuje znać ilość pobranych rekordów do ProgressBar.

Próbowałem napisać coś:

procedure TMojaKlasa.ACCESS_OPEN(zapytanie: string);
begin
 	FPOMOC.AccessQuery.Close;
 	FPOMOC.AccessQuery.SQL.Text:=zapytanie;
 	TRY
    		IF FPOMOC.AccessQuery.SQL.Text<>''  THEN FPOMOC.AccessQuery.Open;
 	EXCEPT
      		ON e: Exception DO LOG(' BŁĄD PRODEDURY MSSQL_OPEN: ' +zapytanie+'   '+E.Message);
 	END;
end;   

/.../
begin
     TPom.ACCESS_OPEN('SELECT * FROM DokFin WHERE DataSprzedazy = #'+Calendar1.Date+'#');

     FMain.Label2.Caption:='RecordCount: '+IntToStr(FPomoc.AccessQuery.RecordCount);

     FMain.ListBox1.Clear;
     WHILE NOT FPomoc.AccessQuery.EOF DO
     begin
            FMain.ListBox1.Items.Add(TPom.Access_String('nr'));
            FPomoc.AccessQuery.Next;
     end;

     FMain.Label3.Caption:='ListBox1.Items.Count: '+IntToStr(FMain.ListBox1.Items.Count);
end; 

Taki efekt uzyskałem :
okno.jpg

No i teraz pytanie dlaczego RecordCount = 10 ?
Znalazłem na forum informację że w takich przypadkach należy użyć metody FetchAll, jednak użyty w tym przypadku TSQLQuery (podłączony do TODBCConnection) nie ma takiej metody...

I tak na marginesie :
Lepiej używać tej metody czy sprawdzić sobie ilość rekordów SELECT count(*) FROM nazwa_tabeli ?

0

Więcej pytań nie mam ...
Dziękuję :)

0

Zapomnij o RecordCount, to naprawdę nie jest do niczego potrzebne i bywa szkodliwe.
Chcesz zrobić FetchAll (a jak jej nie ma wystarczy że zrobisz DataSet.Last -> będziesz miał to samo co przy FetchAll) - pobierzesz wszystko z serwera i dostaniesz właściwy RecordCount.
Ale - pobierzesz wszystko z serwera, w przypadku kiedy danych będzie dużo, zapchasz pamięć po pachy.
Select count(*) też nie jest rozwiązaniem, to operacja kosztowna dla bazy danych i dla dużych zbiorów - będzie trwała długo.
Jak widzisz - nie ma jednej dobrej metody.
A postęp wykonania możesz zrobić na wiele sposobów...

I jeszcze jedno;
za taki kod:

TPom.ACCESS_OPEN('SELECT * FROM DokFin WHERE DataSprzedazy = #'+Calendar1.Date+'#');

Powinno się dostawać po łapach.
Użyj parametrów, czyli tak:

AccessQuery.SQL.Text := 'SELECT * FROM DokFin WHERE DataSprzedazy = :DataSprzedazy';
AccessQuery.ParamByname('DataSprzedazy').Value := Calendar1.Date;
AccessQuery.Open;

Dlaczego?
Bo jest lepiej (masz kontrolę nad parametrami, możesz je odczytać, iterować, itd.), szybciej (zobacz w helpie co robi metoda Prepare Twojego DataSetu) i bezpieczniej (kod jest odporny na SQLInjection - tak po prostu przy okazji).

1 użytkowników online, w tym zalogowanych: 0, gości: 1