Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TRichEdit per Parameter in DB schreiben (https://www.delphipraxis.net/98079-trichedit-per-parameter-db-schreiben.html)

Andreas H. 21. Aug 2007 06:33

Datenbank: mySQL • Version: 5 • Zugriff über: ZEOS

TRichEdit per Parameter in DB schreiben
 
Hallo,

ich benutze folgenden Code, um ein TRichEdit in eine DB zu schreiben. Die Funktion wird ohne Fehler durchlaufen, in der Datenbank bleibt das Feld Memo aber auf nil.


Delphi-Quellcode:
//...
  const
    SQLNewMsgSend = 'insert into MsgSend values(default,now(),:User,'#39'inactive'#39',:User,:User,default,:Name,:Memo,:Reciep);';
// ...


function TCommon.SendMsg(Subject: string; Memo: TObject; SenderID,ReciepID: Integer;
  AttachedList: TIntegerList):boolean;
var
  i:integer;
  LastIndex:integer;
  Stream: TMemoryStream;
begin
  result:=false;
  Stream:=TMemoryStream.Create;
  try
    with QryMessage do
    begin
      // in "Gesendet" eintragen
      SQL.Text:=SQLNewMsgSend;
      Params.ParamByName('User').Value:=SenderID;
      Params.ParamByName('Reciep').Value:=ReciepID;
      Params.ParamByName('Name').Value:=Subject;
      if TRichEdit(Memo).lines.Count>0 then
        begin
          Stream.Clear;
          TRichEdit(Memo).Lines.SaveToStream(Stream);
          Stream.Position := 0;
          Params.ParamByName('Memo').LoadFromStream(Stream,ftFmtMemo);
        end;
      ExecSQL;
//...
Das Datenbankfeld Memo ist vom Typ Text und ist in anderen Forms der Anwendung an TDBRichEdit gebunden und das funktioniert wunderbar. Auch das Übertragen von RichEdit-Inhalten über Streams funktioniert wie gewünscht.
Nur mit der Übergabe an einen SQL-Parameter gehts bei mir nicht.

Wer hat ne Idee?

Gruß Andreas

Andreas H. 22. Aug 2007 15:29

Re: TRichEdit per Parameter in DB schreiben
 
Hallo,

kann mir denn wirklich keiner helfen?

Gruß Andreas

marabu 22. Aug 2007 18:31

Re: TRichEdit per Parameter in DB schreiben
 
Hallo Andreas,

das erste, was mir an deinem parametrisierten SQL-String auffällt, ist das mehrfache Vorkommen von :USER. Da durch ParamByName() nur das erste Vorkommen gefunden werden dürfte, sollte das Statement gar nicht ausführbar sein. Um den Fehler auszuschließen könntest du die Parameter User1, User2, User3 einführen.

#39 ist sehr platzsparend, aber QuotedStr('inactive') finde ich irgendwie selbstdokumentierend - du nicht auch?

Grüße vom marabu

Andreas H. 22. Aug 2007 20:00

Re: TRichEdit per Parameter in DB schreiben
 
Hallo,

das mit den QuotedStr ist ne gute Sache, klappt aber leider in einer Konstantendefinition nicht!

Der Parameter User soll mehrfach gespeichert werden (Ersteller, Besitzer, Absender...). Das funktioniert wie erwartet.

Nur mit den Memos (RichText) wills nicht klappen.

Gruß Andreas

marabu 22. Aug 2007 21:22

Re: TRichEdit per Parameter in DB schreiben
 
Hallo,

Zitat:

Zitat von Andreas H.
das mit den QuotedStr ist ne gute Sache, klappt aber leider in einer Konstantendefinition nicht!

Recht hast du, aber du hast schon so viele Parameter im Statement, da würde ich auch diesen String noch als Parameter übergeben - sieht einfach besser aus.

Zitat:

Zitat von Andreas H.
Der Parameter User soll mehrfach gespeichert werden (Ersteller, Besitzer, Absender...). Das funktioniert wie erwartet.

Wirklich? Ich kann es kaum glauben:

Delphi-Quellcode:
function TParams.FindParam(const Value: string): TParam;
var
  I: Integer;
begin
  for I := 0 to Count - 1 do
  begin
    Result := TParam(inherited Items[I]);
    if AnsiCompareText(Result.Name, Value) = 0 then Exit;
  end;
  Result := nil;
end;
Aber wenn du es sagst, dann wird es stimmen.

Zitat:

Zitat von Andreas H.
Nur mit den Memos (RichText) wills nicht klappen.

ftFmtMemo ist ein Typ, der wohl nur von der BDE unterstützt wird. Versuche es mal mit einem Typ, den auch ZEOS kennt (ftBlob, ftMemo).

Gute Nacht

Andreas H. 23. Aug 2007 07:43

Re: TRichEdit per Parameter in DB schreiben
 
Hallo,

mit ftMemo geht!!! :bouncing4: :bounce2: :bounce1:

Warum kam da denn keine Fehlermeldung?


Übrigens, gibt es sowas wie ne Anleitung zu den ZEOS? Hab im Netz nichts gefunden (oder einfach nur falsch gesucht? :gruebel: )

Ich verstehe Deine Skepsis wegen der mehrfachen User nicht. Ich möchte ja nicht für jeden :user einen Anderen Werte eintragen sondern mehrfach den Wert, den ich in ...('User').value eingetragen habe.
Hintergrund: Ich speichere den Erzeuger, den Besitzer, den letzten Bearbeiter eines Datensatzes. Die Kennung des Users landet in :User. In diesem Fall wird ein neuer Datensatz angelegt, :User ist alse Erzeuger, Besitzer und letzter Bearbeiter.
Wie gesagt, funktioniert wie erwartet.

Das Stück Programm ist die Parameter-Suchroutine der ZEOS-Komponente, oder?

Gruß Andreas

mkinzler 23. Aug 2007 09:09

Re: TRichEdit per Parameter in DB schreiben
 
http://www.dsdt.info/tutorials/zeoslib/
http://zeos.firmos.at/

Andreas H. 23. Aug 2007 13:23

Re: TRichEdit per Parameter in DB schreiben
 
Hallo,

danke für die Quellenangaben. Beide sind mir schon bekannt.
Leider scheint es kein Handbuch oder so zu geben. Ich hätte gerne was zum Ausdrucken fürs stille Örtchen :wink: Na ja, egal.

Trotzdem nochmal vielen Dank an alle. Ihr habt mir echt weitergeholfen, wie immer.
Vielleicht bin ich ja auch mal soweit, dass ich helfen kann. Bislang reicht meine Erfahrung nicht aus oder ich bin beim Antworten zu langsam. :cry:
So, das musste mal gesagt werden :hi: :hi:


Gruß Andreas

marabu 23. Aug 2007 19:05

Re: TRichEdit per Parameter in DB schreiben
 
Hallo Andreas,

Zitat:

Zitat von Andreas H.
... Ich verstehe Deine Skepsis wegen der mehrfachen User nicht. Ich möchte ja nicht für jeden :user einen Anderen Werte eintragen sondern mehrfach den Wert, den ich in ...('User').value eingetragen habe.

das ist leicht erklärt: BDE oder ADO (evtl. beide) sind bisher dadurch aufgefallen, dass sie beim Analysieren eines SQL-Statements mit mehreren gleichnamigen Parametern diese auch mehrfach erzeugen. Der von mir gezeigte Code-Ausschnitt aus der Unit DB wird von allen Zugriffskomponenten verwendet und findet beim Zugriff über den Parameternamen nur den ersten Eintrag - wie du beim Betrachten des Codes sicher erkennen kannst. Offensichtlich arbeitet ZEOS an dieser Stelle intelligenter und erzeugt nur einen Parameter. Wenn du das erste mal in diese Falle tappst, dann wirst du dich hoffentlich an meine nicht unbegründete Skepsis erinnern und dir sofort selbst helfen können.

Freundliche Grüße

Andreas H. 23. Aug 2007 22:20

Re: TRichEdit per Parameter in DB schreiben
 
Hallo,

das leuchtet mir ein.
Für mein (bisheriges) Verständnis sollte man Parameter mehrfach benutzen können. Wenn natürlich für jeden Parameter im SQL-Statement auch einer in der Parameterliste angelegt wird... :party:

Ich werde meine SQL-Strings wohl auf eindeutige Parameter umstellen, um nicht in diese Falle zu tappen!

Nochmal Danke

Andreas


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