Autor Beitrag
Stocki1990
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 14.05.09 15:45 
Servus Leute!

Soeben angemeldet und schon auch gleich die 1. Frage meinerseits. Ich bin gerade dabei, ein Schulprojekt Namens "Schülerverzeichnis" zu erstellen und bin gerade bei folgendem Problem:

Ich habe mittels folgendem Code die Klassen der Datenbank in eine Combobox (cb_Schuler) eingelesen mittels folgendem Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
ADOQuery1.close;
 ADOQuery1.SQL.clear;
 ADOQuery1.SQL.Add('Select distinct klasse from Schueler');
 ADOQuery1.Open;

 While not ADOQuery1.Eof do begin

cb_schuler.items.add(adoquery1.FieldValues['Klasse']);
  ADOQuery1.Next;
 end;
 
 Adoquery1.close;

Soweit so gut, die Klassen sind nun in der Combobox drinnen. Wenn ich aber nun auf eine Klasse in der Combobox (zB 1AHK) klicke, sollen alle Schüler dieser Klassen in einem Listview (lv_Schuler) erscheinen.

Dies passiert aber jedoch nicht, da folgender Fehler auftritt:
Zitat:
"Syntaxfehler (fehlender Operator) in Abfrageausdruck 'Klasse = 1AHK' "

Ich sitze nun schon einige Zeit an diesem Fehler und weiß ehrlich gesagt nicht weiter.

Hier wäre der Code:
ausblenden 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:
24:
25:
26:
27:
procedure TForm1.cb_schulerSelect(Sender: TObject);
var
LI : TListItem;

begin

Klass := cb_schuler.Items[cb_schuler.ItemIndex];

 ADOQuery1.close;
 ADOQuery1.SQL.clear;
 ADOQuery1.SQL.Add('SELECT * FROM Schueler where Klasse = '  + Klass);
 ADOQuery1.open;

  While not ADOQuery1.Eof do begin
 LI := lv_schuler.items.add;
  LI.caption := ADOQuery1.FieldValues['Klasse'];
  LI.subitems.add(ADOQuery1.FieldValues['Nachname']);
  LI.subitems.add(ADOQuery1.FieldValues['Vorname']);
  LI.subitems.add(ADOQuery1.FieldValues['PLZ']);
  LI.subitems.add(ADOQuery1.FieldValues['Ort']);
  LI.subitems.add(ADOQuery1.FieldValues['Adresse']);
  ADOQuery1.Next;
 end;

 Adoquery1.close;

end;

Ich hoffe, dass Ihr mir hier weiterhelfen könnt und möchte euch schon jetzt für Eure Antworten bedanken.

Grüße Christoph

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Do 14.05.09 16:05 
Hallo und willkommen.

Einfache Lösung:

ausblenden Delphi-Quelltext
1:
ADOQuery1.SQL.Add('SELECT * FROM Schueler where Klasse = '  + QuotedStr(Klass));					


Werte müssen an die Datenbank immer als String übergeben werden, also mit '' bei dir where Klasse = '1AHK'

LG
Stefan

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 14.05.09 16:08 
Versuch es mal so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
ADOQuery1.close;
ADOQuery1.SQL.Text := 'SELECT * FROM Schueler where Klasse = :Klasse';
ADOQuery1.Parameters.ParamByName('Klasse').Value := cb_schuler.Items[cb_schuler.ItemIndex];
ADOQuery1.open;


ZeitGeist87 hat folgendes geschrieben:
Werte müssen an die Datenbank immer als String übergeben werden

Das gilt aber nur für Stringfelder.
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Do 14.05.09 16:11 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:

ZeitGeist87 hat folgendes geschrieben:
Werte müssen an die Datenbank immer als String übergeben werden

Das gilt aber nur für Stringfelder.


Leider aber nur, wenn du es so wie du mit Parametern machst. Andernfalls erwartet das SQL-Query nur Strings ;-)

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 14.05.09 16:15 
Du meinst jetzt, dass der Text des Queries ein String ist, oder? Ansonsten wäre die Aussage falsch.
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Do 14.05.09 16:16 
Ja, wenn du das Query "zusammenbaust" kannst du nur Strings übergeben.
Integer etc. musst du dann casten.
Das mein ich.

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 14.05.09 16:24 
OK, das ist natürlich richtig, aber quoten muss man nur Stringfelder, wobei man da immer Parameter vorziehen sollte.
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Do 14.05.09 16:34 
hmm..ich macht das immer mit QuotedStr..

Gibt´s nen Nachteil?

Werd´s auch weiterhin tun.
Ist ja je nach Gusto, gell ;-)

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 14.05.09 16:52 
Wenn ich recht nachdenke, bewirkt QuotedStr im Grunde dasselbe. Was man aber auf gar keinen Fall tun sollte, ist eine einfache Stringkonkatenation zu verwenden, da man damit nicht vor SQL-Injection sicher ist.
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Do 14.05.09 17:19 
In welchem Sinne Kette meinst du?

ausblenden Delphi-Quelltext
1:
query.sql.text:= 'Insert into Branche (Bezeichnung, Beschreibung, Status) values (' + doSQL(Name) + ', ' + doSQL(Beschreibung) + ', ' + doSQL(Status) + ')';					


Deiner Meinung nach falsch/unpraktikabel? Ich hab´s halt so gelernt und komm damit super klar.

DoSQL ist bei mir eine Funktion die result:= QuotedStr(Wert); macht. Bin zu faul, jedes Mal QuotedStr zu schreiben :)

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Stocki1990 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 14.05.09 17:40 
Servus Leute!

Danke vielmals für eure Antworten. Nun funktioniert die
Ausgabe im Listview endlich :D
Werde nun versuchen, das Projekt fertig zu stellen.
Wenn es fertig ist, werde ich es euch einmal zeigen.

Grüße Christoph
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 14.05.09 17:40 
Ich meinte so etwas:
ausblenden Delphi-Quelltext
1:
SQL.Text := 'SELECT * FROM Tabelle WHERE Name = ''' + Edit1.Text + '''';					

Das sieht man öfter, ungefährlich ist das auf die Art und Weise sicherlich nicht.
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Do 14.05.09 18:11 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Ich meinte so etwas:
ausblenden Delphi-Quelltext
1:
SQL.Text := 'SELECT * FROM Tabelle WHERE Name = ''' + Edit1.Text + '''';					

Das sieht man öfter, ungefährlich ist das auf die Art und Weise sicherlich nicht.


Achso ja, das ist tödlich :)

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.