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
KlausV

Registriert seit: 29. Aug 2017
Ort: 68809 Neulußheim
88 Beiträge
 
Delphi 7 Professional
 
#1

Delphi 7 MySQL TEXT fields

  Alt 15. Dez 2024, 16:23
Delphi-Version: 5
Hallo Zusammen,
ich müsste mal wissen, wieso der RecordCount bei TEXT Feldtypen nicht funktioniert.
In einer Tabelle gibt es Felder vom Typ TEXT.
Wenn ich so ein Feld in meinem SQL verwende und RecordCount benutze, dann steht in RecordCount -1 drin.

Ich hatte zurvor for x:=1 to qry.RecordCount do stehen, habe es nun durch while not eof geändert und so funktioniert es.

Hier der Quellcode:

Code:
        UniDirectional:=True;
        DatabaseName:= 'dbMain';
        SQL.Text:= Format(SQL_Rech_Pos,[Rech_ID]);
        Open;
        First;
        x := 0;
        while not eof do
//        for x:=1 to qry.RecordCount do
         begin
         x:= x +1;
         ....
Entferne ich das Feld vom Typ TEXT aus dem SQL, dann funktioniert auch der recordCount.
Seltsam ist auch, dass überhaupt keine Fehlermeldung hochkommt.
Mache ich etwas falsch?
Danke.
Klaus
----------------------------------------------
Klaus

Geändert von KlausV (15. Dez 2024 um 16:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.221 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 07:49
Ich "rate" mal.

UniDirectional bedeutet das der Ergebnisdatensatz nur von "nach Hinten" durchsucht werden kann.
Ich vermute das hier deine verwendeten Zugriffskomponenten auch nicht den gesamten Ergebnissatz übertragen haben, so das (bei größeren Datenmengen)
der Client gar nicht weiß wie viele Datensätze vorhanden sind.
Ohne ntext-Felder ist die Ergebnismenge vermutlich so klein, das sie komplett übertragen wurde.

Lösung:
- Clientservige Curser verwenden (Achtung! Speicherbedarf)
- Programmlogik umbauen, das sie nicht auf RecordCount angewiesen ist
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
KlausV

Registriert seit: 29. Aug 2017
Ort: 68809 Neulußheim
88 Beiträge
 
Delphi 7 Professional
 
#3

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 08:40
Danke.
Ich nutze ganz normal TQUERY.
Code:
qry:=TQuery.Create(nil);
    x := 0;
    With qry do
    begin
    try
        UniDirectional:=True;
        DatabaseName:= 'dbMain';
        SQL.Text:= Format(SQL_Rech_Pos,[Rech_ID]);
        Open;
        First;
        while not eof do
//        for x:=1 to qry.RecordCount do
habe es durch "while not eof" ersetzt, aktuell funktioniert es.

Kann ich auch durch while not eof Probleme bekommen?
----------------------------------------------
Klaus
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.779 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 08:45
.. sollte die Schleife nicht von x := 0 to qry.RecordCount -1 laufen?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 08:54
Kommt drauf an, was du mit dem X machen willst.
Die RecNo zählt jedenfalls auch von 1 beginnend.

PS: Beim DataSnap gibt es mit den Streams das Gleiche.
Wenn die Daten in einem Datenblock (waren 32 oder 64 KB) übertragen werden, dann steht Stream.Size auf der realen Datenmenge,
aber bei mehr steht es ebenfalls auf -1 und man muß mit Read so lange lesen, bis Dieses 0 sagt, also bis nichts mehr kommt ... hier würde es also so lange laufen, bis EOF sagt, dass Schluß ist.

Fazit: Wenn es -1 ist dann so lange lesen, bis es endet
oder wenn das nicht -1 sein soll, dann den Modus wechsel oder schauen, ob es eine Art "FetchAll" Befehl gibt, welcher angibt, dass erstmal alle Daten geholt werden müssen, bevor es weitergeht.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Delphi 7 MySQL TEXT fields

  Alt 16. Dez 2024, 10:44
For 1 to RecordCount ist schlicht und einfach eine schlechte Idee, egal welche Datenbankkomponente genutzt wird.

Je nach Datenbank und Komponente werden die Datensätze geliefert, sobald sie zur Verfügung stehen, das heißt aber nicht, dass beim Liefern der ersten Datensätze bereits bekannt ist, wieviele Datensätze überhaupt insgesamt geliefert werden (könnten).

Willst Du vorab die exakte Datensatzzahl wissen, musst Du zuerst ein Query.Last machen. Das kann dann dauern und braucht ggfls. auf Client- und/oder Serverseite viel Speicher.

Je nach Datenbankkomponente und/oder Konfiguration kann über ein Fetchattribut bestimmt werden, wieviele Datensätze "am Stück" geholt werden sollen. Steht das z. B. auf 100, so werden nur die ersten 100 Datensätze geholt und RecordCount steht dann auf 100. Per While not EoF wird beim ersten Next hinter dem 100. Datensatz gemerkt: "Oh, da ist ja noch was!" Dann werden die nächsten 100 Sätze geholt und RecordCount "wächst" auf 200 ...
Erst wenn bei einem Next die Info von der Datenbank kommt: "Mehr hab' ich nicht!" ist EoF erreicht und die While not EoF-Schleife wird beendet. Nur so bekommst Du verlässlich alle Datensätze.

Je nach Datenbank und/oder Clientkonfiguration kann es auch sein, dass für die Übermittlung der Daten eine bestimmte Menge Speicher reserviert wird. Ist der voll, wird die Datenübertragung (vorerst) beendet, bis per Next der erste Datensatz "hinter" der bereits gelieferten Datenmenge angefordert wird. Dann kommt der nächste "Schub" Datensätze und RecordCount "wächst" auf die nun gelieferte Gesamtmenge an Datensätzen.

Wenn Du bisher mit For x := 1 to RecordCount immer alle Datensätze bekommen hast, hast Du eher Glück gehabt. Eine sichere Verarbeitung aller Datensätze hast Du so aber sicherlich nicht programmiert.

Alle Datensätze bekommst Du nur mit While not EoF oder Repeat until EoF.

Das von himitsu genannte FetchAll entspricht sinngemäß einem:
Delphi-Quellcode:
qry.Open;
qry.Last;
qry.First;
Dann hast Du alle Datensätze und RecordCount dürfte damit auf der tatsächlich zu erwartenden Anzahl von Datensätzen stehen.

Und wenn Du in X unbedingt wissen muss, um welchen Datensatz es sich handelt, dann nimm einfach x := qry.RecNo, damit hast Du bereits einen Datensatzzähler und musst ihn nicht extra nochmal per for x := 1 to WasWeißIchWieviel, auf eher unzuverlässige Weise, nachbilden.
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:36 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