![]() |
Datenbank: PostgreSQL • Version: 9-15 • Zugriff über: PgDAC
Devart, DevExpress und böse VARCHAR ?
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:
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 |
AW: Devart, DevExpress und böse VARCHAR ?
Da ich grade mal wieder zu kam,
hier mal ein einfaches Beispiel (PostgreSQL) :
SQL-Code:
Wo genau der/die Fehler liegen, kann ich noch nicht sagen.
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
|
AW: Devart, DevExpress und böse VARCHAR ?
Hab nun eine Testanwendung gebaut und bissl rumprobiert.
das passiert im Programm:
SQL-Code:
In einer Testanwendung macht PgDAC aus VARCHAR(123) einen String, aber aus VARCHAR wird ein Memo, so wie bei TEXT.
-- 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 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. :freak: Zitat:
[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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 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