Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TMemo Komponente, Zeilen in Firbird DB schreiben (https://www.delphipraxis.net/101600-tmemo-komponente-zeilen-firbird-db-schreiben.html)

Eppos 16. Okt 2007 09:19

Datenbank: Firbird • Version: 1.5 • Zugriff über: BDE

TMemo Komponente, Zeilen in Firbird DB schreiben
 
Hallo zusammen,

ich habe folgendes Problem.
Ich benutze die TMemo Komponente um ein Blob-Feld aus der Datenbank anzuzeigen. Das funktioniert auch.
Wenn ich nun meinen Update-Befehl absätze bekomme ich einen Fehler. Conversion Error from String "Blob".

Mein Update Befehl.

Delphi-Quellcode:
QuMem.Sql.Text := 'Update Tabelle1 set Mem = ("' + MeMemo.Lines.Text + '"); ';
Weiss jemand wo der Fehler ist?

Vielen Dank.

Eppos

RavenIV 16. Okt 2007 09:35

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Zeig doch mal, wie Du das TMemo aus der Datenbank füllst.
Und gib und mehr Infos zur DB.

Eppos 16. Okt 2007 09:38

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Datenbank: Firbird
Version: 1.5
Verbindung: BDE
Tabelle: Tabelle1
Feld: Mem (Blob Memo)
Delphi-Quellcode:
MeMemo.Lines.Text := QuMem.FieldByName( 'Mem' ).AsString;

alex517 16. Okt 2007 09:47

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Hi Eppos,

Firebird interpretiert Angaben in doppelten Anführungsstrichen als Feld- bzw. Tabellen-Namen.
Den Inhalt eines Strings mußt du in einfache Anführungsstrichen setzen.
Um solche Probleme zu vermeiden, gilt auch für Datums- und Zeitangaben, sollte man immer mit
Parametern arbeiten.

Delphi-Quellcode:
QuMem.Sql.Text := 'Update Tabelle1 set Mem = :Mem';
QuMem.ParamByName('Mem').AsString := MeMemo.Lines.Text;
Durch die Verwendung von .AsString, .AsDateTime usw. bei der Parameterzuweisung hat man
auch keine Probleme mit den Parametertypen.

alex

RavenIV 16. Okt 2007 09:51

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Oder man verwendet QuotedStr:
Delphi-Quellcode:
QuMem.Sql.Text := 'Update Tabelle1 set Mem = ' + QuotedStr(MeMemo.Lines.Text);
Das QuotedStr setzt die Anführungszeichen " oder ' so wie sie benütigt werden.

Schöner ist allerdings die Variante mit den Parametern.

Eppos 16. Okt 2007 09:58

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Ich werde beide Varianten heute Abend mal ausprobieren.

Vielen Dank im Vorraus!

Eppos

Eppos 16. Okt 2007 11:05

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Bei der ersten Möglichkeit kommt diese Fehlermeldung:
Allgemeiner SQL-Fehler feature is not supported BLOB and array dataq types are not supported for move operation

Bei der zweiten Möglichkeit diese:
Conversion Error from String.

RavenIV 16. Okt 2007 11:10

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Zeig mal den Code, damit wir sehen, was Du gemacht hast.

Eppos 16. Okt 2007 11:33

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Delphi-Quellcode:
// erste
QuData.Sql.Text := 'Update Data set Data = ' + QuotedStr(MeMem.Text);
QuData.Execsql;
QuData.Free;

// zweite
QuData.Sql.Text := 'Update Data set Data = :Data';
QuData.ParamByName('Data').AsString := MeData.Text;
QuData.Execsql;
QuData.Free;

RavenIV 16. Okt 2007 11:44

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Zitat:

Zitat von Delphi 7 Hilfe
Text (Eigenschaft von TStrings)
Mit der Eigenschaft Text lassen sich alle Strings eines TStrings-Objekts als ein ganzer String ansprechen, dessen Elemente durch das Code-Paar für Wagenrücklauf (Carriage Return, CR) und Zeilenvorschub (Line Feed, LF) voneinander getrennt sind.

Bei einem Lesezugriff auf die Eigenschaft Text werden Strings zurückgegeben, die durch Wagenrücklauf- und (in Windows) Zeilenvorschubzeichen getrennt sind

Da sich die Property Text des TMemo auf TStrings bezieht, kommt der Fehler vermutlich von den CR/LF.

Nebenbei erwähnt:
Es ist eh keine gute Idee, in einer Datenbank BLOBs zu verwenden.
Jedes DBMS bietet Text-Felder in variabler Grösse an.

mkinzler 16. Okt 2007 11:58

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Zitat:

Nebenbei erwähnt:
Es ist eh keine gute Idee, in einer Datenbank BLOBs zu verwenden.
Jedes DBMS bietet Text-Felder in variabler Grösse an.
Warum nicht?

Eppos 16. Okt 2007 12:02

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Das kann ja aber nicht die Lösung sein, andere Felder zu verwenden und die Datenbank umzuschreiben.

Firbird selber weisst aber auf solche Felder hin, für Memos sollte man den Typ Blob Typ 1 benutzen.

Hat jemand noch Vorschläge

alex517 16. Okt 2007 12:03

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
@RavenIV:
In Firebird sind Textfelder variabler Größe als Blob mit SubTyp 1 definiert.
Es ist als absolut korrekt.
alex

Eppos 16. Okt 2007 12:05

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
genau so sehe ich das auch.

Nein, paramby halt leider auch nicht geklappt.

alex517 16. Okt 2007 13:11

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Die Variante mit .ParamByName('..').AsString funktioniert bei mir
ohne Probleme, allerdings verwende ich nicht die BDE sondern FibPlus.

Zitat:

Zitat von Eppos
Delphi-Quellcode:
QuData.Sql.Text := 'Update Data set Data = :Data';
QuData.ParamByName('Data').AsString := MeData.Text;
QuData.Execsql;
QuData.Free;

Ist es korrekt, die Tabelle und das Feld haben "Data" als Namen?
alex

RavenIV 16. Okt 2007 13:13

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Zitat:

Zitat von alex517
Die Variante mit .ParamByName('..').AsString funktioniert bei mir
ohne Probleme, allerdings verwende ich nicht die BDE sondern FibPlus.

Zitat:

Zitat von Eppos
Delphi-Quellcode:
QuData.Sql.Text := 'Update Data set Data = :Data';
QuData.ParamByName('Data').AsString := MeData.Text;
QuData.Execsql;
QuData.Free;

Ist es korrekt, die Tabelle und das Feld haben "Data" als Namen?
alex

So langsam sollte jeder begriffen haben, dass die BDE abgelöst werden muss.
Sie wird auch nicht mehr von neuen Delphi-Versionen unterstützt. Gott-sei-Dank.

Die Datenstruktur war (hoofentlich) nur ein ungeschickt gewähltes Besipiel...

Eppos 16. Okt 2007 13:17

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
@alex
Ja die Tabelle heisst data und das Feld auch data
Bei mir funktioniert es leider nicht

@raven
ich muss momentan noch die bde verwenden, da ich die software nicht umstellen darf.
Ich programmiere auch noch mit D5

RavenIV 16. Okt 2007 13:17

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Zitat:

Zitat von Eppos
Hallo zusammen,

Vielen Dank.

Eppos

Du hast Post (PN).

Hansa 16. Okt 2007 13:28

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Zitat:

Zitat von RavenIV
...So langsam sollte jeder begriffen haben, dass die BDE abgelöst werden muss.
Sie wird auch nicht mehr von neuen Delphi-Versionen unterstützt. Gott-sei-Dank.

Ja, hätte wenn und aber. :mrgreen: Seltsamerweise ist bei Turbodelphi quasi nur die BDE mit dabei. Nicht mal IBX. :stupid:

alex517 16. Okt 2007 13:51

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Versuchs mal mit
Delphi-Quellcode:
TQuery.ParamByName('..').AsBlob := ....
alex

Eppos 16. Okt 2007 14:11

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
ich habe die funktion asblob nicht?!

alex517 16. Okt 2007 14:38

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Zitat:

Zitat von Eppos
ich habe die funktion asblob nicht?!

Kann nicht sein, Query1.ParamByName('').AsBlob := .. gibts mindestens seit Delphi 3.
Habe gerade nachgesehen.

alex

alex517 16. Okt 2007 15:59

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Habs gerade mit D3 ein ausprobiert, geht:

Delphi-Quellcode:
Query2.SQL.Text := 'update Person set BEMERKUNGEN = :BEMERKUNGEN where ID=:ID';
Query2.ParamByName('ID').AsInteger := Query1ID.AsInteger;
Query2.ParamByName('BEMERKUNGEN').AsBlob := Memo1.Lines.Text;
Query2.ExecSQL;
BEMERKUNGEN ist ein Blobfeld.

alex

Eppos 16. Okt 2007 18:26

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Vielen Dank es hat funktioniert. Die Funktion AsBlob habe ich gefunden.

Vielen Dank an alle beteiligten die mich unterstützt haben...

Gruß,

Eppos

Eppos 16. Okt 2007 19:11

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
also es funktioniert noch nicht ganz.
Folgendes Problem habe ich noch.
Wenn ich den Text speichere und es kommen mehrere leerzeichen nacheinandere vor, oder mal ein Tabulator dann bringt er diese Fehlermeldung:

Allgemeiner SQL-Fehler Cannot transliterate character between character sets.

Hat das was mit der größe des Feldew zu tun?

mkinzler 16. Okt 2007 19:13

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Nein, aber die Charset-Einstellungen des Feldes weicht von dem der Verbindung ab.

Eppos 16. Okt 2007 19:20

Re: TMemo Komponente, Zeilen in Firbird DB schreiben
 
Es war gar kein charset hinterlegt bei dem Feld "Data", habe nun win1252 verwendet


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:11 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