Einzelnen Beitrag anzeigen

Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: SQLQuery das Feld 'id' wurde nicht gefunden.

  Alt 18. Feb 2019, 10:55
Hi zusammen

Hmmm... Besser wäre auf jeden fall, die gesamten DB-Methoden in ein Datenmodul zu verlagern und von diesem nicht auff die GUI (in diesem Fall Form 1) zuzugreifen.

Schlecht ist zum Beispiel dies:
Delphi-Quellcode:
    SQLQuery1.ParamByName('website').Value := Edit1.Text;
    SQLQuery1.ParamByName('mainurl').Value := Edit2.Text;
    SQLQuery1.ParamByName('username').Value := Edit3.Text;
    SQLQuery1.ParamByName('password').Value := Edit4.Text;
Schreibe die Werte der Edits zB. in private Felder (Variablen mit vorangestelltem F), verpasse deiner Form1 Propertys, die diese Felder direkt oder indirekt über Getter-Methoden auslesen können.

Wenn nun der User per zB. OK-Button die Werte der Edits in die DB schreiben will, greift deine Form1 auf das Datenmodul und die Insertprozedur zu, indem sie diese aufruft und per Übergabeparameter die Werte der Felder übergibt. In diesem Fall bräuchtest du die Propertys nicht unbedingt. Andrerseits - wenn diese die Felder über Getter- und Setter-Methoden auslesen/beschreiben, kannst du zB. gleich in der Settermethode ein Passwort verschlüsseln und es so an die DB weiterreichen. Oder du kannst die Werte eh darauf prüfen, ob sie überhaupt in die DB geschrieben werden sollen etc.

Ein weiterer Vorteil: Da das Datenmodul deine GUI nicht kennt umgekehrt aber schon), musst du zB. die Insertprozedur nicht ändern, wenn sich an der GUI was ändert.

Parameter zu "Preparen", bevor der SQL Text gesetzt wird, hab ich so auch noch nicht gesehen.
Passwörter 1:1 in eine Tabelle zu schreiben ist ein Nogo.
Das meint dies:
Delphi-Quellcode:
    SQLQuery1.ParamByName('website').Value := Edit1.Text;
    SQLQuery1.ParamByName('mainurl').Value := Edit2.Text;
    SQLQuery1.ParamByName('username').Value := Edit3.Text;
    SQLQuery1.ParamByName('password').Value := Edit4.Text;
    SQLQuery1.ParamByName('dbname').Value := Edit5.Text;
    SQLQuery1.ParamByName('searchsite').Value := CheckBox1.Checked;
    SQLQuery1.ParamByName('listresults').Value := CheckBox2.Checked;
    SQLQuery1.SQL.Text :=
      'insert into users (website,mainurl,username,password,dbname,searchsite,listresults) '
      + 'values(:website,:mainurl,:username,:password,:dbname,:searchsite,:listresults) ';
    SQLQuery1.ExecSQL;
Das nicht so, sondern wie folgt sein sollte:

Delphi-Quellcode:
    SQLQuery1.SQL.Text :=
      'insert into users (website,mainurl,username,password,dbname,searchsite,listresults) '
      + 'values(:website,:mainurl,:username,:password,:dbname,:searchsite,:listresults) ';
    SQLQuery1.ParamByName('mainurl').Value := Fmainurl;
    SQLQuery1.ParamByName('username').Value := Fusername;
    SQLQuery1.ParamByName('password').Value := Fpassword;
    SQLQuery1.ParamByName('dbname').Value := Fdbname;
    SQLQuery1.ParamByName('searchsite').Value := FCheckBox1Checked;
    SQLQuery1.ParamByName('listresults').Value := FCheckBox2Checked;

    SQLQuery1.ExecSQL;
Die Edits habe ich nur aus Beispielgründen durch pivate Felder ersetzt. Würde sich diese Prozeduur in einem Datenmodul befinden, bekäme sie die mit F beginnenden Felder als Übergabeparameter, auch Argumente genannt und sollten daher (per Konvention) mit A statt mit F beginnen.


Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat