Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Suchen nach Wortfetzen


Orothred - Fr 28.09.07 12:58
Titel: Suchen nach Wortfetzen
Hi!

Mit folgendem Code wird meine Suchfunktion im Programm Adressverwaltun (Freeware-Bereich) realisiert:


C#-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:
switch (cBAuswahl.SelectedIndex)
            {
               case 0:
                  strSQL = "SELECT * FROM Adressen WHERE Name=@Eingabe";
                  break;
               case 1:
                  strSQL = "SELECT * FROM Adressen WHERE Vorname=@Eingabe";
                  break;
               case 2:
                  strSQL = "SELECT * FROM Adressen WHERE Straße=@Eingabe";
                  break;
               case 3:
                  strSQL = "SELECT * FROM Adressen WHERE Ort=@Eingabe";
                  break;
               case 4:
                  strSQL = "SELECT * FROM Adressen WHERE PLZ=@Eingabe";
                  break;
               case 5:
                  strSQL = "SELECT * FROM Adressen WHERE Telefon=@Eingabe";
                  break;
               case 6:
                  strSQL = "SELECT * FROM Adressen WHERE Email=@Eingabe";
                  break;
               case 7:
                  strSQL = "SELECT * FROM Adressen WHERE Geburtstag=@Eingabe";
                  break;
            }


Allerdings kann ich damit nur nach dem exakten z.B. Namen suchen. Wie kann ich es realisieren dass z.B. bei eingabe von "Me" trotzdem ein Herr Meier angezeigt wird?

Moderiert von user profile iconraziel: Code- durch C#-Tags ersetzt


Alpha_Wolf - Fr 28.09.07 13:12

Ersteinmal: Du verwendest immer SELECT * FROM ....

Nimm das ganze doch als variable oder noch besser als Konstante und bastle bei jedem case einfach nur den WHERE Part dran.. (strings zusammenfügen)

Was du nicht bedacht hast ist, dass man vielleicht auch nach mehreren Dingen gleichzeitig suchen will.. zB alle Maiers aus den Orten deren PLZ mit 87 beginnt.

Verwende einfach eine Filter Funktion in der du alle Teile der WHERE Klausel in einer Variable sammelst (aneinander gehängt) die du zurückgibst. Dann schreibe einmal deinen SQL Rumpf und bevor du den ausführst fügst du deinen Filterstring dazu. (Hoffe das ist einigermaßen verständlich)

Du erreichst die Teilsuche indem du Wildcards verwendest (Suchfunktion benutzen). Das ist meistens ein '%' Zeichen.

Also z.B.: SELECT Nachname FROM T_Person WHERE Nachname LIKE 'Ma%';

Wichtig hierbei ist die Wildcard und das du mit LIKE vergleichst und nicht mit = da er sonst den exakten Wert sucht.

Schau dir mal hier das SQL Tutorial an.. da findest du einiges http://www.w3schools.com/sql/default.asp


Orothred - Fr 28.09.07 13:29

Also das mit % hab ich schon versucht, da bekomme ich dann folgende Fehlermeldung:

"Syntaxfehler in Abfrageausdruck 'Name LIKE @Eingabe%'.


Alpha_Wolf - Fr 28.09.07 13:33

user profile iconOrothred hat folgendes geschrieben:
Also das mit % hab ich schon versucht, da bekomme ich dann folgende Fehlermeldung:

"Syntaxfehler in Abfrageausdruck 'Name LIKE @Eingabe%'.


Zeige bitte mal dein SQL Statement so wie es im Code steht und so wie zur Laufzeit aussieht, dann hilfts sich leichter ;)


Orothred - Fr 28.09.07 13:37

was genau meinst du jetz damit? Code hab ich doch oben schon gepostet ^^


Alpha_Wolf - Fr 28.09.07 13:40

sorry doppelpost.. bitte löschen


Alpha_Wolf - Fr 28.09.07 13:46

user profile iconOrothred hat folgendes geschrieben:
was genau meinst du jetz damit? Code hab ich doch oben schon gepostet ^^


Das ist der ALTE Code.. nicht der den du jetzt mit der Wildcard benutzt ;) Den möchte ich sehen.. den der den Fehler verursacht.


Du kannst die Wildcard aber nicht einfach an eine Variable hängen.. die muss im String sein bzw. als String an den Begriff gehängt werden.


Was bezweckst du eigentlich mit dem @?

Wenn du einen String mit SQL in der DB vergleichen willst dann musst du den in extra Anführungszeichen stecken also 'LIKE 'Ma%'' da dass SQL Statement dann so aussieht LIKE 'Ma%'


Orothred - Fr 28.09.07 13:49


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
switch (cBAuswahl.SelectedIndex)
strSQL = "SELECT * FROM Adressen WHERE Name LIKE @Eingabe%";
break;
OleDbCommand cmd = new OleDbCommand(strSQL, con);
cmd.Parameters.Add("@Eingabe", OleDbType.Variant, 50);
cmd.Parameters["@Eingabe"].Value = txtSuchtext.Text; ;
OleDbDataReader dr = cmd.ExecuteReader();


danach springt er in die catch-Methode und bringt den Fehler

(ich hoff das is jetz das was du haben wolltest ^^)

Moderiert von user profile iconraziel: Code- durch C#-Tags ersetzt


Alpha_Wolf - Fr 28.09.07 13:59

Ich habe noch nicht oft in C# mit DBs gearbeitet da ich dort mehr technisches entwickle.

Aber du musst innerhalb des Statements Strings in Anführungsszeichen stecken..

EDIT:

Du kannst das Statement auch mal Manuell absetzen.. weiss ja nicht welche DB du hast.. aber normalerweise hat jede DB einen Bereich in dem man SQL-Statements testen kann.


Orothred - Fr 28.09.07 14:04

ja, das is das problem. @Eingabe is ja kein String, sondern ein Parameter.


C#-Quelltext
1:
2:
cmd.Parameters.Add("@Eingabe", OleDbType.Variant, 50);
cmd.Parameters["@Eingabe"].Value = txtSuchtext.Text;


Moderiert von user profile iconraziel: Code- durch C#-Tags ersetzt


Alpha_Wolf - Fr 28.09.07 14:11

Dann häng es doch an den Stringwert:


C#-Quelltext
1:
txtSuchtext.Text + "%";                    


Am besten ist es eine Konstante zu deklarieren die dann den Wildcard enthält.

Oder du schreibst eine extra Funktion in der du Wildcards an einen String (oder vor einen String) hängst.

Oder aber du schreibst es auf deine Oberfläche als Filtereigenschaft.. also das der Benutzer selbst das % als Wildcard benutzt dort wo es braucht.. Weil vieleicht möchte er ja auch mal nach alle Namen die mit "en" enden suchen. (Du kannst natürlich auch automatisch vorne und hinten eine Wildcard setzen)


Orothred - Fr 28.09.07 14:20

ok, jetzt funktioniert. vielen dank für hilfe und geduld ^^


Alpha_Wolf - Fr 28.09.07 14:28

Kein Problem :)

Bitte poste doch noch deine funktionierende Funktion damit andere wissen wies aussehen soll.

Viel Spass noch.


Orothred - Fr 28.09.07 14:31

gerne.

SQL-Befehl:

C#-Quelltext
1:
strSQL = "SELECT * FROM Adressen WHERE Name LIKE @Eingabe ";                    


Parameterdefinition:

C#-Quelltext
1:
2:
cmd.Parameters.Add("@Eingabe", OleDbType.Variant, 50);
cmd.Parameters["@Eingabe"].Value ="%"+txtSuchtext.Text+"%";


Moderiert von user profile iconraziel: Code- durch C#-Tags ersetzt