AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Devart, DevExpress und böse VARCHAR ?
Thema durchsuchen
Ansicht
Themen-Optionen

Devart, DevExpress und böse VARCHAR ?

Ein Thema von himitsu · begonnen am 4. Apr 2023 · letzter Beitrag vom 26. Apr 2023
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

Devart, DevExpress und böse VARCHAR ?

  Alt 4. Apr 2023, 10:42
Datenbank: PostgreSQL • Version: 9-15 • Zugriff über: PgDAC
Moin Moin,

kennt jemand das/ein Problem mit zu langen unbegrenzten VARCHARs?

bzw. eine Lösung dafür (Fehlerbehebung, bzw. Prüfung mit passender Fehlermeldung) ... wir sind schon paar mal in diese Falle getappst.
[add] Ja, Cast auf TEXT ist hier eine Lösung, bzw. rausfiltern zu der langen Daten, da deren Anzeige hier eh unnötig ist,
aber es wäre schon schön, wenn so ein Fehler garnicht auftreten würde, oder er sich zumindestens verständlicher äußert.



gegeben:
  • Postgres
  • PgDAC von Devart
  • QuantumGrid von DevExpress, bzw. dessen DataController
  • und VARCHAR ohne Längenangabe (mit Inhalt von z.B. bis oder auch mal mehr als 15000 Chars)
    es geht vor allem um Rückgaben von eigenen und fremden DBFunktionen.

    Heute mal JSON-Strings in Form von Differenzdaten von geänderten Datensätzen, aber egal ... einfach alles was VARCHAR ist oder was PgDAC nicht kennt und dann als VARCHAR ansieht.

Vermutung:
Postgress kann zwar mit nahezu unbegrenzt langen VARCHARs hantieren,
aber die API raus zu und auch PgDAC bzw. TDataSet/TStringField's nutzen oft statische Buffers mit dynamischen Maximallängen.

Postgres/API etwas mehr (32kb oder 64kb ... stand, glaub ich, mal irgendwo was in der Doku)
DevArt mit 16kb (TField.DataSize), bzw. halb so viele UnicodeChars (TField.Size).

Postgres oder PgDAC gibt für VARCHARS ohne Länge eine generische Maximallänge raus, aber drinnen kann dann doch mehr sein.

Und dann kommt es vermutlich zu einem Bufferoverrun und sehr eigenartig/wechselnden Fehlern.
Entweder schreibt was einen längeren String ohne Prüfung in/über den Buffer
oder etwas versucht die Originallänge aus einem abgeschnittenen Buffer (drüber hinaus) zu lesen.
-> spätestens irgendwo im TColumn.GetValue
$2B or not $2B

Geändert von himitsu ( 4. Apr 2023 um 11:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Devart, DevExpress und böse VARCHAR ?

  Alt 24. Apr 2023, 14:59
Da ich grade mal wieder zu kam,
hier mal ein einfaches Beispiel (PostgreSQL) :
SQL-Code:
SELECT repeat('*', 1200)::VARCHAR(100) -- Size=100 DataSize=202 Length=100

SELECT repeat('*', 1200)::VARCHAR -- Size=8191 DataSize=16384

SELECT repeat('*', 12000)::VARCHAR -- Exception

SELECT repeat('*', 12000)::VARCHAR(20000) -- Size=20000 DataSize=40002 Length=12000
Wo genau der/die Fehler liegen, kann ich noch nicht sagen.
  • die Datenbank kann Längeres
  • der DBServer/Treiber sollte es richtig rausgeben (kann's aber nicht prüfen ... wobei pgAdmin aber nicht abraucht)
  • die Delphi-Komponente PgDAC hat einmal den Fehler, dass sie 8191 anzeigt (vermutlich eventuell aber dennoch den kompletten String enthält, oder Ihm fehlt die abschließende #0)
  • Ob das Delphi-TDataSet auch einen Einfluß hat ... glaube ich nicht, da die Daten-/Speicherverwaltung das DevArt in seiner Ableitung macht und es beim (20000) ja funktioniert
  • und zumindestens das Programm (in einem Testprogramm für einen anderen DevArt-Fehler lass ich es grade nochmal prüfen, falls der Kollege reagiert) raucht dann mit vielen Exceptions ab

    vermutlich weil Exception im Paint, wo der Dialog ein neues Paint mit neuer Exception auslöst, wodurch ein neues Paint mit neuer Exception ausgelöst, weswegen ein neues ..........
  • Aber ob nur der der Fehler im DataSet/Query, im Grid-DataContoler oder im Grid-Paint steckt, konnte ich nicht finden

    Weiß nur, dass es beim Query.Open knallt, bzw. wenn mit DisableControls dann eben erst im EnableControls.
$2B or not $2B

Geändert von himitsu (24. Apr 2023 um 15:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Devart, DevExpress und böse VARCHAR ?

  Alt 26. Apr 2023, 18:44
Hab nun eine Testanwendung gebaut und bissl rumprobiert.

das passiert im Programm:
SQL-Code:
-- ftWideMemo/TWideMemoField
SELECT ''::TEXT

-- ftWideString/TWideStringField Size=100 DataSize=202
SELECT ''::VARCHAR(100)

-- ftWideString/TWideStringField Size=8191 DataSize=16384 (im Prodat)
-- ABER eigentlich ist es ftWideMemo/TWideMemoField (im puren PgDAC)
SELECT ''::VARCHAR


-- Exception, bei Anzeige im Grid
SELECT repeat('*', 12000)::VARCHAR

-- ftWideString/TWideStringField Size=20000 DataSize=40002 Length=12000
SELECT repeat('*', 12000)::VARCHAR(20000)
In einer Testanwendung macht PgDAC aus VARCHAR(123) einen String, aber aus VARCHAR wird ein Memo, so wie bei TEXT.

In unserem Programm wird aber irgendwie VARCHAR mit oder ohne Länge immer zu String mit Längenangabe 8K.

Bloß wenn ich es in der Testanwendung versuche, also manuell das TWideStringField erstellen, dann meckert das Open.
Zitat:
Unterschiedliche Typen für Feld 'str'; erwartet: WideString, gefunden: WideMemo.


[add]
Hmmmmm, also in der DEMO ... im Programm weiß noch nicht.

* bei PgQuery2.Options.LongStrings=True gibt es keine Exception mehr, vonwegen "Unterschiedliche Typen für Feld"

* bei PgQuery2.Options.UnknownAsString=True auch keine Exception mehr, aber das Memo wird zum String

* Beides zusammen wie das UnknownAsString

* aber ebenfalls noch keine Exception im Grid
$2B or not $2B

Geändert von himitsu (26. Apr 2023 um 19:03 Uhr)
  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 11:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz