AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi 7 MySQL TEXT fields

Ein Thema von KlausV · begonnen am 15. Dez 2024 · letzter Beitrag vom 16. Dez 2024
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.373 Beiträge
 
Delphi 12 Athens
 
#1

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 10:50
Wobei ja eigentlich die Datenbank weiß, wieviele Datensätze es gibt .... prinzipiell hätte es also möglich sein sollen, dass RecordCount auch mit Fetchin/Windowing immer den richtigen Wert liefert.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#2

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 11:25
Nein, nicht unbedingt. Manche Datenbanken fangen bereits an Daten zu liefern, wenn sie noch nicht wissen, wie groß die Datenmenge insgesamt sein wird, sie nur wissen, dass sich an der Reihenfolge ... der zu liefernden Daten nichts mehr ändert.

Hab' es zumindest früher per Toad gegen Oracle-Datenbanken sehen können, dass Programme bei sehr großen Datenmengen bereits mit der Verarbeitung und Ausgabe der Ergebnisse begonnen hatten, während die Datenbank noch mit der Verarbeitung und Lieferung weiterer Daten beschäftigt war.

Sprich: Man konnte beobachten, dass Datenbank und Programm fast gleichzeitig mit der Verarbeitung fertig wurden. Es waren allerdings Prozesse, bei denen die Verarbeitung schon mal in den Bereich von vielen Stunden bis über einen Tag hinaus reichen konnte.

Und bei 'nem Fetch 100 bekommt die Datenbank ja explizit gesagt: Liefere mir bitte die ersten 100 Sätze. Sie schaut dann erst garnicht, ob es mehr geben könnte. Erst wenn der 101. Satz angefordert wird, schaut sie nach den nächsten 100 und weiß damit erst dann, wenn es weniger als 100 weitere Sätze gibt, dass EoF erreicht ist und welcher Wert für RecordCount definitiv zu vergeben ist. In dieser Konstellation sagt RecordCount immer nur aus, wieviele Sätze bereits geliefert wurden, aber nicht, wieviele Sätze insgesamt geliefert werden könnten.
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.241 Beiträge
 
Delphi 12 Athens
 
#3

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 11:51
RecordCount wird clientseitig ausgewertet, indem tatsächlich alle Datensätze abgerufen und gezählt werden. Abgesehen davon, dass das langsam ist, kann sich im Laufe der Bearbeitung die Anzahl der Datensätze ändern (Mehrbenutzer!). Entweder kapselt man das in Transaktionen (read repeatability) oder man iteriert nur über den Cursor. UniDirectional heißt, dass man nur vorwärts lesen kann, aber nicht zurück + das auch nur, wenn der Cursor am Server ist und die Daten nicht am Client.

Wie auch immer: Der Datentyp eines Feldes beeinflusst RecordCount nicht. Da hat es etwas anderes. Der zitierte Code unterschlägt ein WITH irgendwo + wie das SQL wirklich aussieht wär auch gut zu wissen.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#4

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 12:16
RecordCount wird clientseitig ausgewertet, indem tatsächlich alle Datensätze abgerufen und gezählt werden.
Das stimmt leider nicht immer. Wenn ich in Delphi 7 mit den Zeoskomponenten und 'ner FireBird-Datenbank arbeite und dabei Fetch 100 gesetzt habe, so kann ich sehen, dass sich im Laufe der Verarbeitung RecordCount ändert. Bei der Nutzung der ADO-Komponenten scheint aber RecordCount sofort auf der tatsächlichen Anzahl von Datensätzen zu stehen.

Früher, mit BDE und DBase, sorgte ein x := qry.RecordCount dafür, dass alle Datensätze gelesen wurden und damit dann die Anzahl der Datensätze bekannt wurde. Aber die Daten wurden erst beim Lesen von RecordCount "geholt", was an der entstehenden Laufzeit bei der Zuweisung von RecordCount auf x zu bemerken war. Diese Laufzeit trat jedoch nicht "so geballt" auf, wenn man per While not EoF die Daten in 'ner Schleife verarbeitete. Aber man wusste dann erst beim Erreichen von EoF wieviele Datensätze verarbeitet wurden.

