Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Suche mit Filterfunktion in einem DataGridView


mo0n_ - Di 24.01.12 13:09
Titel: Suche mit Filterfunktion in einem DataGridView
Hallol liebe Community.
Ich habe in einem DataGridView Inhalte einer aus einer Tabelle bestehenden Datenbank anzeigen lassen.
Nun möchte ich eine Suchefunktion mit Filter hinzufügen.

Hier mein bisheriger Sourcecode:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
            string suche = textBox1.Text;
       
            OleDbConnection myConnection = new OleDbConnection(Settings.Default.Datenbank1ConnectionString);
            myConnection.Open();

            string mycommand = "SELECT * FROM Kontakte WHERE Firma ="+suche;

            OleDbCommand cmd = new OleDbCommand(mycommand, myConnection);
            OleDbDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                MessageBox.Show("Datensatzgefunden!");

            }
            reader.Close();

            myConnection.Close();

Bisher wollte ich nur erreichen, dass bei einem Abfragetreffer eine Messagebox aufpoppt.
Allerdings öffnet sich nur die folgende Fehlermeldung:

Für mindestens einen Parameter wurde kein Wert angegeben

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Di 24.01.12 13:42

Hallo,

deine SQL-Abfrage ist falsch. Benutze SQL-Parameter, s.a. [Artikelserie] SQL: Parameter von Befehlen [http://www.mycsharp.de/wbb2/thread.php?threadid=66704]


mo0n_ - Di 24.01.12 15:40

hallo Th69,
danke für deine Antwort.
Leider bin ich bis dato noch nicht viel weiter gekommen.
Könntest du mir ein Beispiel einer funktionierenden SQL Abfrage posten?
das wäre super nett.
Danke im Vorraus.

----------------------------------------------------------------------------

ARGH. Meine Güte was für ein dämlicher Fehler!
danke TH69.
Es hat funktioniert !
2 Stunden sinnloses rumschrauben für 2 ' ....


Th69 - Di 24.01.12 16:13

Hallo mo0n_,

ich hoffe, du hast jetzt nicht einfach die Anführungsstriche in den SQL-String geschrieben (Stichwort: SQL-Injection [http://de.wikipedia.org/wiki/SQL-Injection])?

Darum habe ich dir ja explizit den Link auf die SQL-Parameter gegeben, denn dies ist der einzig richtige Weg.
Ansonsten probiere mal "mo0n_'s Firma" einzugeben...


mo0n_ - Di 24.01.12 16:34


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:
                string suche = textBox1.Text;

                OleDbConnection myConnection = new OleDbConnection(Settings.Default.Datenbank1ConnectionString);
                myConnection.Open();

                string mycommand = "SELECT * FROM Kontakte WHERE Firma ='" + textBox1.Text + "'";
                

                OleDbCommand cmd = new OleDbCommand(mycommand, myConnection);
                OleDbDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    string row = "";
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        row += reader.GetValue(i).ToString() + ", ";
                        
                    }
                                     
                }
                reader.Close();

                myConnection.Close();


das ist mein jetziger sc.
So hatte es funktioniert

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Di 24.01.12 17:46

Ich glaube, ich rede gegen die Wand :gruebel:


mats74 - Di 24.01.12 18:02

... das sieht ganz so aus :wink: .
Also von meiner Seite ein Dankeschön für deine Hinweise.
In diesem Zusammenhang habe ich in unseren Codes noch einige versteckte Sicherheitslücken entdeckt, die mir vorher nie aufgefallen sind.
Einige Codeelemente unserer internen Programme sind nie auf Sicherheitslücken geprüft worden.
Da ist mir also ein :idea: aufgegangen (und viel Arbeit) ...


mo0n_ - Di 24.01.12 18:03

naah. habe nochmal drüber nachgedacht un bemerkt, dass man es viel einfacher lösen kann.

poste meine endlösung nochmal für alle nicht-genies:


C#-Quelltext
1:
kontakteBindingSource.Filter=string.Format("Firma like '%"+textBox1.Text+"%'");                    


Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Di 24.01.12 18:28

Hallo,

auch hierbei kann dir ein Anführungsstrich (') im Suchtext Probleme bereiten...

Und demnächst bitte selber hier im Forum die C#-Tags um deinen Sourcecode setzen!


Parn - Fr 20.04.12 08:51

Hallo,
ich habe noch eine Frage zu diesem etwas älteren Thema.
Vielleicht weiß ja einer grade ne schnelle Antwort.

Der Code (der bekanntlich Probleme mit den ' bereiten kann) filtert ja nur für eine Spalte:


C#-Quelltext
1:
kontakteBindingSource.Filter=string.Format("Firma like '%"+textBox1.Text+"%'");                    


wenn man jetzt aber nicht nur in der Spalte "Firma" suchen, sondern mit der gleichen TextBox auch sie danebenliegenden Spalten, zB "Ort" filtern möchte, so dass bei folgender Tabelle...

Firma Ort

Huber AG Karlsruhe
Karolinger München
Weinstein Happenbach

mit der Filtereingabe "Karl" die ersten beiden Einträge angezeigt werden.

I'm looking forward to your replies!
greetings Parn


Th69 - Fr 20.04.12 09:37

Hallo Parn,

unter DataColumn.Expression [http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression%28v=vs.100%29.aspx] ist beschrieben, welche Syntax der Filter annimmt.

In deinem Beispiel z.B. mittels "OR":

C#-Quelltext
1:
kontakteBindingSource.Filter = String.Format("Firma LIKE '%"+textBox1.Text+"%'" + " OR " + "Ort LIKE '%"+textBox1.Text+"%'");                    


P.S. Die deutsche Hilfe dazu ist leider nicht so zu empfehlen (da einige Schlüsselwörter übersetzt wurden - obwohl das keinen Sinn macht, s.a. mein Beitrag zu myCSharp.de - bindingSource.Filter --> Filtern nach Spalten die keinen Eintrag enthalten [http://www.mycsharp.de/wbb2/thread.php?postid=3714110#post3714110]).


Parn - Mo 23.04.12 11:31

Vielen Dank!
das war genau, was ich wissen wollte.
mfg Parn