Der Fehler entsteht aber nicht durch das
DB-Grid, sondern durch die Menge der Daten. Da gab's schon immer 'nen Flaschenhals.
Das ganze ist aber (datenbanktechnisch) eigentlich nur Pille-Palle - ein Master-Datensatz mit 32 (verwendeten) Spalten (INT, VARCHAR, DATETIME - eine davon 2048 Zeichen groß) und dann Detail-Datensätze mit 11 Spalten (INT, VARCHAR, davon eine 2048 Zeichen lang, die anderen max. 30); meistens nur 3-4 Zeilen pro Master-Datensatz max. z.Zt. 99 Datensätze.
Bei meinen Test-Datensätzen hat die Text-Spalte in den Details eine reale max. Länge von 142 Zeichen.
Also kann doch die "Menge der Daten" nicht wirklich ein Problem sein, oder?
Das ganze operiert auf einer MS-
SQL Server Datenbank 2019 - der erwähnte
Paradox-Treiber wird als Export / "Datenaufbereiter" verwendet, um Reports (Crystal Reports) zu füttern...
Ich versuche gerade mal in einem Testprogramm per
ADO auf meine Datensätze in der MS-SQLServer Datenbank zuzugreifen...
...so ganz ist mir noch nicht klar, welche Komponenten ich in Delphi dafür verwenden soll
Für die
BDE habe ich eine TDatabase-Komponente in meinem Programm und jede Menge TQuery / TDataSet-Kombinationen auf meinen Masken - bei den o.a. Master-/Detail-Datensätzen wird auf Datenbank-Views zugegriffen und der Insert/Update/Delete über UpdateSQL-Objekte auf den eigentlichen Tabellen.
Für die
ADO-Variante habe ich das jetzt als Kombination "TADOConnection", "TADODataset" und "TADOQuery" versucht;
testweise auch mal mit den
Jedi-Komponenten TJvADOQuery, TJvADODataset
Das scheint prinzipiell zu funktionieren - zumindest die "einfache" Auslesung von Daten.
Aber wie mache ich das jetzt mit Änderungen? Wo definiere ich die
SQL-Statements für INSERT, UPDATE, DELETE?
Statt
BDE einfach mal
ADO und den
ODBC-Treiber von Windows für
Paradox probieren (für Paradoxversionen 3.x, 4.x und 5.x)?
Das muss ich auch mal ausprobieren - die
Paradox-Version spielt nicht wirklich eine Rolle; es geht nur darum, eine lokale Datenbank zu verwenden, mit der auch Crystal Reports (v9) etwas anfangen kann...
Auf die
BDE komplett verzichten zu können, wäre schon schön...
Eventuell aber auch in der TDataBase-Komponente (soweit sie genutzt wird) bei Params mal BLOBS TO CACHE=-1
angeben.
das versuche ich auch mal...
Der Fehler tritt halt auf, wenn mehr Blobfelder / Sätze mit Blobfeldern gelesen werden, als der Zahl, die bei BLOBS TO CACHE angegeben wurde, entspricht.
Das kann eigentlich nicht sein - der "BLOBS TO CACHE" steht aktuell bei mir auf 512 - soviele Sätze sind es nie...
Wie oben bereits erwähnt - wenn ich das Tail.Last() im OnOpen-Handler (oder auch im HeadAfterScroll) weglasse,
passiert der Fehler nicht.
Wenn ich es mache, kommt der Fehler früher oder später bei Schleifen über die Detail-Datensätze oder einfach beim Scrollen im Grid, das die Detail-Datensätze darstellt...
Eventuell bei der Benutzung der Komponente TQuery die Eigenschaft RequestLive auf True setzen. In der Delphi 7-Hilfe steht da einiges zu, schau mal nach, ob das eine Option sein könnte. (Bin mir nicht ganz sicher, aber der Blobcache wird dann umgangen, so dass das Problem damit eigentlich nicht (mehr) auftreten sollte.)
Ich kann mich erinnern, dass es einen Grund dafür gab, dass bei mit RequestLive auf false steht - ich weiß ihn aber nicht mehr...
* nicht die ganze Tabelle, sondern nur den/die wichtigen Datensätze (Filter / WHERE)
Sollte m.E. bei im Schnitt nur 5-6, max. 99 Detail-Datensätzen eigentlich kein Problem sein...
* aktuell "unnötige" Spalten im SELECT weglassen
mache ich bereits.
* Spalten mit gleichen/wiederholenden Daten als MasterDetail über ein/mehrere weitere Datasets angängen
das ist ebenfalls gemacht.
* auch die Blobs könnte man z.B. via MasterDetail auslagern, vielleicht auch manuell, über einen Ladeknopf
da habe ich schon versucht, im Grid nur die ersten 150 Zeichen der Text-Daten anzuzeigen und erst bei der Editierung dieser Spalte (über ein Extra TDBMemo-Edit) die gesamten Daten bereitzustellen.
Das hat nicht geholfen - der Fehler kam trotzdem.
Wenn eh kaum gescrollt wird, bzw. die Zeit für das Scrollen nicht so schlimm ist, dann jeweils nur den aktuellen Blob laden
vielleicht auch im Hintergrund den/die Blobs in Ruhe in einen Cache nachladen, anstatt sofort ALLES bei der ersten Abfrage.
Das ist eher schwierig - die "BLOB"-Spalte enthält wichtige Daten, die auch bei der reinen Ansicht der Übersicht dienen...
Teilweise können auch die
DB-Komponenten selbst Teile eigenständig nachladen.
FireDAC ist bei Delphi 7 doch noch nicht verfügbar?!