DBGrid-Darstellung von "TEXT und "VARCHAR"

Für Fragen von Einsteigern und Programmieranfängern...
Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von Aliobaba »

Hallo,

Wenn ich unter SQLite eine Datenbank generiere und eine Spalte, in der ich einen Text eingeben möchte, dann gibt es ja mehrere Möglichkeiten, unter anderem als "TEXT" oder als "VARCHAR", wobei die Unterschiede zunächst einmal recht klein sind, soweit ich das bisher recherchieren konnte - zumal sich SQLite ja nicht so sehr um das vorgegebene Format "kümmert".

What is the maximum size of a VARCHAR in SQLite?
SQLite does not enforce the length of a VARCHAR. You can declare a VARCHAR(10) and SQLite will be happy to let you put 500 characters in it. And it will keep all 500 characters intact - it never truncates.
<<<<<
SQLite lets me insert a string into a database column of type integer!
This is a feature, not a bug. SQLite uses dynamic typing. It does not enforce data type constraints. Any data can be inserted into any column. You can put arbitrary length strings into integer columns, floating point numbers in boolean columns, or dates in character columns. The datatype you assign to a column in the CREATE TABLE command does not restrict what data can be put into that column. Every column is able to hold an arbitrary length string. (There is one exception: Columns of type INTEGER PRIMARY KEY may only hold a 64-bit signed integer. An error will result if you try to put anything other than an integer into an INTEGER PRIMARY KEY column.)
But SQLite does use the declared type of a column as a hint that you prefer values in that format. So, for example, if a column is of type INTEGER and you try to insert a string into that column, SQLite will attempt to convert the string into an integer. If it can, it inserts the integer instead. If not, it inserts the string. This feature is called type affinity.

Bei der Darstellung einer Texteingabe (Zeos) macht es aber einen großen Unterschied, ob die Spalte als "TEXT" oder als "VARCHAR" vordefiniert ist:
In der Ausgabe der Daten durch DBGrid erscheint in einem Fall (VARCHAR) der korrekte Text, im anderen Fall (TEXT), wenn die Spalte als Text vordefiniert ist, erscheint in der Ausgabe: "(MEMO)"???

1. Warum und
2. Wie kann ich es erreichen, dass das DBGrid auch "TEXT-Spalten" als lesbaren text darstellt.

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von MmVisual »

Varchar ist in der Regel nur ein einzeiliger Text
Memo ist eben ein Memo, mehrzeilig, bis zu 64KB groß.

Um den Textinhalt dar stellen zu können muss in der Feldeigenschaft ein Event OnGetText belegt werden, der das Memo-Feld in einen Text wandelt. Dabei sollte der Text auch auch z.B. 200 Zeichen beschnitten werden, denn zu viel ist in der Tabelle auch unnötig.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von Aliobaba »

Guten Morgen, MmVisual :-)

vielleicht war meine Beschreibung mißverständlich:

Ich habe kein Memo-Feld.
In den Feldern des DBGrids erscheint an Stelle des erwarteten Textes der Eintrag: "(MEMO)".
Das DBGrid-Feld kann offenbar den von der Datenbank "gelieferten" Text nicht richtig (?) interpretieren, wenn die entsprechende SQLite Spalte als "TEXT" vordefiniert wird. Wenn dieselbe Spalte als "VARCHAR" vordefiniert wird, erscheint im DBGrid - ohne dass am Code innerhalb Lazarus etwas geändert wurde - der "richtige" Text.

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von MmVisual »

Doch die Definition des Feldes als Text ergibt den Feldtyp ftMemo. Die Felddefinition Varchar gibt den Feldtyp ftString.
Und das Grid wird einfach bei ftMemo nicht den Text zeigen sondern ein (memo) wenn leer oder ein (MEMO) wenn was drin steht.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von Aliobaba »

Danke, MmVisual!!
(...aber wo findet ein Anfänger derartige Informationen? Es ist ehrlich nicht so, dass ich mich nicht bemüht hätte, alleine drauf zu kommen!)
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von MmVisual »

im Forum...
EleLa - Elektronik Lagerverwaltung - www.elela.de

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von Christian »

