Entwickler-Ecke
Datenbanken - Zeilenumbruch in DBMemo
Flons - Do 12.11.09 15:03
Titel: Zeilenumbruch in DBMemo
Hallo zusammen,
ich habe ein, so hoffe ich, ganz simples Prob. Leider suche ich mich schon fast zu tode.
Ich verwende Delphi 7.
Hier lese ich ein DBMemo- Feld aus.
WantReturns steh auf true(MUSS).
Nun will ich den Inhalt des Memos in eine Variable packen und danach in eine DB packen.
Mein Code:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| var S,text:String; var i:Integer; ... S:= DBMemo2.Text. for i:=0 to DBMemo2.Lines.Count-1 do begin text:= text + DBMemo2.Lines[i]; end; |
Später übergebe ich die Variable text an ein SQL- Statement (TQuery).
Quelltext
1:
| qyWeiterleitung.SQL.Text := S; |
Wo ist der verd*mmte Fehler?
Vielen Dank im Voraus.
Gruß
Flons
Refreshe ich jetzt das DBMemo- Feld, wird aus einem Zeilenumbruch 2.
Vorher stand da also z.B.
jetzt stünde da
Critter - Do 12.11.09 15:12
Hi,
Flons hat folgendes geschrieben : |
Quelltext 1: 2: 3: 4: 5: 6: 7:
| var S,text:String; var i:Integer; ... S:= DBMemo2.Text. for i:=0 to DBMemo2.Lines.Count-1 do begin text:= text + DBMemo2.Lines[i]; end; | |
wie währe es so:
Delphi-Quelltext
1: 2: 3: 4: 5:
| var S,text:String; var i:Integer; ... text:= DBMemo2.Lines.Text; end; |
Dann sollten sich auch keine Zeilenumbruch-Dopplung einschleichen.
critter
PS: Wenn du deine Quelltexte mit
[Delphi] anstelle von [code]
Klammerst, dann sehen sie noch besser aus ;).
Flons - Do 12.11.09 15:52
Vielen Dank für Deine Antwort, aber das Problem besteht weiterhin.
Mein Quelltext:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var S,text: String; var i: Integer; var beginn : tdatetime; begin for i:=0 to DBMemo2.Lines.Count-1 do begin end; text:= DBMemo2.Lines.Text;
ShowMessage(text); S:=''; S:= 'UPDATE TABELLE SET ID_XY='+ IntToStr(abc); S:= S+ ',TEXT_EREIGNIS =' +#39 +text +#39; S:= S+ ' WHERE BEDINGUNG ='; ... ShowMessage(S); |
Im ShowMessage sieht alles korrekt aus. Es wird aber immer ein zusätzlicher Umbruch in die DB geschrieben.
Die Schleife habe ich entfernt.
Critter - Do 12.11.09 19:57
Hmm,
wie Zeigst du dir die Daten in der DB denn an? Hast du die mal mit Delphi wieder ausgelesen und dargestellt? Nicht das es nur ein Überentfindliches DB-Tool ist, dass sowohl bei <cr> als auch bei <lf> einen Zeilenumbruch anzeigt.
Sorry, Fische ein wenig im trüben.
critter
Flons - Do 12.11.09 22:01
Hallo,
ich schreibe die Daten in eine Oracle XE- Datenbank.
Auslesen/schreiben/füllen tue ich das Ganze wieder in das Gleiche DBMemo-Feld, aus dem es kommt.
Also folgender Ablauf:
User XY schreibt in das Formular(und in das DBMemo-Feld).
Später kann der User in dem DBMemo-Feld einen zusätlichen Text schreiben(also Originaltext erweitern/ändern/löschen).
Zusätzlich kann der User über einen Schalter den Datensatz verändern/updaten:
Soll FeldXY Wert ABC annehmen? Dann drücke Schalter JA!
Jetzt ändere ich den Text der TQuery über einen zugewiesenen String.
Über den Schalter wird also das Formular bearbeitet und somit wird der (möglicherweise erweiterte) Inhalt des Formulares/DBMemo-Feldes wieder in die DB geschrieben(Update über TQuery).
Bei diesem Update sieht es so aus, als wenn bei jedem Zeilenumbruch(Return), den der User in das DBMemo-Feld eingegebn hat, ein weiterer Zeilenumbruch(Return) hinzugefügt wird.
Also statt
stünde dann da wie schon erwähnt:
Gruß
Flons
Bernhard Geyer - Fr 13.11.09 09:05
Stell mal dein INSERT/Update-Statement auf parametrisierte Abfrage um. Vermutlich löst sich das Problem bei Verwendung von Parametern.
So wie du es jetzt machst solltest du hoffen das der User kein "bla'; DELETE FROM TABELLE; //" eingibt um per SQL-Injection deine Tabellen zu löschen.
Flons - Fr 13.11.09 09:15
Bernhard Geyer hat folgendes geschrieben : |
Stell mal dein INSERT/Update-Statement auf parametrisierte Abfrage um. Vermutlich löst sich das Problem bei Verwendung von Parametern.
|
Meinst Du die Eigenschaft "ParamCheck" auf "True" setzen?
Das steht auf "True".
Noch einen Lösungsvorschlag?
Edit:
Ich habe, bevor das Insert/Update ausgeführt wird noch folgenden Code eingefügt:
Delphi-Quelltext
1: 2:
| text:=stringreplace(text,#13#10,#13,[rfReplaceAll]); text:=stringreplace(text,#13#10#13#10,#13,[rfReplaceAll]); |
Das Geile:
In einem ShowMessage sieht der Text richtig aus, in der DB kommt es nur mit einem doppelten Umbruch an.
Bernhard Geyer - Fr 13.11.09 09:34
Flons hat folgendes geschrieben : |
Meinst Du die Eigenschaft "ParamCheck" auf "True" setzen?
Das steht auf "True". |
Das bringt aber nix wenn du keine Parameter verwendest!
Delphi-Quelltext
1: 2: 3:
| myquery.SQL.Text := 'Update MyTable set MyFeld = :MyFeld where MyKey = :MyKey'; myquery.ParamByName('MyFeld').AsString := 'Bla'; myquery.ParamByName('MyKey').AsSring := 'BlaBla'; |
Flons - Fr 13.11.09 10:44
Ich habe das jetzt genau so gemacht.
Allerdings kommt jetzt die Fehlermeldung
| Zitat: |
qyMeineAbfrage: Typ für Feld XY ist unbekannt.
|
Man, ich dreh hier gleich durch.
Kannst Du mir das noch mal erklären, bitte?!
Bernhard Geyer - Fr 13.11.09 14:16
Bei der Params-Auflistung kannst du hier einiges einstellen. Genaueres liefert die Hilfe von Delphi.
Meine letzten BDE-Erfahrungen sind schon (glücklicherweise) 5 Jahre her.
Ich würde eh empfehlen native Zugriffskompos wie von DevArt für den Zugriff auf Oracle zu nehmen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!