Entwickler-Ecke

Datenbanken - Mit SQL RTF in Blob-Feld. Daten verschwinden!


Xion - So 14.10.07 13:50
Titel: Mit SQL RTF in Blob-Feld. Daten verschwinden!
Hi,

habe diesen Code:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
function TDBWorks.Save(ShowError: boolean; DBFile: integer; ID: integer; Fields: array of String; FieldType: array of TFieldType; Values: array of String): boolean;
    var SQLStr: String;  A: integer;
    begin
      Result:=False;
                  
      for A:= 0 to High(Values) do
        Values[A]:=DBWorks.FormSpecialSigns(Values[A]);

      
      Form1.QSearch.Params.Clear;
      for A:= 0 to High(Values) do
        begin
          Form1.QSearch.Params.Add;
          Form1.QSearch.Params[A].Name:='Var'+inttostr(A);
        end;

      {Update}
      SQLStr:='UPDATE '+Data.DBData.DBFiles[DBFile];
      {Set}
      if Length(Fields)>0 then
        begin
         SQLStr:=SQLStr+' SET ';
         SQLStr:=SQLStr+Fields[0]+'= :Var0';
          for A:= 1 to High(Values) do
             SQLStr:=SQLStr+', '+Fields[A]+'= :Var'+inttostr(A);
        end;

      {Where}
      SQLStr:=SQLStr+' WHERE '+Data.DBData.IDField+'="'+inttostr(ID)+'"';

      Form1.QSearch.SQL.Clear;
      Form1.QSearch.SQL.Add(SQLStr);
                  
      for A:= 0 to High(Values) do
        begin
          Form1.QSearch.ParamByName('Var'+inttostr(A)).AsBlob:=Values[A];
          Form1.QSearch.Params[A].DataType:=FieldType[A];
          {an dieser Stelle ist Value genau der richtige Wert}
        end;

      {Search}
      try
        Form1.QSearch.ExecSQL;
        {es sind zwischen 90% und 100% des RTF gelöscht}
      except
        ErrorHandler.Msg('DBWorks_Save_ErrorInSQL',False,SQLStr);
        Exit;
      end;

      Result:=True;
      Form1.QSearch.Close;
      Form1.QSearch.Params.Clear;
    end;


Diese Funktion speichert die Felder (Fields) mit den Werten (Values) in eine Datenbank-Datei. Nur das RTF Feld (Values[16]) verschwindet zunehmend. Es ist vom Typ ftMemo (steht zumindest im Objektinspektor). Alle anderen Felder werden soweit ich sehe korrekt gespeichert.

Xion

//Korrektur: es werden scheinbar die letzten 9 Zeilen des RTF gelöscht. Doch nur einmalig (wenn ich das verbleibende nochmal speichere, bleibt es vorhanden)


Xion - So 14.10.07 17:59

also ich habe hier mal eine kleine Tabelle wie sich das ganze verhält:

Zeichen|Zeilen=>Zeichen|Zeilen nach dem speichern

394 | 4 => 0 | 0
1878 | 45 => 48 | 2
813 | 11 => 0 | 0
301 | 9 => 20 | 2 <= ???

Somit scheint es irrelevant, wie lange die Einträge sind...


alzaimar - So 14.10.07 18:10


Delphi-Quelltext
1:
Form1.QSearch.ParamByName('Var'+inttostr(A)).AsBlob:=Values[A];                    

'.AsBlob' kannte ich nich gar nicht, d.h. mit ADO gibts das auch nicht. Vielleicht wäre AsString auch möglich. Normalerweise werden BLOB-Felder mit einem Stream befüllt...


Xion - So 14.10.07 18:15

statt

Delphi-Quelltext
1:
Form1.QSearch.ParamByName('Var'+inttostr(A)).AsBlob:=Values[A];                    


hatte ich auch schon

Delphi-Quelltext
1:
Form1.QSearch.ParamByName('Var'+inttostr(A)).AsMemo:=Values[A];                    

und

Delphi-Quelltext
1:
Form1.QSearch.ParamByName('Var'+inttostr(A)).AsStringValues[A];                    

und

Delphi-Quelltext
1:
Form1.QSearch.Params[A].Value:=Values[A];                    


alles kein unterschied. Das mit dem Stream ist eine Idee, muss ich gleich mal gucken wie das geht ;)

