SQLITE aktuaklisieren

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Benutzeravatar
BoraBora
Beiträge: 42
Registriert: So 11. Apr 2021, 16:00
OS, Lazarus, FPC: FPC 3..2.2, L 2.2.0 , Linux Mint, WIN 10&11, Android,
CPU-Target: xxBit

SQLITE aktuaklisieren

Beitrag von BoraBora »

Hallo zusammen,

beisse mir gerade die Zähne an dieser (einfachen) Problematik aus:
ich möchte gern alle Namensfelder in einer Adressdatenbank verschlüsseln.
Das Iterieren durch die DB ist kein Problem, das Ersetzen des Klarnamens mit
der verschlüsselten Version schon.
Ist dieser Ansatz hier überhaupt der richtige:

Code: Alles auswählen

 
  Passwort := 'BlaBla';
  SQLQuery1.SQL.Text := 'select name from adressen';
  SQLQuery1.Open();
  SQLQuery1.refresh;

  while not sqlQuery1.EOF do
  begin
    Temp := encrypt(Passwort, trim(sqlquery1.FieldByName('name').AsString));
    Kundennummer := Sqlquery1.fieldbyname(kdnr).asstring;
    //
    // Dies Ansatz scheint falsch zu sein: SQLQuery1.SQL.Text := 'Update adressen set name = ' +  Temp + 'where num='+Kdnummer;
    // 
    sqlquery1.Next;
  end; 
Mit ZEOS wäre das für mich kein Problem- ich möchte das aber gern mal ohne ZEOS-Komponenten realisieren.

Bin für jeden Hinweis dankbar.

BB

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6216
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: SQLITE aktuaklisieren

Beitrag von af0815 »

Update und Select mischen UND dabei den Key ändern geht nicht. Nicht mal in ZEOS. Das ist grundlegend ein NoGo.

Ist der Name der primärschlüssel oder nicht ?

Grundlegend kannst du das machen, wenn du mit update arbeitest, das du eine zweite Query für das Update verwenden (den PK unbedingt mit einbinden bei der ersten). Die erste Query iteriert durch und die zweite Query erledigt das update.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: SQLITE aktuaklisieren

Beitrag von theo »

Zusätzlich zu dem was af0815 sagte, kommt es wahrscheinlich noch darauf an, ob encrypt überhaupt ASCII und nicht Binärdaten zurückliefert.
Und ein paar Hochkomma bei "set name = ' + Temp + '" wären auch sinnvoll. https://www.freepascal.org/docs-html/rt ... edstr.html
etc. :wink:

Benutzeravatar
BoraBora
Beiträge: 42
Registriert: So 11. Apr 2021, 16:00
OS, Lazarus, FPC: FPC 3..2.2, L 2.2.0 , Linux Mint, WIN 10&11, Android,
CPU-Target: xxBit

Re: SQLITE aktuaklisieren

Beitrag von BoraBora »

Vielen Dank für die Hinweise.
Das mit den Hochkommas war mir bewusst- ist ohnehin problematisch,
wenn encrypt z.B. Hochkommas zurückliefert...

Trotzdem erstmal vielen Dank!

BB

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: SQLITE aktuaklisieren

Beitrag von MmVisual »

Das geht so:

Code: Alles auswählen

Kundennummer := Sqlquery1.fieldbyname('kdnr').AsInteger.ToString;
SQLQuery1.SQL.Text := 'Update adressen set name = :Tmp where num='+Kdnummer;
SQLQuery1.ParamByName('Tmp').AsString := Temp;
Die "Kundennummer" ist doch eine Zahl? - also eine eindeutige?, dann muss unbedingt die als Integer abgefragt werden und nicht als String. Denn wenn der String einmal leer sein sollte, dann geht der "Update" SQL Befehl nicht mehr.

Prinzipiell werden alle Strings und Datumsfelder immer als Parameter übergeben. Damit braucht man sich um das Quoting selbst nicht kümmern und umgeht sämtliche SQL Injection Probleme.

Sollte die Verschlüsselung irgend welche Zeichen zurück liefern, die nicht in irgend einen Zeichensatz passen, dann sollte man das ganze mit "EncodeStringBase64" noch packen, damit hätte man ASCII Zeichen und es gibt keine Probleme wegen Ländereinstellungen.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten