Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von mse »

Und gibt es auf Feld3 einen "foreign key constraint"?
Edit: Zeos 7.0.5a-stable kompiliert bei mir nicht mit FPC fixes_2_6 (2.6.3).
Free Pascal Compiler version 2.6.3 [2013/06/28] for i386
Copyright (c) 1993-2012 by Florian Klaempfl and others
Target OS: Linux for i386
[...]
Compiling /home/mse/packs/standard/svn/zeos/7.0.5a-stable/src/component/ZConnection.pas
ZAbstractDataset.pas(524,13) Error: Incompatible types: got "AnsiString" expected "Pointer"
ZAbstractDataset.pas(532,19) Error: Incompatible type for arg no. 1: Got "Pointer", expected "AnsiString"
ZAbstractDataset.pas(704,16) Hint: Conversion between ordinals and pointers is not portable
ZAbstractDataset.pas(987) Fatal: There were 2 errors compiling module, stopping
Fatal: Compilation aborted

Sollte Zeos 7.0.5a mit FPC 2.6.3 funktionieren?
Edit 2: nein, darum nicht (ZeosLazarus.inc):

Code: Alles auswählen

 
  {$IF FPC_FULLVERSION>20602}       // will be introduced in 2.6.2 (and up to date 2.6.1)
           //sollte >20603 sein
    {$DEFINE WITH_TRECORDBUFFER}
    {$DEFINE WITH_TBOOKMARK}        // Have TBookmark
    {$DEFINE WITH_INLINE}           // compiler supports inline methodes
  {$IFEND}
 
 
Zuletzt geändert von mse am Mi 2. Okt 2013, 21:10, insgesamt 3-mal geändert.

Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von Matze »

ja, der Wert für das :X ist der Primärschlüssel einer anderen Tabelle.
Aber das funktioniert ja alles wenn ich den Wert von Hand eingebe.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von Michl »

Mal ne blöde Frage, warum schreibst du das ganze nicht ohne Paramter (daran hängt es doch derzeit oder?)???

Code: Alles auswählen

  Var1 := 'xyz';
  with DM.ZUpdateSQL do
  begin
[...] 
    InsertSQL.Clear;
    InsertSQL.Add('  INSERT INTO tbl_tabelle   ');
    InsertSQL.Add('  (Feld1,                   ');
    InsertSQL.Add('  (Feld2,                   ');
    InsertSQL.Add('  (Feld3,                   ');
    InsertSQL.Add('   Feld4)                   ');
    InsertSQL.Add('  VALUES                    '); 
    InsertSQL.Add('  (:Feld1,                  '); 
    InsertSQL.Add('   :Feld2,                  '); 
    InsertSQL.Add('   ' + Var1 + ',            '); //hier die Variable direkt 
    InsertSQL.Add('   :Feld4)                  '); 
[...]

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von mse »

Code: Alles auswählen

 
var
 query: tzquery;
 conn: tzconnection;
 updateobj: tzupdatesql;
begin
 try
  conn:= tzconnection.create(nil);
  with conn do begin
   hostname:= 'localhost';
   database:= '/db/firebird/test.fdb';
   user:= 'SYSDBA';
   password:= 'masterkey';
   protocol:= 'firebird-2.5';
   connected:= true;
  end;
  updateobj:= tzupdatesql.create(nil);
  with updateobj do begin
   insertsql.text:= 'insert into table1 (text1,field1) values (:text1,:X)';
   params.createparam(ftinteger,'X',ptunknown).value:= 111222;
  end;
  query:= tzquery.create(nil);
  with query do begin
   connection:= conn;
   sql.text:= 'select * from table1';
   updateobject:= updateobj;
   active:= true;
   insert;
   fieldbyname('field1').asinteger:= 123;
   fieldbyname('text1').asstring:= 'abcde';
   post;
  end;
 finally
  query.free;
  updateobj.free;
  conn.free;
 end;
 
funktioniert hier wie erwartet, es wird 111222 in field1 geschrieben.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von mse »

Michl hat geschrieben:Mal ne blöde Frage, warum schreibst du das ganze nicht ohne Paramter (daran hängt es doch derzeit oder?)???
Weil nicht parametrisierte SQL statements eher eine Notlösung sind, sie sollten wenn immer möglich vermieden werden (z.B. Stichwort SQL injection).

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von Michl »

mse hat geschrieben:Stichwort SQL injection
"Var1" ist doch eine Variable, sollte daher eher schwierig werden, diese auszunutzen. Dass dieses Vorgehen kein guter Programmierstil ist, ist mir schon bewusst, dachte nur, dass er evtl. damit weiter kommt...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von mse »

Code: Alles auswählen

 
   insertsql.add('insert into table1 (text1,field1) values (:text1,:X)');
   params.parambyname('X').value:= 111222;
 
funktioniert ebenfalls, da die Parameter bei jedem add() aufgefrischt werden. Irgend etwas ist da faul.
Dateianhänge
zeos.png

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von hde »

Matze hat geschrieben:
ABER: Ein Feld, soll den Wert aus einer Variablen übernehmen. Dafür soll es keine DBLookup oder DBEdit Komponente geben, WEIL, dieser Wert ist bekannt.

Hast du mal versucht das Feld (X = Feld3 ?) im InsertSQl ganz normal anzugeben und es bei OnNewRecord zu füllen?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von mse »

EgonHugeist hat geschrieben:Frage läuft Zeos auf dem MSEgui auch?
Habe mal etwas gemacht:
http://zeoslib.sourceforge.net/viewtopi ... =25&t=4688

Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von Matze »

Code: Alles auswählen

InsertSQL.Add('   ' + Var1 + ',            '); //hier die Variable direkt
@Michl: Das hat nicht funktioniert

Code: Alles auswählen

Params.Createparam(ftstring,'X',ptunknown).Value:= 3;
@mse: Aber so funktioniert es, es wird wirklich ein Datensatz angelegt mit dem Wert 3 im richtigen Feld!

Hast du mal versucht das Feld (X = Feld3 ?) im InsertSQl ganz normal anzugeben und es bei OnNewRecord zu füllen?
@hde: Nein, ich weiss nicht so genau was ich bei dem Ereignis schreiben muss.

Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von Matze »

Ich denke ich habe die Variable Var1 auch falsch definiert und gefüllt:

Code: Alles auswählen

Var1 : string
Var1 := DM.ZQueryProject.FieldByName('IDProject').AsString;
Ich habe das geändert in:

Code: Alles auswählen

Var1 : Integer
Var1 := DM.ZQueryProject.FieldByName('IDProject').AsInteger;
Weil das Datenformat von Feld IDProject ist vom Typ BigInt.
Aber trotzdem funktioniert es so auch nicht mit der Variablen.

Wenn in diesem Beispiel die 3 als Inhalt gedeutet wird:

Code: Alles auswählen

Params.Createparam(ftstring,'X',ptunknown).Value:= 3;
Kann doch das eigentlich gar nicht gehen:

Code: Alles auswählen

Params.Createparam(ftstring,'X',ptunknown).Value:= Var1;
Weil Var1 ist doch jetzt auch der Inhalt oder?

Edit: Ich noch ftstring in ftinteger geändert:

Code: Alles auswählen

Params.Createparam(ftinteger,'X',ptunknown).Value:= Var1; 
Aber geht auch so nicht.
Zuletzt geändert von Matze am Fr 4. Okt 2013, 14:17, insgesamt 1-mal geändert.

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von hde »

Matze hat geschrieben: @hde: Nein, ich weiss nicht so genau was ich bei dem Ereignis schreiben muss.
ZQUery...FieldByName('FELD3').AsInteger := var1;

hde

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von hde »

Dukannst die ZUpdateSQLs doch auch generieren lassen, oder warum von Hand?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von mse »

Matze hat geschrieben: Edit: Ich noch ftstring in ftinteger geändert:

Code: Alles auswählen

Params.Createparam(ftinteger,'X',ptunknown).Value:= Var1; 
Aber geht auch so nicht.
Die Zuweisung an Value setzt auch den Datentyp.

Code: Alles auswählen

 
procedure TParam.SetAsVariant(const Value: Variant);
begin
  if ParamRef = Self then
  begin
    FBound := not VarIsClear(Value);
    FNull := VarIsClear(Value) or VarIsNull(Value);
    if FDataType = ftUnknown then
      case VarType(Value) of
        varSmallint, varShortInt, varByte: FDataType := ftSmallInt;
        varWord, varInteger: FDataType := ftInteger;
        varCurrency: FDataType := ftBCD;
        varLongWord, varSingle, varDouble: FDataType := ftFloat;
        varDate: FDataType := ftDateTime;
        varBoolean: FDataType := ftBoolean;
        varString, varOleStr: if FDataType <> ftFixedChar then FDataType := ftString;
        varInt64: FDataType := ftLargeInt;
      else
        if VarType(Value) = varSQLTimeStamp then
          FDataType := ftTimeStamp
        else if VarType(Value) = varFMTBcd then
          FDataType := ftFMTBcd
        else 
          FDataType := ftUnknown;
      end;
    FData := Value;
  end else
    ParamRef.SetAsVariant(Value);
end;
 
Wie ist den Var1 definiert?

Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

Re: Zeos - ZUpdateSQL - Params.ParamByName geht nicht

Beitrag von Matze »

Wie ist den Var1 definiert?

Var1 : integer
Var1 := ZQuery.FieldByName('ID').AsInteger;

Antworten