Autor Beitrag
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: So 14.10.07 13:50 
Hi,

habe diesen Code:

ausblenden volle Höhe 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)

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Xion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: 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...

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: So 14.10.07 18:10 
ausblenden 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...

_________________
Na denn, dann. Bis dann, denn.
Xion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: So 14.10.07 18:15 
statt
ausblenden Delphi-Quelltext
1:
Form1.QSearch.ParamByName('Var'+inttostr(A)).AsBlob:=Values[A];					


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

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

und
ausblenden 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

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Amiga-Fan
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 534



BeitragVerfasst: So 14.10.07 18:17 
wenn es sich um ein textblob handelt, dann benutze den Textstream in delphi...

_________________
- Leg dich nie mit einem Berufsprogrammierer an
- Wahre Profis akzeptieren keine einfachen Lösungen
Xion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: So 14.10.07 18:29 
hmmm, also

ausblenden 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 ^^ )

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Xion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: 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...

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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?

_________________
Na denn, dann. Bis dann, denn.
Xion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: 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.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Amiga-Fan
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 534



BeitragVerfasst: So 14.10.07 19:05 
ich will der erste sein, der sagt:

schmeiss die BDE weg :D

_________________
- Leg dich nie mit einem Berufsprogrammierer an
- Wahre Profis akzeptieren keine einfachen Lösungen
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: 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?

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Xion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: 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*

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Xion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: So 14.10.07 22:40 
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

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)