Autor Beitrag
Orothred
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86


C# (VS 2005)
BeitragVerfasst: Fr 28.09.07 12:58 
Hi!

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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: 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 www.w3schools.com/sql/default.asp

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
Orothred Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86


C# (VS 2005)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: 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 ;)

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
Orothred Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86


C# (VS 2005)
BeitragVerfasst: Fr 28.09.07 13:37 
was genau meinst du jetz damit? Code hab ich doch oben schon gepostet ^^
Alpha_Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Fr 28.09.07 13:40 
sorry doppelpost.. bitte löschen

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.


Zuletzt bearbeitet von Alpha_Wolf am Fr 28.09.07 13:51, insgesamt 1-mal bearbeitet
Alpha_Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: 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%'

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.


Zuletzt bearbeitet von Alpha_Wolf am Fr 28.09.07 13:50, insgesamt 3-mal bearbeitet
Orothred Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86


C# (VS 2005)
BeitragVerfasst: Fr 28.09.07 13:49 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: 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.

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
Orothred Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86


C# (VS 2005)
BeitragVerfasst: Fr 28.09.07 14:04 
ja, das is das problem. @Eingabe is ja kein String, sondern ein Parameter.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Fr 28.09.07 14:11 
Dann häng es doch an den Stringwert:

ausblenden 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)

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
Orothred Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86


C# (VS 2005)
BeitragVerfasst: Fr 28.09.07 14:20 
ok, jetzt funktioniert. vielen dank für hilfe und geduld ^^
Alpha_Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Fr 28.09.07 14:28 
Kein Problem :)

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

Viel Spass noch.

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
Orothred Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86


C# (VS 2005)
BeitragVerfasst: Fr 28.09.07 14:31 
gerne.

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


Parameterdefinition:
ausblenden 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