Thx
Xion


Amiga-Fan - So 14.10.07 18:17

wenn es sich um ein textblob handelt, dann benutze den Textstream in delphi...


Xion - So 14.10.07 18:29

hmmm, also


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
      for A:= 0 to High(Values) do
        begin
          if FieldType[A]=ftBlob then
            Form1.QSearch.Params[A].LoadFromStream(SystemProcs.RTFStream(Values[A]),ftMemo)
          else
            begin
              Form1.QSearch.Params[A].AsString:=Values[A];
              Form1.QSearch.Params[A].DataType:=FieldType[A];
            end;
        end;

...

function TSystemProcs.RTFStream(RTF: String): TStringStream;
var StrStream : TStringStream;
begin
  StrStream := TStringStream.Create(RTF);

  Result:=StrStream;

 // StrStream.Free;

end;


das hab ich mal so hingecodet. Es kommt zwar das richtige an, aber es ist genau wie bisher. Der Parameter hat den richtigen Wert, aber wenn ich wieder Lade ist alles weg (das Laden funktioniert, da bin ich zu 99,9% sicher ^^ )


Xion - So 14.10.07 18:34

Das komischste ist, dass nur einmal abgeschnitten wird. Wenn er das Blob einmal abgeschnitten hat (und auch wenn dann noch was übrig ist) kann ich beliebig oft speichern, der Rest bleibt. Scheint fast so, als ob es doch am Laden läge...nochmal alles durchchecken...


alzaimar - So 14.10.07 18:43

Welche DB verwendest Du? Gibt es ein anderes Tool, um auf die DB zuzugreifen? Was passiert, wenn Du das RFT-Feld als VarChar (4000) deklarierst?


Xion - So 14.10.07 18:51

ich verwende BDE und nach so einem Tool hab ich gerade gegoogelt und nix gefunden. Ich weiß aber, dass es ein Tool dafür gibt (vermutlich tausende ;) ). Die deklaration ist eigentlich ok, weil ich noch andere Blob-Felder habe, und bei denen Funtkioniert alles. Nur das RTF mag er nicht. Vielleicht mach ichs wieder per Table, da gehts problemlos.


Amiga-Fan - So 14.10.07 19:05

ich will der erste sein, der sagt:

schmeiss die BDE weg :D


Robert.Wachtel - So 14.10.07 19:21

ACK!

Aber auch unabhängig davon ist die Frage nicht korrekt beantwortet. Die BDE ist nur eine Datenzugriffsschicht und kann auch mit "richtigen" Datenbanken wie z.B. Oracle und MS-SQL kommunizieren.

Disclaimer: Nein, das sollte man heute auf keinen Fall mehr tun...


Xion - So 14.10.07 21:20

user profile iconAmiga-Fan hat folgendes geschrieben:
ich will der erste sein, der sagt:

schmeiss die BDE weg :D


Das musste ja so kommen ;) Es ist halt ein schon bestehendes System und ich baue nur den Client um. Wenn ich das heute noch mal neu anpacken würde, würde ich auch keine BDE nehmen (ADO ist aber meiner Meinung nach noch schlimmer). Aber lassen wir das.

Kann es sein, dass SQL Probleme mit dem Zeilenumbruch hat? und wie kann ich das Problem dann lösen?


Xion - So 14.10.07 21:47

ok, ich gebe hiermit offiziell auf ^^ ich mach das ganze einfach über Table, unkompliziert und egal, ob irgendwelche sonderzeichen und sonstwas drinne sind. Thx für eure Hilfe :D

Xion


//LOL: der kopierte Code aus dem alten Client geht nicht mehr, selber Fehler...muss wohl an den Delphi-Updates liegen, die ich mir geholt habe *verzweifel*


Xion - So 14.10.07 22:40
Titel: Re: Mit SQL RTF in Blob-Feld. Daten verschwinden!
user profile iconXion hat folgendes geschrieben:

for A:= 0 to High(Values) do
Values[A]:=DBWorks.FormSpecialSigns(Values[A]);


oh mann, man sollte es unterlassen im RTF Zeichen wie ' zu verdoppeln. Das war das einzige Problem. Und wo viel ärger deswegen ^^ Jaja, wie war das mit den 80% der Zeit sind Fehlersuche ;)

:dance: :dance2: jetzt funzts endlich