| Autor |
Beitrag |
Xion
      

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)
|
Verfasst: So 14.10.07 13:50
Hi,
habe diesen Code:
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;
SQLStr:='UPDATE '+Data.DBData.DBFiles[DBFile]; 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;
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]; end;
try Form1.QSearch.ExecSQL; 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 
      

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)
|
Verfasst: 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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...
_________________ Na denn, dann. Bis dann, denn.
|
|
Xion 
      

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)
|
Verfasst: 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
_________________ 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
      
Beiträge: 534
|
Verfasst: 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 
      

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)
|
Verfasst: 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;
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 
      

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)
|
Verfasst: 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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 
      

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)
|
Verfasst: 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
      
Beiträge: 534
|
Verfasst: So 14.10.07 19:05
ich will der erste sein, der sagt:
schmeiss die BDE weg 
_________________ - Leg dich nie mit einem Berufsprogrammierer an
- Wahre Profis akzeptieren keine einfachen Lösungen
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: 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 
      

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)
|
Verfasst: So 14.10.07 21:20
Amiga-Fan hat folgendes geschrieben: | ich will der erste sein, der sagt:
schmeiss die BDE weg  |
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 
      

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)
|
Verfasst: 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
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 
      

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)
|
Verfasst: So 14.10.07 22:40
_________________ 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)
|
|
|