Und da hier ja Delphi 7 und TQuery (= BDE) genutzt werden, könnte dieser Effekt (und ähnliche (mySQL-bedingete?) Absonderlichkeiten) noch zum Tragen kommen.
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.241 Beiträge
 
Delphi 12 Athens
 
#5

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 12:19
Da hast du schon recht, aber:

Zitat:
Ich nutze ganz normal TQUERY.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#6

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 12:32
Ja, aber bei TQuery verlasse ich mich nicht auf RecordCount, weil es eben nicht bei allen Datenbanken sofort auf dem tatsächlichen Wert der zu verarbeitenden Datensätze steht.

Bei DBase wurde beim Lesen von RecordCount das Lesen der gesamten Datenmenge veranlasst. Aber dies erfolgte nicht grundsätzlich für alle beliebigen Datenbanken, sondern nur bei DBase reproduzierbar.

Und im aktuellen Fall scheint es ja nicht so zu sein, sonst müsste die For-Schleife ja korrekt funktionieren, weil ja spätestens bei for x := 1 to qry.RecordCount das holen aller Datensätze engestoßen werden müsste und damit hier ReordCount nicht mehr 1 sein dürfte.

Interessant wäre zu erfahren, ob ein derartiges Konstrukt zu einem geänderten Verhalten führt:
Delphi-Quellcode:
AlleSaetze := qry.RecordCount;
for x := 1 to AlleSaetze do begin
...
end;
Enthält hier dann AlleSaetze die tatsächliche Anzahl an Datensätzen oder auch nur 1?
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.118 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 12:53
Wobei ja eigentlich die Datenbank weiß, wieviele Datensätze es gibt ....
MySQL weiß nicht, wie viele Datensätze es gibt. Das weiß es noch nicht mal bei einer ungefilterten Tabelle.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#8

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 13:10
Heißt das, dass ich bei einem select * from tabelle per for x := 1 to qry.RecordCount niemals die tatsächliche, datenbankseitige, Anzahl von Datensätzen bekomme, sondern immer nur die Anzahl der Sätze, die gerade beim Client angekommen ist und dieser dann lokal auswerten kann?

Das würde doch dann bedeuten, dass das im Eingangspost gezeigte Konstrukt der For-Schleife (gegen eine MySQL-Datenbank) noch nie (bzw. nur zufällig) korrekt gearbeitet haben kann?!?
  Mit Zitat antworten Zitat
AuronTLG

Registriert seit: 2. Mai 2018
Ort: Marburg
323 Beiträge
 
Delphi 12 Athens
 
#9

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 13:20
Heißt das, dass ich bei einem select * from tabelle per for x := 1 to qry.RecordCount niemals die tatsächliche, datenbankseitige, Anzahl von Datensätzen bekomme, sondern immer nur die Anzahl der Sätze, die gerade beim Client angekommen ist und dieser dann lokal auswerten kann?

Das würde doch dann bedeuten, dass das im Eingangspost gezeigte Konstrukt der For-Schleife (gegen eine MySQL-Datenbank) noch nie (bzw. nur zufällig) korrekt gearbeitet haben kann?!?
Es kommt letztendlich auf die Query-Komponente bzw deren Einstellungen an.
Ich hatte in einem alten Programm mal das Problem, dass das RecordCount genau so lange wunderbar funktioniert hat, wie die tatsächliche Anzahl der Datensätze kleiner oder gleich 50 war, denn in diesem Fall war 50 meine Page-Größe.
Ob das in deinem Fall auch so war, hängt von den Einstellungen der Query ab, die hier schon ausgiebig diskutiert wurden.

Ich habe aus diesem und anderen Gründen der Verwendung von RecordCount schon vor geraumer Zeit abgeschworen, da man zu viele Dinge beachten muss und es dementsprechend eine riesige Fehlerquelle darstellt.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#10

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 13:30
Ich habe aus diesem und anderen Gründen der Verwendung von RecordCount schon vor geraumer Zeit abgeschworen, da man zu viele Dinge beachten muss und es dementsprechend eine riesige Fehlerquelle darstellt.
Deshalb schrieb ich ja weiter oben schon:
Zitat:
For 1 to RecordCount ist schlicht und einfach eine schlechte Idee, egal welche Datenbankkomponente genutzt wird.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz