Stern statt existierendes Feld

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Benutzeravatar
Swirl
Beiträge: 94
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Stern statt existierendes Feld

Beitrag von Swirl »

Hallo,

verstehe folgendes Verhalten nicht.

der Satz...

Code: Alles auswählen

frmZugang.SQLQuery1.SQL.Add('select ang_chipcode from angestellte where ang_chipcode = ' + '"' + edtChipcodeAnlegen.Text + '"'); 
...wirft mir immer ein - Field not found: "ang_name" - raus, obwohl "ang_name" als Feld im Datensatz vorhanden ist. Außerdem hatte ich ja nach "ang_chipcode"
gefragt. (ist im Datensatz auch vorhanden)

zur Frage: Warum tut's die Abfrage jedoch, wenn ich statt ang_chipcode einen Stern nehme, quasi nach allen Feldern frage?

So läuft die Abfrage...

Code: Alles auswählen

frmZugang.SQLQuery1.SQL.Add('select * from angestellte where ang_chipcode = ' + '"' + edtChipcodeAnlegen.Text + '"'); 
Gruß,
Michael
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

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

Re: Stern statt existierendes Feld

Beitrag von theo »

Schwierig ohne Glaskugel.

Greift irgend ein Property der SQLQuery (oder so) auf `ang_name` zu?
Das Feld bekommt es mit dem Stern, sonst nicht.
Was passiert mit:

Code: Alles auswählen

SELECT `ang_chipcode` , `ang_name` FROM...
..statt dem Stern?

Benutzeravatar
six1
Beiträge: 786
Registriert: Do 1. Jul 2010, 19:01

Re: Stern statt existierendes Feld

Beitrag von six1 »

oder auch
frmZugang.SQLQuery1.SQL.Add('select angestellte.ang_chipcode from angestellte where angestellte.ang_chipcode = ' + '"' + edtChipcodeAnlegen.Text + '"');
Gruß, Michael

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
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: Stern statt existierendes Feld

Beitrag von af0815 »

A ) Zum Thema "select *" steht meine Meinung dort. viewtopic.php?f=17&t=14525&p=130755&hil ... ct#p130755
Wenn es mit "select *" funktioniert, so ist beim Stringaufbau was schief gelaufen. Sowas wird durch den Platzhalter verschleiert, auch Tippfehler oder Änderungen an der DB später mal

B ) keine Stringfrickeleien sondern Parameter verwenden. Auch aus Sicherheitsgründen denn ein "'Hugo'; Delete from angestellte where 1=1;" ist bald mal injiziert. Mit Parametern kann man nicht injizieren.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Stern statt existierendes Feld

Beitrag von charlytango »

Dann geb ich meinen Senf auch noch dazu.

Dazu noch eine Frage: verwendest du SQLdb oder ZEOS?
Das folgende gilt allgemein auch für ZEOS nur Punkt C ist SQLdb spezifisch

A: Wenn schon das SQL Statement direkt zugewiesen wird, dann verwende ich routinemäßig eine lokale Variable, ein SQL.Clear und QuotedStr

Code: Alles auswählen

var s:string;

s:= 'select ang_chipcode from angestellte where ang_chipcode = ' +QuotedStr(edtChipcodeAnlegen.Text);
frmZugang.SQLQuery1.Close;
frmZugang.SQLQuery1.SQL.Clear;
frmZugang.SQLQuery1.SQL.Text:=s; 
frmZugang.SQLQuery1.Open;
B: Besser wäre die Methode die af0815 empfahl;

Code: Alles auswählen

var s:string;

s:= 'select ang_chipcode from angestellte where ang_chipcode = :edtChipcodeAnlegen');
frmZugang.SQLQuery1.Close;
frmZugang.SQLQuery1.SQL.Clear;
frmZugang.SQLQuery1.SQL.Text:=s; 
frmZugang.SQLQuery1.SQL.ParamByName('edtChipcodeAnlegen').AsString:=edtChipcodeAnlegen.Text;
frmZugang.SQLQuery1.Open;
jedenfalls kann man bei beiden Varianten leicht die lokale Variable beim Debuggen auslesen und sie ggfs auch in einen externen SQL-Client (zb HeidiSQL) werfen um zu sehen ob irgendwas nicht stimmt.

C: Alle SQLdb Konnektoren (also TSQLdbConnector und auch die spezifischen wie TSQLite3Connection etc) haben ein Log-Event OnLog. SQL Logs sind bei mir während der Entwicklung immer eingeschaltet, denn meistens kann man mehr herauslesen als aus einer Datenbankexception die meistens kryptisch ist.

Zudem sind aus den Logmeldungen meistens auch die SQL-Statemens kopierbar die man extern austesten kann.

Benutzeravatar
Swirl
Beiträge: 94
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: Stern statt existierendes Feld

Beitrag von Swirl »

Um nicht respektlos zu sein - bin bis Ende November im Urlaub. Dann werde ich auf die Vorschläge eingehen.
Einstweilen vielen Dank,
Michael
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

Antworten