Entwickler-Ecke
Datenbanken - Combobox auslesen und dann ins Listview eintragen
Stocki1990 - Do 14.05.09 15:45
Titel: Combobox auslesen und dann ins Listview eintragen
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:
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:
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
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
ZeitGeist87 - Do 14.05.09 16:05
Hallo und willkommen.
Einfache Lösung:
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
Delete - Do 14.05.09 16:08
Versuch es mal so:
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 - Do 14.05.09 16:11
DeddyH hat folgendes geschrieben : |
| 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 ;-)
Delete - 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 - 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.
Delete - 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 - 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 ;-)
Delete - 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 - Do 14.05.09 17:19
In welchem Sinne Kette meinst du?
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 :)
Stocki1990 - 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
Delete - Do 14.05.09 17:40
Ich meinte so etwas:
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 - Do 14.05.09 18:11
DeddyH hat folgendes geschrieben : |
Ich meinte so etwas:
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 :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!