Entwickler-Ecke
Datenbanken - SQL Abfragen mit Variablen
Nachtschrat - Sa 07.07.07 17:04
Titel: SQL Abfragen mit Variablen
Hallo zusammen,
es tut mir ja Leid, wenn ich mit so einer Leienfrage komme, aber mein schlaues Buch scheint mit Variablen nicht zu arbeiten.
Folgendes Problem:
Ich möchrte aus einer Datenbank (Paradox) einen namen suchen lassen. Der soll über ein TEdit in eine Variable eingelesen werden und wenn auf 'suchen' geklickt wird, soll nach dem Namen aus der Variable gesucht werden und im DBGrid angezeigt werden. Ich hoffe einer von euch ist so nett und sagt mir, wie ich mit variablen arbeiten kann in einer SQL-Abfrage.
Danke im vorraus
Flamefire - Sa 07.07.07 18:40
Query.SQL.ADD('SELECT * FROM Tabelle WHERE Name='''+Edit.Text+'''');
Nachtschrat - Sa 07.07.07 18:50
Danke! Eine Frage noch, wenn im Feld 'Name' zwei Namen stehen, Vor- und Nachname, ich aber nur einen der beiden namen eingebe, was bekomme ich dann als Ergebnis? Alle Mayers, Erwins etc. oder gar nichts?
mkinzler - Sa 07.07.07 19:48
Es wäre besser (SQL-)Parameter zu nehmen:
SQL-Anweisung
1:
| Query.SQL.Text := 'SELECT * FROM Tabelle WHERE Name=:name'; |
Delphi-Quelltext
1:
| Query.ParamByName('name').Value := Edit.Text; |
KidPaddle - So 08.07.07 11:19
Bei der Bedinung wird "=" verwendet und somit kommt nur die Daten zurück, die genauso gespeichert sind wie der Suchbegriff. Am besten verwendet Du "like" in der Form:
Query.SQL.ADD('SELECT * FROM Tabelle WHERE Name LIKE ''%'+Edit.Text+'%''');
Damit kommen alle Datensätze, die den Suchbegriff enthalten. Leider kann für diese Suche kein Index verwendet werden, daher sehr langsam in großen Datenbeständen.
Gruß
THomas
hansa - So 08.07.07 20:11
Geht es eigentlich um eine Klassenarbeit ? Die Frage taucht mir die letzte Zeit zu oft auf. Ist der Lehrer nicht zu sehr verbeamtet, dann fällt dem das auf. 8)
Kombiniere das LIKE mit den mkinzlerschen Parametern und das wars.
Nachtschrat - Di 17.07.07 08:27
Nein, es geht nicht um eine Klassenarbeit. Ich mache das außerschulisch :)
Funktioniert wunderbar - danke!
Hm, mir ist aufgefallen, dass ich einen so gesuchen Datensatz gar nicht editieren kann. Zumindest nicht mit den Buttons vom DBNavigator bzw. den DataSet-Actions der Actionlist. Ist das ein Privileg für TTable?
mkinzler - Di 17.07.07 08:44
Jein. Du kannst auch einen TQuery durch die Verwendung eines TUpdateSQL als Updateobjekt updatable machen, wenn die verwendete Datenbank das nicht direkt unterstützt.
alzaimar - Di 17.07.07 11:36
KidPaddle hat folgendes geschrieben: |
Bei der Bedinung wird "=" verwendet und somit kommt nur die Daten zurück, die genauso gespeichert sind wie der Suchbegriff. Am besten verwendet Du "like" in der Form:
Query.SQL.ADD('SELECT * FROM Tabelle WHERE Name LIKE ''%'+Edit.Text+'%''');
Damit kommen alle Datensätze, die den Suchbegriff enthalten. Leider kann für diese Suche kein Index verwendet werden, daher sehr langsam in großen Datenbeständen.
|
Und deshalb sollte man so etwas auch nie verwenden. Es sei denn, man wird von den großen DB- und Hardware-Herstellen dafür bezahlt. So eine Abfrage kann schon mal einen kompletten Server lahm lagen (also, nicht das er abschmiert, er wird eben nur ... lahm). Also: Nicht verwenden.
hansa - Di 17.07.07 13:19
Das Zeitverhalten ist vom Einzelfall abhängig. Rest ist Theorie. @Alzaimer :mrgreen: Geht es um ca. 1-5 stellige Anzahl an Datensätzen, in denen gesucht werden soll, dann ist das immer noch schneller, als 3 falsche Nummern einzugeben und dann irgendwas in einer Papierliste zu suchen, um es endlich zu finden. Für richtige DAUs sind solche LIKE - Konstrukte lebenswichtig. :lol: Muss man notfalls eben mal testen.
Nachtschrat - Mi 18.07.07 08:09
Bei meiner kleinen Datenmenge die sich in meiner kleinen Datenbank tummeln, habe ich weniger bedenken dass er langsamer wird :).
Also nochmal ganz konkret gefragt: Mit einem TQuery kann ich gesuchte Daten nicht auch noch auf DBTexte verteilen? Oder habe ich da was falsch verstanden?
hansa - Mi 18.07.07 13:28
Also nochmals : auf einer Form sind DBEdit, DBText usw. Die DB-Dinger haben zugewiesene Feldnamen usw. Ich mache es in der Praxis dann so : zweite kleine Form mit normalem TEdit. Dort kann der Suchbegriff eingegeben werden. Auf der Suchform sind noch weiter/zurück/abbrechen/gefunden-Buttons. Dahinter steckt Dataset.Next,Prior usw. Sobald ein Dataset.Open gemacht wird, dann sind DBEdit, DBText usw. bestückt und man kann da rumwandern. Der gefunden-Button schließt dann die Suchform und man kann Daten ändern. Voraussetzung ist dabei, dass nur ein Dataset für beide Forms verwendet wird, sonst kriegt die Eingabeform ja nichts von dem Next der Suchform mit. Deshalb gibt es ja auch DataModules. Ich glaube sogar SELECT * zu verwenden, damit direkt alle Felder zu sehen sind. Da könnte man bei Performance-Problemen ja noch einiges machen.
Nachtschrat - Do 19.07.07 08:01
Alles klar, super. Ich glaube ich habe es verstenden. Werde es mal versuchen und schauen ob ich es so verstanden habe wie es zu verstehen sein sollte :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!