Die Information die du gesucht hast (TEXT ist für texte gedacht, (VAR)CHAR für Strings) ist eine SQL92+ Information. Da hättest du dir die Standart definitionen durchlesen müssen. Steht sicher auch in vielen Tutorials. So definiert ist das leider nicht bei generellen Technologien.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von Aliobaba »

Trotzdem: Es ist deshalb nicht von vorneherein klar, dass das DBGrid (VAR)CHAR darstellt, TEXT aber nicht.
Danke für die Hilfe.

Aliobaba

(Ein Anfängerforum ist doch deshalb ein Anfängerforum, weil man da auch einfachere Fragen stellen kann. ... ich war wirklich nicht zu faul zum Suchen, aber so manches findet man als Anfänger eben nicht - und manches versteht man auch nicht) :?
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von Christian »

Da hast du recht. Pfleg doch einfach einen hinweis in der hilfe nach damit der nächste nicht drüberstolpert.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von Patito »

Um zur ursprünglichen Frage zurückzukehren:

1. Warum

Text ist im SQL üblicherweise ein Datentyp ohne Länge - daher behandeln ihn Komponenten machmal als potentiell riesigen Blob
und trauen sich z.B. nicht das Ding anzuzeigen.

Text hat zwar den Vorteil, dass man keine Länge angeben muss, aber irgendwie scheint die Art wie man mit Text umgeht eher uneinheitlich zu sein - Bei Microsoft ist Text deprecated
http://msdn.microsoft.com/en-us/library/ms187993.aspx

Ich würde daher wenn möglich lieber Varchar einsetzen.

2. Wie kann ich es erreichen, dass das DBGrid auch "TEXT-Spalten" als lesbaren text darstellt.

a) Im SQL-Select das Feld als Varchar Casten
SELECT (Feld AS Varchar... ) FROM xyz
oder
b) Felddefinition in der Datenbank umstellen.


P.S: der MS-Access Datentyp Memo entspricht dem SQL-Typ Text. Intern in Zeos heisst das daher vermutlich ftMemo.

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von MmVisual »

2.c) In der Felddefinition der TQuery im Feld das Event "OnGetText" gelegen und selbst die Wandlung vornehmen, das ist dann in Grid sichtbar.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von Aliobaba »

Vielen Dank für die hilfreichen Antworten zu meiner "ursprünglichen" Frage. Dies hat mir nun sehr geholfen!

@ Christian: "Pfleg doch einfach einen hinweis in der hilfe nach damit der nächste nicht drüberstolpert."
Gerne fasse ich dieses Problem nochmal für ähnlich blutige Anfänger wie mich zusammen. Was meinst Du unter "in der Hilfe"?
Das?:
viewforum.php?f=21
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von Christian »

Nein die hilfpe zum dbgrid siehe fpdoc editor
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von ErnstVolker »

Hallo,

ich experimentiere gerade mit Postgresql und habe letztendlich das gleiche Problem.

Ich habe eine VIEW die aus einem CONCAT besteht. Das Ergebnis wird in PGAdmin als vom Datentyp "text" angezeigt. Nachdem ich den Beitrag hier gefunden habe, habe ich in Postgres die VIEW geändert und ein CAST zu "Varchar" durchgeführt. Das Ergebnis ist in PGAdmin auch varchar, nur im Lazarus-DB-Grid wird nach wie vor "Memo" angezeigt.

Jetzt habe ich im Objektinspektor nachgesehen wo das "OnGetText"-Event zu finden ist. Aber ich finde es nicht und was müsste in das Event hinein, damit das DB-Grid den String anzeigt?

Vielen Dank und viele Grüße

Volker

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: DBGrid-Darstellung von "TEXT und "VARCHAR"

Beitrag von af0815 »

Auf der Eben des Datasets hast du die Möglichkeit auf die Darstellung der Felder einzugehen. Dort kann man sich in den Event hineinhägen und bestimmen wie das Ergebnis weitergereicht wird. Das umgekehrte Event gibt es auch. Bin Gerade nicht am Rechner, muss erst nachsehen, welches Event das genau ist.

Nimm die Query und definier die Felder im OI. Dann schau bei den Events der Felder nach, dann sollte der richtige Event einem schon ins Auge springen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten