Und wieder was seltsames:
Bei den Lazarus-DB-Komponenten SQLQuery über eine TMySQL50Connection (Server storage-engine= MyISAM) liefert die Eigenschaft RecordCount beharrlich den Wert 10, obwohl ich definitiv 6538 Datensätze in meiner Tabelle habe (Gemäss phpMyAdmin und auch mit "SELECT COUNT(*) ..." verifiziert).
¿Hat das jemand schon mal gehabt?
¿Ist das bekannt, dass man sich darauf nicht verlassen kann?
¿Gibt es da einen Workaround - ausser vorher Abfrage mit SELECT COUNT(*) oder mse-Komponenten verwenden?
RecordCount liefert falsche Ergebnisse
-
- Beiträge: 155
- Registriert: Mi 22. Aug 2007, 14:52
- OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
- CPU-Target: 32Bit
- Wohnort: 65719 Hofheim am Taunus
- Kontaktdaten:
-
- Lazarusforum e. V.
- Beiträge: 2809
- Registriert: Sa 9. Sep 2006, 18:05
- OS, Lazarus, FPC: Linux (L trunk FPC trunk)
- CPU-Target: 64Bit
- Wohnort: Dresden
- Kontaktdaten:
Re: RecordCount liefert falsche Ergebnisse
Das ist schon irgendwie so gewollt 
Das ganze liegt an PacketRecords, also dem bedarfsweisen Abrufen von Ausschnitten aus der kompletten Ergebnissmenge.
Es wird nur ein Ausschnitt abgerufen der die momentan zum Darstellen benötigten datensätze enthält und eben die werden auch nur gezählt. Entweder das ganze deaktivieren so das immer die komplette Ergebnismenge übertragen wird (natürlich dauert das länger und erzeugt mehr Last) oder halt nen COUNT ... vorher.
Ich würde auf die Vorzüge des sequentiellen ladens durch PacketRecords der Query nicht verzichten und lieber ein COUNT davor packen. Musst halt sehen, wie du es lieber hast, bzw. wie groß deine gesamte Ergebnismenge überhaupt ist.

Das ganze liegt an PacketRecords, also dem bedarfsweisen Abrufen von Ausschnitten aus der kompletten Ergebnissmenge.
Es wird nur ein Ausschnitt abgerufen der die momentan zum Darstellen benötigten datensätze enthält und eben die werden auch nur gezählt. Entweder das ganze deaktivieren so das immer die komplette Ergebnismenge übertragen wird (natürlich dauert das länger und erzeugt mehr Last) oder halt nen COUNT ... vorher.
Ich würde auf die Vorzüge des sequentiellen ladens durch PacketRecords der Query nicht verzichten und lieber ein COUNT davor packen. Musst halt sehen, wie du es lieber hast, bzw. wie groß deine gesamte Ergebnismenge überhaupt ist.
Johannes
-
- Beiträge: 155
- Registriert: Mi 22. Aug 2007, 14:52
- OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
- CPU-Target: 32Bit
- Wohnort: 65719 Hofheim am Taunus
- Kontaktdaten:
Re: RecordCount liefert falsche Ergebnisse
Vielen Dank, ich zähle also vorher mit Count, und lass die Packets so wie sie sind, erscheint mir logisch.
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: RecordCount liefert falsche Ergebnisse
Die würden sich hier nicht anders verhalten.KOBOLD Messring GmbH hat geschrieben:oder mse-Komponenten verwenden?

tmsesqlquery hat die Funktion "rowsreturned" welche die Information liefert, falls die Datenbank es unterstützt. Für MySQL trifft dies zu. Ich glaube Joost hat letzthin etwas ähnliches in seine Komponenten eingebaut, schau doch mal, ob du etwas entsprechendes findest.
MSEgui 2.0 hat eine neue MySQL connection Komponente für MySQL 5.0+5.1 welche Transaktionen und prepared statements unterstützt. Es ist geplant auch 6.0 hineinzupacken sobald 6.0 stabil ist.
Edit: FPC sqldb TSQLQuery hat RowsAffected welche für INSERT, UPDATE und DELETE statements die Anzahl der veränderten records liefert. Eine Funktion, die die Anzahl der durch SELECT gelieferten Datensätze meldet, habe ich nicht gefunden.
Zuletzt geändert von mse am Di 3. Feb 2009, 08:01, insgesamt 1-mal geändert.
Re: RecordCount liefert falsche Ergebnisse
Du kannst auch direkt nach dem Query.Open die Menge ermitteln
bzw. nach Query.ExecSQL mit
Code: Alles auswählen
SELECT FOUND_ROWS()
Code: Alles auswählen
SELECT ROW_COUNT()